A complex 2D-dungeon game on LPC1768 in SWJTU-Leeds Joint School XJEL2645 project. Referenced from the framework contributed by https://os.mbed.com/users/Siriagus/code/SimplePlatformGame/
Dependencies: mbed N5110 ShiftReg PinDetect
Diff: main.cpp
- Revision:
- 2:0ae5ac8b0cac
- Parent:
- 1:0cfe2255092a
- Child:
- 3:4e3f342a135c
--- a/main.cpp Tue Apr 28 12:46:37 2015 +0000 +++ b/main.cpp Tue Apr 28 15:12:42 2015 +0000 @@ -26,12 +26,12 @@ #define LED_POT p20 -#define BUTTON_A p27 -#define BUTTON_B p28 +#define BUTTON_A p28 +#define BUTTON_B p27 #define BUTTON_C p29 -enum MainState {MENU, GAME}; -MainState currentState; // current state +enum MenuState {SELECT_MENU, HIGH_SCORES, CONTROLS, LOAD_GAME}; +MenuState currentState; // current state // Components N5110 *lcd; // VCC, SCE, RST, D/C, MOSI, SCLK and LED @@ -71,7 +71,7 @@ // Init LCD lcd = new N5110(p7, p8, p9, p10, p11, p13, p26); lcd->init(); - lcd->normalMode(); + //lcd->normalMode(); lcd->setBrightness(1.0 - ledPot); // Update brightness of screen // Init joystick @@ -80,6 +80,8 @@ // Set initial state // currentState = MENU; + + currentState = SELECT_MENU; // stateObj = new MainMenu(lcd, BUTTON_A, BUTTON_B, BUTTON_C); } @@ -90,21 +92,95 @@ delete stateObj; } +// States + + const int NUM_CHOICES = 3; std::string choices[NUM_CHOICES] = {"Play", "High Score", "Controls"}; int selectedChoice = 0; +PinDetect btnA(BUTTON_A); +PinDetect btnB(BUTTON_B); PinDetect btnC(BUTTON_C); -void nextChoice() { selectedChoice = (selectedChoice + 1) % NUM_CHOICES;} + +void btnAPressed() +{ + switch(currentState) + { + case SELECT_MENU: + switch(selectedChoice) + { + case 0: + currentState = LOAD_GAME; + break; + + case 1: + currentState = HIGH_SCORES; + break; + + case 2: + currentState = CONTROLS; + break; + } + break; + + case CONTROLS: + case HIGH_SCORES: + currentState = SELECT_MENU; + break; + } + +} +void btnBPressed() +{ + switch(currentState) + { + case HIGH_SCORES: + case CONTROLS: + currentState = SELECT_MENU; + break; + } + +} + +void btnCPressed() +{ + if (currentState == SELECT_MENU) + selectedChoice = (selectedChoice + 1) % NUM_CHOICES; +} + +// Processes button input. +int buttons = 0; // Three first bit corresponds the buttons +void processButtonInput(int buttonPressed) +{ + switch(buttonPressed) + { + case 0: // Button A + btnAPressed(); + break; + + case 1: // Button B + btnBPressed(); + break; + + case 2: // Button C + btnCPressed(); + break; + } +} int main() { init(); // button - btnC.attach_asserted(&nextChoice); + btnA.attach_asserted(&btnAPressed); + btnB.attach_asserted(&btnBPressed); + btnC.attach_asserted(&btnCPressed); + + btnA.setSampleFrequency(); + btnB.setSampleFrequency(); btnC.setSampleFrequency(); - // Game loop, fixed-time step, updates game logic with regular intervals, rendering happens as fast as possible while(true) { @@ -115,14 +191,46 @@ joystick->update(); lcd->setBrightness(1.0 - ledPot); // Update brightness of screen - for (int i = 0; i < 3; ++i) + // Process events + + + // Update + switch (currentState) { - std::string str = (selectedChoice == i) ? ("> " + choices[i]) : choices[i]; - lcd->printString(str.c_str(), 10, i+1); + case SELECT_MENU: + for (int i = 0; i < 3; ++i) + { + std::string str = (selectedChoice == i) ? ("> " + choices[i]) : choices[i]; + lcd->printString(str.c_str(), 10, i+1); + } + break; + + case HIGH_SCORES: + // Placeholder TODO: Actually high scores + lcd->printString("High Scores", 10, 0); + lcd->printString("AND 1000000", 10, 1); + lcd->printString("AND 500000", 10, 2); + lcd->printString("AND 100", 10, 3); + lcd->printString("> Back", 10, 4); + break; + + case CONTROLS: + lcd->printString("Controls", 10, 0); + lcd->printString("A: Jump", 10, 1); + lcd->printString("B: Shoot", 10, 2); + lcd->printString("C: Pause", 10, 3); + lcd->printString("> Back", 10, 4); + break; + + case LOAD_GAME: + lcd->inverseMode(); + clearAndDrawImage(logo); + break; + } lcd->refresh(); - Sleep(); // Wait for button interrupt + Sleep(); } cleanUp();