Kern Fowler / Mbed 2 deprecated Donkey_Kong_Game

Dependencies:   mbed

main.cpp

Committer:
Kern_EL17KJTF
Date:
2019-05-07
Revision:
8:421f94b816c4
Parent:
7:ffbc921c20f7
Child:
9:e6832bf222b7

File content as of revision 8:421f94b816c4:

/*
ELEC2645 Embedded Systems Project
School of Electronic & Electrical Engineering
University of Leeds

Name: Kern Fowler
Username: el17kjtf
Student ID Number: 201116686
Date: 19/02/2019
Version: 1.2

*/
#include "main.h"

N5110 lcd(PTC9,PTC0,PTC7,PTD2,PTD1,PTC11);
Gamepad pad; 
Options opt;
Donkey dky;
GameEngine eng;
Barrel barrel;

int fps = 24;
int direction;
int menu_option_pos = 0;
int arrow_pos = 0;

// Game State--------------------------------------------------------------

GameEngine::GameEngine()
{

}

GameEngine::~GameEngine()
{

}

void GameEngine::gameengine_run(Gamepad &pad, N5110 &lcd) {
    wait_ms(250);
   
    while (pad.check_event(Gamepad::BACK_PRESSED) == false) {
        //printf("Game State");
        lcd.clear();
        lcd.printString("Game",0,0);
        dky.donkeykong_movement(pad, lcd);
        barrel.barrel_drop(pad, lcd);
        wait_ms(1.0f/fps);
    }
}


// Donkey -----------
int donkeykong_x = 0;
int donkeykong_y = 32;
int donkey_kong_speed = 25;

Donkey::Donkey()
{

}
Donkey::~Donkey()
{

}

void Donkey::donkeykong_movement(Gamepad &pad, N5110 &lcd) {
    direction = pad.get_direction();
        if (direction == NE || direction == E || direction == SE) {
            donkeykong_x = donkeykong_x + 1;
            lcd.drawSprite(donkeykong_x,donkeykong_y,16,16,(int *)game_dk_walking_right_1);
            wait_ms(donkey_kong_speed);
        } 
        else if (direction == NW || direction == W || direction == SW) {
            donkeykong_x = donkeykong_x - 1;
            lcd.drawSprite(donkeykong_x,donkeykong_y,16,16,(int *)game_dk_walking_left_1);
            wait_ms(donkey_kong_speed);
        } 
        else {
            lcd.drawSprite(donkeykong_x,donkeykong_y,16,16,(int *)game_dk_stationary);
        }
        lcd.refresh();
        if (donkeykong_x > 68) {
            donkeykong_x = 68;
        }
        if (donkeykong_x < 0) {
            donkeykong_x = 0;
        }
}
// Barrel -----------
int barrel_x = 0;
int barrel_y = 0;
int barrel_speed = 0;
int barrel_min = 0;
int barrel_max = 76;

Barrel::Barrel()
{

}

Barrel::~Barrel()
{

}

void Barrel::barrel_drop(Gamepad &pad, N5110 &lcd) {
    barrel_x = rand() % (barrel_max + 1 - barrel_min) + barrel_min;
    lcd.drawSprite(barrel_x,barrel_y,4,8,(int *)game_barrel);
    lcd.refresh();
}

// Banana -----------

// Controls State----------------------------------------------------------
void controls_run() {
    wait_ms(250);

    while (pad.check_event(Gamepad::BACK_PRESSED) == false) {
        //printf("Control State");
        lcd.clear();
        lcd.printString("Controls",19,0);
        lcd.refresh();
        wait_ms(1.0f/fps);
    }
}

// Instructions State------------------------------------------------------
void instructions_run() {
    wait_ms(250);

    while (pad.check_event(Gamepad::BACK_PRESSED) == false) {
        //printf("Instructions State");
        lcd.clear();
        lcd.printString("Instructions",7,0);
        lcd.refresh();
        wait_ms(1.0f/fps);
    }
}

// Options State-----------------------------------------------------------
float opt_brightness = 0.5;
float opt_contrast = 0.396;
int opt_volume = 1;

Options::Options()
{

}

Options::~Options()
{

}

void Options::options_run(Gamepad &pad, N5110 &lcd) {
    wait_ms(250);
    while (pad.check_event(Gamepad::BACK_PRESSED) == false) {
        //printf("Options State");
        lcd.clear();
        lcd.printString("Options",21,0);
        options_brightness(pad, lcd);
        options_contrast(pad, lcd);
        options_volume(pad, lcd);
        lcd.refresh();
        wait_ms(1.0f/fps);
    }
}

