Hugo Hu / Mbed 2 deprecated BRAVEHEART

Dependencies:   mbed N5110 ShiftReg PinDetect

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers MainMenu.cpp Source File

MainMenu.cpp

Go to the documentation of this file.
00001 #include "MainMenu.h "
00002 
00003 /// @file MainMenu.cpp
00004 
00005 /// States for the Main Menu's internal finite state machine
00006 enum MenuState {SELECT_PLAY, SELECT_HIGHSCORES, SELECT_CONTROLS, LOAD_GAME, HIGHSCORES, CONTROLS};
00007 
00008 /// Static variables for internal fsm.
00009 
00010 const int MainMenu::MENU_FSM[6][3] = {
00011     {LOAD_GAME, SELECT_PLAY, SELECT_HIGHSCORES},            // State: SELECT_PLAY
00012     {HIGHSCORES, SELECT_HIGHSCORES, SELECT_CONTROLS},       // State: SELECT_HIGHSCORES
00013     {CONTROLS, SELECT_CONTROLS, SELECT_PLAY},               // State: SELECT_CONTROLS
00014     {LOAD_GAME, LOAD_GAME, LOAD_GAME},                      // State: LOAD_GAME
00015     {SELECT_HIGHSCORES, SELECT_HIGHSCORES, HIGHSCORES},     // State: HIGHSCORES
00016     {SELECT_CONTROLS, SELECT_CONTROLS, CONTROLS}            // State: CONTROLS
00017 };
00018 
00019 int MainMenu::currentState; /// Current state for the state machine
00020 
00021 // Callback functions (needs to be static)
00022 void MainMenu::btnAPress()
00023 {
00024     currentState = MENU_FSM[currentState][0];
00025 }
00026 
00027 void MainMenu::btnBPress()
00028 {
00029     currentState = MENU_FSM[currentState][1];
00030 }
00031 
00032 void MainMenu::btnCPress()
00033 {
00034     currentState = MENU_FSM[currentState][2];
00035 }
00036 
00037 void MainMenu::btnDPress()
00038 {
00039     currentState = MENU_FSM[currentState][2];
00040 }
00041 
00042 void MainMenu::init()
00043 {
00044     MainMenu::currentState = SELECT_PLAY;
00045     input->addBtnPressInterrupt(Input::ButtonA, &btnAPress);
00046     input->addBtnPressInterrupt(Input::ButtonB, &btnBPress);
00047     input->addBtnPressInterrupt(Input::ButtonC, &btnCPress);
00048     input->addBtnPressInterrupt(Input::ButtonD, &btnDPress);
00049 }
00050 
00051 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.
00052 
00053 void MainMenu::render()
00054 {   
00055     for (int i = 0; i < HEIGHT/3; ++i)
00056     {
00057         drawImage(Image::Pattern3, 0, 3*i);           // left border
00058         drawImage(Image::Pattern3, (WIDTH-3), 3*i);   // right border
00059     }
00060     
00061     for (int j = 0; j < WIDTH/3; ++j)
00062     {
00063         drawImage(Image::Pattern3, 3 * j, (HEIGHT-3));    // bottom border
00064         drawImage(Image::Pattern3, 3 * j, 0);             // top border
00065     }
00066     
00067     // Check sate
00068     int xMargin = 8;
00069     switch (currentState)
00070     {        
00071         case SELECT_PLAY:
00072             lcd->printString(">Play", xMargin, 1);
00073             lcd->printString("High Scores", xMargin, 2);
00074             lcd->printString("Controls", xMargin, 3);
00075         break;
00076         
00077         case SELECT_HIGHSCORES:
00078             lcd->printString("Play", xMargin, 1);
00079             lcd->printString(">High Scores", xMargin, 2);
00080             lcd->printString("Controls", xMargin, 3);
00081         break;
00082         
00083         case SELECT_CONTROLS:
00084             lcd->printString("Play", xMargin, 1);
00085             lcd->printString("High Scores", xMargin, 2);
00086             lcd->printString(">Controls", xMargin, 3);
00087         break;
00088         
00089         case HIGHSCORES:
00090             
00091             for (int i = 0; i < 3; ++i)
00092             {
00093                 std::stringstream ss;
00094                 ss << Global::highscores[i].initials << "  " << Global::highscores[i].score;
00095                 lcd->printString(ss.str().c_str(), xMargin, i+1);
00096             }
00097             
00098 
00099             lcd->printString(">Back", xMargin, 4);
00100         break;
00101         
00102         case CONTROLS:
00103             lcd->printString("A: Jump", xMargin, 1);
00104             lcd->printString("B: Shoot", xMargin, 2);
00105             lcd->printString("C: Pause", xMargin, 3);
00106             lcd->printString(">Back", xMargin, 4);
00107         break;
00108         
00109         case LOAD_GAME:
00110             lcd->printString("Loading...", xMargin, 2);
00111             requestStateChange(GAME);
00112         break;
00113         
00114         default:
00115         ;
00116             //error("MainMenu: Invalid internal state");
00117             
00118     }
00119 }