Hugo Hu / Mbed 2 deprecated BRAVEHEART

Dependencies:   mbed N5110 ShiftReg PinDetect

Committer:
hugohu
Date:
Thu Mar 25 03:43:10 2021 +0000
Revision:
19:89c3eeb3761b
Parent:
18:709ea375b0df
A more complex game in developing.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Siriagus 5:100d960fc6d5 1 #include "MainMenu.h"
Siriagus 5:100d960fc6d5 2
Siriagus 17:d6a3b29cab31 3 /// @file MainMenu.cpp
Siriagus 17:d6a3b29cab31 4
Siriagus 10:f2488a0ecab7 5 /// States for the Main Menu's internal finite state machine
Siriagus 6:edb48de563a9 6 enum MenuState {SELECT_PLAY, SELECT_HIGHSCORES, SELECT_CONTROLS, LOAD_GAME, HIGHSCORES, CONTROLS};
Siriagus 10:f2488a0ecab7 7
Siriagus 10:f2488a0ecab7 8 /// Static variables for internal fsm.
Siriagus 10:f2488a0ecab7 9
Siriagus 6:edb48de563a9 10 const int MainMenu::MENU_FSM[6][3] = {
Siriagus 6:edb48de563a9 11 {LOAD_GAME, SELECT_PLAY, SELECT_HIGHSCORES}, // State: SELECT_PLAY
Siriagus 6:edb48de563a9 12 {HIGHSCORES, SELECT_HIGHSCORES, SELECT_CONTROLS}, // State: SELECT_HIGHSCORES
Siriagus 6:edb48de563a9 13 {CONTROLS, SELECT_CONTROLS, SELECT_PLAY}, // State: SELECT_CONTROLS
Siriagus 6:edb48de563a9 14 {LOAD_GAME, LOAD_GAME, LOAD_GAME}, // State: LOAD_GAME
Siriagus 6:edb48de563a9 15 {SELECT_HIGHSCORES, SELECT_HIGHSCORES, HIGHSCORES}, // State: HIGHSCORES
Siriagus 6:edb48de563a9 16 {SELECT_CONTROLS, SELECT_CONTROLS, CONTROLS} // State: CONTROLS
Siriagus 6:edb48de563a9 17 };
Siriagus 6:edb48de563a9 18
Siriagus 10:f2488a0ecab7 19 int MainMenu::currentState; /// Current state for the state machine
Siriagus 6:edb48de563a9 20
Siriagus 6:edb48de563a9 21 // Callback functions (needs to be static)
Siriagus 6:edb48de563a9 22 void MainMenu::btnAPress()
Siriagus 6:edb48de563a9 23 {
Siriagus 6:edb48de563a9 24 currentState = MENU_FSM[currentState][0];
Siriagus 6:edb48de563a9 25 }
Siriagus 6:edb48de563a9 26
Siriagus 6:edb48de563a9 27 void MainMenu::btnBPress()
Siriagus 6:edb48de563a9 28 {
Siriagus 6:edb48de563a9 29 currentState = MENU_FSM[currentState][1];
Siriagus 6:edb48de563a9 30 }
Siriagus 6:edb48de563a9 31
Siriagus 6:edb48de563a9 32 void MainMenu::btnCPress()
Siriagus 6:edb48de563a9 33 {
Siriagus 6:edb48de563a9 34 currentState = MENU_FSM[currentState][2];
Siriagus 6:edb48de563a9 35 }
Siriagus 6:edb48de563a9 36
hugohu 19:89c3eeb3761b 37 void MainMenu::btnDPress()
hugohu 19:89c3eeb3761b 38 {
hugohu 19:89c3eeb3761b 39 currentState = MENU_FSM[currentState][2];
hugohu 19:89c3eeb3761b 40 }
hugohu 19:89c3eeb3761b 41
Siriagus 5:100d960fc6d5 42 void MainMenu::init()
Siriagus 5:100d960fc6d5 43 {
Siriagus 6:edb48de563a9 44 MainMenu::currentState = SELECT_PLAY;
Siriagus 10:f2488a0ecab7 45 input->addBtnPressInterrupt(Input::ButtonA, &btnAPress);
Siriagus 10:f2488a0ecab7 46 input->addBtnPressInterrupt(Input::ButtonB, &btnBPress);
Siriagus 10:f2488a0ecab7 47 input->addBtnPressInterrupt(Input::ButtonC, &btnCPress);
hugohu 19:89c3eeb3761b 48 input->addBtnPressInterrupt(Input::ButtonD, &btnDPress);
Siriagus 5:100d960fc6d5 49 }
Siriagus 5:100d960fc6d5 50
Siriagus 10:f2488a0ecab7 51 void MainMenu::update(float dt) {} // Does not do anything as program flow is controlled by interrupts, but needs to be defined as it is a virtual function.
Siriagus 5:100d960fc6d5 52
Siriagus 5:100d960fc6d5 53 void MainMenu::render()
Siriagus 13:7ab71c7c311b 54 {
Siriagus 13:7ab71c7c311b 55 for (int i = 0; i < HEIGHT/3; ++i)
Siriagus 13:7ab71c7c311b 56 {
Siriagus 17:d6a3b29cab31 57 drawImage(Image::Pattern3, 0, 3*i); // left border
Siriagus 17:d6a3b29cab31 58 drawImage(Image::Pattern3, (WIDTH-3), 3*i); // right border
Siriagus 13:7ab71c7c311b 59 }
Siriagus 12:8178fad5e660 60
Siriagus 13:7ab71c7c311b 61 for (int j = 0; j < WIDTH/3; ++j)
Siriagus 13:7ab71c7c311b 62 {
Siriagus 17:d6a3b29cab31 63 drawImage(Image::Pattern3, 3 * j, (HEIGHT-3)); // bottom border
Siriagus 17:d6a3b29cab31 64 drawImage(Image::Pattern3, 3 * j, 0); // top border
Siriagus 13:7ab71c7c311b 65 }
Siriagus 13:7ab71c7c311b 66
Siriagus 13:7ab71c7c311b 67 // Check sate
Siriagus 13:7ab71c7c311b 68 int xMargin = 8;
Siriagus 6:edb48de563a9 69 switch (currentState)
Siriagus 6:edb48de563a9 70 {
Siriagus 6:edb48de563a9 71 case SELECT_PLAY:
Siriagus 13:7ab71c7c311b 72 lcd->printString(">Play", xMargin, 1);
Siriagus 13:7ab71c7c311b 73 lcd->printString("High Scores", xMargin, 2);
Siriagus 13:7ab71c7c311b 74 lcd->printString("Controls", xMargin, 3);
Siriagus 6:edb48de563a9 75 break;
Siriagus 6:edb48de563a9 76
Siriagus 6:edb48de563a9 77 case SELECT_HIGHSCORES:
Siriagus 13:7ab71c7c311b 78 lcd->printString("Play", xMargin, 1);
Siriagus 13:7ab71c7c311b 79 lcd->printString(">High Scores", xMargin, 2);
Siriagus 13:7ab71c7c311b 80 lcd->printString("Controls", xMargin, 3);
Siriagus 6:edb48de563a9 81 break;
Siriagus 6:edb48de563a9 82
Siriagus 6:edb48de563a9 83 case SELECT_CONTROLS:
Siriagus 13:7ab71c7c311b 84 lcd->printString("Play", xMargin, 1);
Siriagus 13:7ab71c7c311b 85 lcd->printString("High Scores", xMargin, 2);
Siriagus 13:7ab71c7c311b 86 lcd->printString(">Controls", xMargin, 3);
Siriagus 6:edb48de563a9 87 break;
Siriagus 6:edb48de563a9 88
Siriagus 6:edb48de563a9 89 case HIGHSCORES:
Siriagus 17:d6a3b29cab31 90
Siriagus 17:d6a3b29cab31 91 for (int i = 0; i < 3; ++i)
Siriagus 17:d6a3b29cab31 92 {
Siriagus 17:d6a3b29cab31 93 std::stringstream ss;
Siriagus 17:d6a3b29cab31 94 ss << Global::highscores[i].initials << " " << Global::highscores[i].score;
Siriagus 17:d6a3b29cab31 95 lcd->printString(ss.str().c_str(), xMargin, i+1);
Siriagus 17:d6a3b29cab31 96 }
Siriagus 17:d6a3b29cab31 97
Siriagus 17:d6a3b29cab31 98
Siriagus 13:7ab71c7c311b 99 lcd->printString(">Back", xMargin, 4);
Siriagus 6:edb48de563a9 100 break;
Siriagus 6:edb48de563a9 101
Siriagus 6:edb48de563a9 102 case CONTROLS:
Siriagus 13:7ab71c7c311b 103 lcd->printString("A: Jump", xMargin, 1);
Siriagus 13:7ab71c7c311b 104 lcd->printString("B: Shoot", xMargin, 2);
Siriagus 13:7ab71c7c311b 105 lcd->printString("C: Pause", xMargin, 3);
Siriagus 13:7ab71c7c311b 106 lcd->printString(">Back", xMargin, 4);
Siriagus 6:edb48de563a9 107 break;
Siriagus 6:edb48de563a9 108
Siriagus 6:edb48de563a9 109 case LOAD_GAME:
Siriagus 13:7ab71c7c311b 110 lcd->printString("Loading...", xMargin, 2);
Siriagus 7:678873947b29 111 requestStateChange(GAME);
Siriagus 6:edb48de563a9 112 break;
Siriagus 6:edb48de563a9 113
Siriagus 6:edb48de563a9 114 default:
Siriagus 13:7ab71c7c311b 115 ;
Siriagus 13:7ab71c7c311b 116 //error("MainMenu: Invalid internal state");
Siriagus 6:edb48de563a9 117
Siriagus 6:edb48de563a9 118 }
Siriagus 5:100d960fc6d5 119 }