void Options::options_brightness(Gamepad &pad, N5110 &lcd) {
    if (pad.check_event(Gamepad::B_PRESSED) == true) {
        opt_brightness = 0;
    }
    if (pad.check_event(Gamepad::A_PRESSED) == true) {
        opt_brightness = 0.5;
    }
    lcd.setBrightness(opt_brightness);
    lcd.printString("A/B = BackLite",0,2);
}

void Options::options_contrast(Gamepad &pad, N5110 &lcd) {
    opt_contrast = pad.read_pot();
    lcd.setContrast(opt_contrast);
    lcd.printString("Pot = Contrast",0,3);
    printf("Contrast = %f", opt_contrast);
}

void Options::options_volume(Gamepad &pad, N5110 &lcd) {
    if (pad.check_event(Gamepad::Y_PRESSED) == true) {
        opt_volume = 0;
    }
    if (pad.check_event(Gamepad::X_PRESSED) == true) {
        opt_volume = 1;
        pad.tone(2400, 0.2);
        wait_ms(200);
        pad.tone(2400, 0.2);
        wait_ms(200);
        pad.tone(2400, 0.2);
    }
    lcd.printString("X/Y = Volume",0,4);
    if (opt_volume == 0) {
        lcd.printString("Off",36,5);
    } else {
        lcd.printString("On",36,5);
    }
    
}

// High Score State--------------------------------------------------------
void high_scores_run() {
    while (pad.check_event(Gamepad::BACK_PRESSED) == false) {
        //printf("High Score State");
        lcd.clear();
        lcd.printString("High Scores",12,0);
        lcd.refresh();
        wait_ms(1.0f/fps);
    }
}

// Main Menu --------------------------------------------------------------
int main() {
    init();  // initialise peripherals
    welcome();  // display welcome message
 
    while(1) {  // infinite loop
    arrow_location();
    print_menu();  // this re-prints the menu at the start of every loop
    arrow_select();
    wait_ms(1.0f/fps);
    }
}
 
void init() {
    // initialise LCD
    lcd.init();
    // initialise Gamepad
    pad.init();
    wait(2.5);
}

void arrow_location() {
    direction  = pad.get_direction();
    if (direction == N) {
        menu_option_pos = menu_option_pos - 1;
        // printf("North Pressed");
        wait_ms(250);
    }
    if (direction == S) {
        menu_option_pos = menu_option_pos + 1;
        // printf("South Pressed");
        wait_ms(250);
    }
    if (menu_option_pos > 4) {
        menu_option_pos = 0;
    }
    if (menu_option_pos < 0) {
        menu_option_pos = 4;
    }
    arrow_pos = 8 + (menu_option_pos * 8);
    // printf("Option Num = %d", menu_option_pos)
}

void arrow_select() {
    if (pad.check_event(Gamepad::A_PRESSED) == true) {
        if (menu_option_pos == 0) {
            // printf("GameEngine");
            eng.gameengine_run(pad, lcd);
        }
        if (menu_option_pos == 1) {
            // printf("Controls");
            controls_run();
        }
        if (menu_option_pos == 2) {
            // printf("Instructions");
            instructions_run();
        }
        if (menu_option_pos == 3) {
            // printf("Options");
            opt.options_run(pad, lcd);
        }
        if (menu_option_pos == 4) {
            // printf("High Scores");
            high_scores_run();
        }
    }
}


void print_menu() {
    lcd.clear();
    lcd.printString("Main Menu",19,0);
    lcd.printString("Start Game",8,1);
    lcd.printString("Controls",8,2);
    lcd.printString("Instructions",8,3);
    lcd.printString("Options",8,4);
    lcd.printString("High Scores",8,5);
    lcd.drawSprite(0,arrow_pos,7,7,(int *)menu_arrow);
    lcd.refresh();
}
 
void welcome() {
    lcd.clear();
    lcd.drawSprite(24,0,36,34,(int *)menu_dk_face); 
    lcd.printString("  Donkey Kong",0,5);
    lcd.refresh();
    wait(1.0); //edit back to longer
    lcd.clear();
    lcd.printString("  Created",0,0);
    lcd.printString("  By",0,1);
    lcd.printString("  Kern Fowler",0,3);
    lcd.printString("  201116686",0,4);
    lcd.refresh();
    wait(1.0);
}