Josh Davy / Mbed OS Flip_OS_5

Dependencies:   el17jd

main.cpp

Committer:
joshdavy
Date:
2019-04-24
Revision:
9:96969b1c6bde
Parent:
8:21b6d4dbce44
Child:
10:58cf89dd878c

File content as of revision 9:96969b1c6bde:

/*
ELEC2645 Embedded Systems Project
School of Electronic & Electrical Engineering
University of Leeds
Name: Joshua Davy
Username: el17jd
Student ID Number: 201148379
Date: 12/03/2019
*/


///////// pre-processor directives ////////
#include "mbed.h"
#include "Gamepad.h"
#include "N5110.h"
#include "Sprite.h"
#include "Game.h"
#include "Music.h"
#include "SoundData.h"
#include "SplashScreen.h"
#include "MenuScreen.h"
#include "WinScreen.h"

Timer game_timer;
Timer music_timer;

////// Constants //////




/////////////// objects ///////////////
N5110 lcd(PTC9,PTC0,PTC7,PTD2,PTD1,PTC11);
Gamepad pad;
Game game;
Music music;



///////////// prototypes ///////////////
void init();
void welcome();
void menu();
void how_to_play();
void you_win();
int main();
// initialies all classes and libraries
void init()

{

    // need to initialise LCD and Gamepad
    lcd.init();
    lcd.setContrast(0.4);
    pad.init();
    // Initalises Music with data from SoundData.h and game
    music.init(data1,NUM_ELEMENTS);
    game.init();

}
// simple splash screen displayed on start-up
void welcome()
{

    // Draws Splash Screen
    lcd.drawSprite(0,0,48,84, (int *) splashScreen);
    lcd.refresh();

    // wait flashing LEDs until start button is pressed
    while (!pad.check_event(Gamepad::START_PRESSED)) {
        pad.leds_on();
        wait(0.1);
        pad.leds_off();
        wait(0.1);
    }

}

void you_win()
{

    // Draws Win Screen
    lcd.drawSprite(0,0,48,84, (int *) winScreen);
    lcd.refresh();

    // wait flashing LEDs until A button is pressed
    while (!pad.check_event(Gamepad::A_PRESSED)) {
        pad.leds_on();
        wait(0.1);
        pad.leds_off();
        wait(0.1);
    }
    
    main();

}


void how_to_play()
{
    // Gives instructions on how to play
    lcd.clear();
    lcd.printString("Use the joy -",0,0);
    lcd.printString("stick to move.",0,1);
    lcd.printString("Press A to ",0,2);
    lcd.printString("flip gravity.",0,3);
    lcd.printString("Get the flags",0,4);
    lcd.printString("to win!",0,5);
    lcd.refresh();
    
    // Loop until A button pressed
    while ( !pad.check_event(Gamepad::A_PRESSED) ) {}
    
    // Return to menu
    menu();

}

void menu()
{
    // Main Menu
    int menu_option = 1;
    while ( !pad.check_event(Gamepad::A_PRESSED) ) {
          
       // Read the joystick value and relate it to a menu option        
        if (pad.get_coord().y > 0.7f) {
            menu_option = 1;
        }
        if (pad.get_coord().y < -0.7f) {
            menu_option = 0;
        }
        // Draws main menu background image
        lcd.drawSprite(0,0,48,84, (int *) menuScreen);
        
        // Draws the arrow on the menu
        if (menu_option == 1) {
            lcd.drawSprite(40,10,7,4, (int *)  arrow);
        } else {
            lcd.drawSprite(40,25,7,4, (int *)  arrow);
        }
        
        lcd.refresh();

    }
    // If the "how to play" option is selected run its display function
    if (menu_option == 0) {
        how_to_play();
    }
}


int main()
{

    init();     // initialise and then display welcome screen...
    welcome();  // waiting for the user to start
    menu();     // main menu

    // game loop - read input, update the game state and render the display

    game.init();
    
    // Resets and starts the timers responsible for the game and music loop
    game_timer.reset();
    music_timer.reset();
    game_timer.start();
    music_timer.start();
    
    // The tick times for both timers
    const int MUSIC_TICK_TIME = 100; //125 microseconds
    const int GAME_TICK_TIME = 100; // 100 millieconds
    
    while (true) {
        
        // If the game timer is above the game tick time then main game process
        // is ran 
        if (game_timer.read_ms() > GAME_TICK_TIME) {
            game.update(pad);
            game.draw(lcd);
            game_timer.reset();
            if (game.game_won()) {
                you_win();
            }
        }
        
        // If the music timer is above the music tick time update the music object
        if (music_timer.read_us() > MUSIC_TICK_TIME) {
                music.play_next();
                music_timer.reset();
            }



        }
    }