Andreas Garmannslund / Mbed 2 deprecated SimplePlatformGame

Dependencies:   N5110 PinDetect PowerControl mbed

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::init()
00038 {
00039     MainMenu::currentState = SELECT_PLAY;
00040     input->addBtnPressInterrupt(Input::ButtonA, &btnAPress);
00041     input->addBtnPressInterrupt(Input::ButtonB, &btnBPress);
00042     input->addBtnPressInterrupt(Input::ButtonC, &btnCPress);
00043 }
00044 
00045 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.
00046 
00047 void MainMenu::render()
00048 {   
00049     for (int i = 0; i < HEIGHT/3; ++i)
00050     {
00051         drawImage(Image::Pattern3, 0, 3*i);           // left border
00052         drawImage(Image::Pattern3, (WIDTH-3), 3*i);   // right border
00053     }
00054     
00055     for (int j = 0; j < WIDTH/3; ++j)
00056     {
00057         drawImage(Image::Pattern3, 3 * j, (HEIGHT-3));    // bottom border
00058         drawImage(Image::Pattern3, 3 * j, 0);             // top border
00059     }
00060     
00061     // Check sate
00062     int xMargin = 8;
00063     switch (currentState)
00064     {        
00065         case SELECT_PLAY:
00066             lcd->printString(">Play", xMargin, 1);
00067             lcd->printString("High Scores", xMargin, 2);
00068             lcd->printString("Controls", xMargin, 3);
00069         break;
00070         
00071         case SELECT_HIGHSCORES:
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_CONTROLS:
00078             lcd->printString("Play", xMargin, 1);
00079             lcd->printString("High Scores", xMargin, 2);
00080             lcd->printString(">Controls", xMargin, 3);
00081         break;
00082         
00083         case HIGHSCORES:
00084             
00085             for (int i = 0; i < 3; ++i)
00086             {
00087                 std::stringstream ss;
00088                 ss << Global::highscores[i].initials << "  " << Global::highscores[i].score;
00089                 lcd->printString(ss.str().c_str(), xMargin, i+1);
00090             }
00091             
00092 
00093             lcd->printString(">Back", xMargin, 4);
00094         break;
00095         
00096         case CONTROLS:
00097             lcd->printString("A: Jump", xMargin, 1);
00098             lcd->printString("B: Shoot", xMargin, 2);
00099             lcd->printString("C: Pause", xMargin, 3);
00100             lcd->printString(">Back", xMargin, 4);
00101         break;
00102         
00103         case LOAD_GAME:
00104             lcd->printString("Loading...", xMargin, 2);
00105             requestStateChange(GAME);
00106         break;
00107         
00108         default:
00109         ;
00110             //error("MainMenu: Invalid internal state");
00111             
00112     }
00113 }