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.
Dependencies: mbed Gamepad N5110 mbed-rtos
Diff: main.cpp
- Revision:
- 0:d9cf94b41df3
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Thu May 09 09:49:35 2019 +0000 @@ -0,0 +1,446 @@ +/* +ELEC2645 Embedded Systems Project +School of Electronic & Electrical Engineering +University of Leeds +Name: Rex Roshan Raj +Username: el17rrs +Student ID Number: 201184290 +Start Date: 25/03/2019 +End Date: 9/05/2019 +*/ + +#include "mbed.h" +#include "N5110.h" +#include "Gamepad.h" +#include "Instruction.h" +#include "Spacecraft.h" +#include "GameEngine.h" +#include "MiniGame.h" +#include "Solar.h" +#include "Music.h" +#include "rtos.h" + +/** @file main.cpp + * @brief Contains the main code of the program. + */ + +// Structs +struct UserInput { + Direction d; + float mag; +}; + +// enum state for MainPage +enum MainPage { TitleScreen, Menu, Mini_Game, Mission }; + +// enum state for MiniState +enum MiniState { Dead, Alive }; + +// enum state for Mission state +enum MissionState {Mission1,Mission1Pass,Mission1Fail,Mission2,Mission2Pass,Mission2Fail,Mission3,Mission3Pass,Mission3Fail,Congratulations }; + +// Objects +N5110 lcd(PTC9,PTC0,PTC7,PTD2,PTD1,PTC11); // K64F - pwr from 3V3 +Gamepad pad; +Music play; +Instruction instruct; +Thread thread; +Spacecraft game; +GameEngine shoot; +MiniGame mini; + + +// Prototypes +void init(); +void mini_init(); +void welcome(); +void mini_render(); +void render_nothing(); +void render(); +void render2(); +void render3(); +void mini_rules(); +void intro(); +void instruction(); +//void intro_song(); + +bool end = false; +bool finish = false; +bool music_end = false; + + +int main() +{ + int fps = 8; // Set the frames per second = 8 + lcd.setContrast(0.4); // 0.4 appears to be a good starting point + init(); // Initialise all the parameters in GameEngine + + MainPage currentState = TitleScreen; // Initial state of MainPage + MissionState currentMission = Mission3; // Initial state of MissionState + MiniState currentMini = Alive; // Initial state of MiniState + + + while(1) { + switch(currentState){ + case TitleScreen: + // Draws the Title Screen + lcd.clear(); + lcd.refresh(); + thread.start(welcome); + intro(); + thread.terminate(); + // instruction page for the game + render_nothing(); + wait(1.0f/fps); + currentState = Menu; + break; + case Menu: + // Draws the Menu Page + lcd.clear(); + lcd.drawSprite(4,7,9,9, (int*)x_button); + lcd.drawSprite(4,23,9,9, (int*)y_button); + lcd.printString("Mission",20,1); + lcd.printString("Mini Game",20,3); + lcd.refresh(); + if (pad.check_event(Gamepad::X_PRESSED) == true){ + currentState = Mission; + end = false; + instruction(); + } else if (pad.check_event(Gamepad::Y_PRESSED) == true){ + currentState = Mini_Game; + finish = false; + mini_rules(); + } + break; + + case Mission: + // instruction page for the game + currentMission = Mission3; + while(!end){ + switch(currentMission){ + case Mission1: + shoot.read_input(pad); + shoot.update_mission_one(pad,lcd); + render(); + wait(1.0f/fps); + if(shoot.get_game_stage() == 1){ + currentMission = Mission1Fail; + break; + } + else if(shoot.get_game_stage() == 2){ + currentMission = Mission1Pass; + break; + }else { + currentMission = Mission1; + } + break; + case Mission1Fail: + lcd.clear(); + lcd.drawSprite(6,5,42,73,(int *)mission_fail); + lcd.drawSprite(51,11,7,19,(int *)m_one); + lcd.refresh(); + play.mission_fail(pad); + if (pad.check_event(Gamepad::B_PRESSED) == true){ + currentMission = Mission1; + shoot.restart_game_stage(); + init(); + } + break; + case Mission1Pass: + lcd.clear(); + lcd.drawSprite(0,0,48,84,(int *)mission_pass); + lcd.drawSprite(51,11,7,19,(int *)m_one); + lcd.refresh(); + play.mission_success(pad); + if (pad.check_event(Gamepad::A_PRESSED) == true){ + currentMission = Mission2; + shoot.restart_game_stage(); + init(); + } + break; + case Mission2: + shoot.read_input(pad); + shoot.update_mission_two(pad,lcd); + render2(); + wait(1.0f/fps); + if(shoot.get_game_stage() == 3 ){ + currentMission = Mission2Fail; + } + if(shoot.get_game_stage() == 4){ + currentMission = Mission2Pass; + } + break; + case Mission2Fail: + lcd.clear(); + lcd.drawSprite(6,5,42,73,(int *)mission_fail); + lcd.drawSprite(51,12,5,18,(int *)m_two); + lcd.refresh(); + play.mission_fail(pad); + if (pad.check_event(Gamepad::B_PRESSED) == true){ + currentMission = Mission1; + shoot.restart_game_stage(); + init(); + } + break; + case Mission2Pass: + lcd.clear(); + lcd.drawSprite(0,0,48,84,(int *)mission_pass); + lcd.drawSprite(51,12,5,18,(int *)m_two); + lcd.refresh(); + play.mission_success(pad); + if (pad.check_event(Gamepad::A_PRESSED) == true){ + currentMission = Mission3; + shoot.restart_game_stage(); + init(); + } + break; + case Mission3: + shoot.read_input(pad); + shoot.update_mission_three(pad,lcd); + render3(); + wait(1.0f/fps); + if(shoot.get_game_stage() == 5 ){ + currentMission = Mission3Fail; + } + if(shoot.get_game_stage() == 6){ + currentMission = Mission3Pass; + } + break; + case Mission3Fail: + lcd.clear(); + lcd.drawSprite(6,5,42,73,(int *)mission_fail); + lcd.drawSprite(48,12,5,29,(int *)m_three); + lcd.refresh(); + play.mission_fail(pad); + if (pad.check_event(Gamepad::B_PRESSED) == true){ + currentMission = Mission1; + shoot.restart_game_stage(); + init(); + } + break; + case Mission3Pass: + lcd.clear(); + lcd.drawSprite(0,0,48,84,(int *)mission_pass); + lcd.drawSprite(48,12,5,29,(int *)m_three); + lcd.refresh(); + play.mission_success(pad); + if (pad.check_event(Gamepad::A_PRESSED) == true){ + currentMission = Congratulations; + } + break; + case Congratulations: + for(int i = 0; i < 3; i++){ + lcd.clear(); + lcd.drawSprite(0,0,48,84,(int *) congrats); + lcd.drawSprite(0,23,25,84,(int *)party_popper); + lcd.refresh(); + wait(0.5); + lcd.clear(); + lcd.drawSprite(0,0,48,84,(int *) congrats); + lcd.refresh(); + wait(0.5); + } + while(pad.check_event(Gamepad::A_PRESSED) == false){ + lcd.clear(); + lcd.drawSprite(0,0,48,84,(int *) congrats); + lcd.drawSprite(25,28,13,36,(int *) exit1); + lcd.refresh(); + if (pad.check_event(Gamepad::A_PRESSED) == true){ + end = true; + music_end = false; + break; + } + } + break; + } + } + currentState = TitleScreen; + break; + + case Mini_Game: + mini_init(); + currentMini = Alive; + while(!finish) { + switch(currentMini){ + case Alive: + mini.read_input(pad); + mini.update_minigame(pad,lcd); + mini_render(); + wait(1.0f/fps); + if(mini.get_game_stage() == 12){ + currentMini = Dead; + break; + } + break; + + case Dead: + lcd.clear(); + lcd.printString(" Your ",0,1); + lcd.printString(" Spacecraft",4,2); + lcd.printString(" have fallen",0,3); + lcd.drawSprite(72,39,9,9, (int*)x_button); + mini.draw_score(lcd); + lcd.refresh(); + wait(1.0f/fps); + if (pad.check_event(Gamepad::X_PRESSED) == true){ + finish = true; + music_end = false; + } + break; + } + } + currentState = TitleScreen; + break; + } + } +} + +void init(){ + // need to initialise LCD,Gamepad and the Game + lcd.init(); + pad.init(); + //Initialise (x pos of player spacecraft, y pos of player spacecraft, x pos of enemy stage 1,y pos of enemy stage 1, x pos of enemy1 stage 2, y pos of enemy1 stage 2, x pos of enemy2 stage 2, y pos of enemy2 stage 2, x pos of boss stage 3, y pos of boss stage 3, beam size 1, beam size 2, motion speed) + shoot.init(WIDTH/12,HEIGHT/2-5,16,4,12,10,20,11,3,2,4); + +} + +void mini_init(){ + // need to initialise LCD,Gamepad and the Game + lcd.init(); + pad.init(); + //Initialise (x pos of player spacecraft, y pos of player spacecraft, beam size 1) + mini.init(WIDTH/12,HEIGHT/2-5,3,66,0,36,30); + +} + + +void render() +{ + // clear screen, re-draw and refresh + // Mission 1 + lcd.clear(); + shoot.draw_mission_one(pad,lcd); + lcd.refresh(); +} + +void render2() +{ + // clear screen, re-draw and refresh + // Mission 2 + lcd.clear(); + shoot.draw_mission_two(pad,lcd); + lcd.refresh(); +} + +void render3() +{ + // clear screen, re-draw and refresh + // Mission 3 + lcd.clear(); + shoot.draw_mission_three(pad,lcd); + lcd.refresh(); +} + +void welcome() +{ + + // draws the sprites until the Start button is pressed + + while ( pad.check_event(Gamepad::START_PRESSED) == false) { + if(pad.check_event(Gamepad::START_PRESSED) == true){break;} + pad.leds_on(); + lcd.drawSprite(6,0,48,71,(int *)screen); + lcd.drawSprite(21,43,5,40,(int *)start); + lcd.refresh(); + Thread::wait(800); + if(pad.check_event(Gamepad::START_PRESSED) == true){break;} + pad.leds_off(); + lcd.drawSprite(6,0,48,71,(int *)screen); + lcd.refresh(); + Thread::wait(800); + if(pad.check_event(Gamepad::START_PRESSED) == true){break;} + + } + pad.leds_off(); +} +/*void welcome() +{ + + // draws the sprites until the Start button is pressed + + while (!music_end) { + if(pad.check_event(Gamepad::START_PRESSED) == true){music_end = true; break;} + pad.leds_on(); + lcd.drawSprite(6,0,48,71,(int *)screen); + lcd.drawSprite(21,43,5,40,(int *)start); + lcd.refresh(); + wait(0.8); + if(pad.check_event(Gamepad::START_PRESSED) == true){music_end = true; break;} + pad.leds_off(); + lcd.drawSprite(6,0,48,71,(int *)screen); + lcd.refresh(); + wait(0.8); + if(pad.check_event(Gamepad::START_PRESSED) == true){music_end = true; break;} + + } + pad.leds_off(); +}*/ + + +void intro() +{ + //plays the introduction music for game + play.intro_song(pad); +} + +void instruction() +{ + // clears, draws the instrcution and game rules page and refreshes the page + pad.leds_off(); + lcd.clear(); + instruct.rules(lcd,pad); + lcd.refresh(); + + +} + +void mini_rules() +{ + lcd.clear(); + instruct.mini_rules(lcd,pad); + lcd.refresh(); +} + +void mini_render() +{ + // Mini Game + // clear screen, re-draw and refresh + lcd.clear(); + mini.draw_minigame(pad,lcd); + lcd.refresh(); +} + +void render_nothing() +{ + lcd.clear(); + lcd.refresh(); +} + +/*void intro_song() // introduction song for the game +{ + while(!music_end){ + pad.tone(293.665, 2); + if(music_end == true){break;} // break if start button has been pressed + thread.wait(1000); // thread wait so that two loops can simulatneously run + pad.tone(311.127, 2); + if(music_end == true){break;} + thread.wait(1000); + pad.tone(329.628, 2); + if(music_end == true){break;} + thread.wait(1000); + pad.tone(349.228, 2); + if(music_end == true){break;} + thread.wait(1000); + } +}*/ +