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

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();