Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp
- Committer:
- joshdavy
- Date:
- 2019-05-06
- Revision:
- 10:58cf89dd878c
- Parent:
- 9:96969b1c6bde
- Child:
- 11:db27d3838514
File content as of revision 10:58cf89dd878c:
/*
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"
////// Constants //////
// The tick times for both timers
const int MUSIC_TICK_TIME = 100; //100 microseconds
const int GAME_TICK_TIME = 100; // 100 millieconds
/////////////// objects ///////////////
N5110 lcd(PTC9,PTC0,PTC7,PTD2,PTD1,PTC11);
Gamepad pad;
Game game;
Music music;
Timer game_timer;
Timer music_timer;
///////////// 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(sound_data,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)) {
        lcd.setContrast(pad.read_pot());
        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 START button is pressed
    while (!pad.check_event(Gamepad::START_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();  // TRY it without this
}
void menu()
{
    // Main Menu
    int menu_option = 0;
    while ( !pad.check_event(Gamepad::A_PRESSED) ) {
        //Allow adjusting of the contrast
        lcd.setContrast(pad.read_pot());
        // Read the joystick value and relate it to a menu option
        if (pad.get_coord().y > 0.7f) {
            menu_option = 0;
        }
        if (pad.get_coord().y < -0.7f) {
            menu_option = 1;
        }
        // Draws main menu background image
        lcd.drawSprite(0,0,48,84, (int *) menuScreen);
        // Draws the arrow on the menu
        if (menu_option == 0) {
            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 == 1) {
        how_to_play();
    }
}
int main()
{
    init();     // initialise and then display welcome screen...
    welcome();  // waiting for the user to start
    menu();     // main menu
    // Resets and starts the timers responsible for the game and music loops
    game_timer.reset();
    music_timer.reset();
    game_timer.start();
    music_timer.start();
    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) {
            // Allows adjusting on the contrast
            lcd.setContrast(pad.read_pot());
            // Main update states
            game.update(pad);
            game.draw(lcd);
            // If the games won goes to the you_win screen.
            if (game.game_won()) {
                you_win();
            }
            game_timer.reset();
        }
        // 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();
        }
    }
}