Initial Flappy mbed Game

Dependencies:   4DGL-uLCD-SE PinDetect SDFileSystem mbed-rtos mbed wave_player

Revision:
0:e5c12b0faa24
Child:
1:7d3e4ff9727c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon Mar 24 08:54:25 2014 +0000
@@ -0,0 +1,230 @@
+#include "mbed.h"
+#include "rtos.h"
+
+#include "SDFileSystem.h"
+#include "wave_player.h"
+#include "uLCD_4DGL.h"
+#include "PinDetect.h"
+
+
+uLCD_4DGL uLCD(p28, p27, p29); // create a global lcd object
+
+SDFileSystem sd(p5, p6, p7, p8, "sd"); //SD card
+
+AnalogOut DACout(p18);
+
+wave_player waver(&DACout);
+
+PinDetect pb1(p26);
+
+int score = 0;
+int wallSpeed = 1;
+int wall1x1 = 80;
+int wall1x2 = 100;
+int wall1y1 = 0;
+int wall1y2 = 40;
+int wall2x1 = 80;
+int wall2x2 = 100;
+int wall2y1 = 88;
+int wall2y2 = 128;
+
+int ballxpos = 30;
+int ballypos = 64;
+int ballrad = 3;
+
+int volatile ballVel = 1;
+
+enum gameState{
+    begin,
+    playing,
+    over};
+    
+int volatile state;
+
+FILE *wave_file;
+
+void playPointSound(void const *argument) {
+    while(1) {
+    Thread::signal_wait(0x1);
+    //open wav file
+    //FILE *wave_file;
+    //wave_file=fopen("/sd/sfx_point.wav","r");
+    
+    //play wav file
+    waver.play(wave_file);
+    
+    //close wav file
+    fclose(wave_file);
+    }
+}
+
+void pb1_hit_callback() {
+       
+       switch (state) {
+       case begin:
+       state = playing;
+       break;
+       case playing:
+       ballVel = ballVel-10;
+       break;
+       case over:
+       state = begin;
+       break;
+       }
+}
+
+int main() {
+    
+    state = begin;
+    Thread thread(playPointSound);
+    
+    wave_file=fopen("/sd/sfx_point.wav","r");
+    
+    int ready = 0;
+    
+    pb1.mode(PullUp);
+    wait(.01);
+    pb1.attach_deasserted(&pb1_hit_callback);
+    pb1.setSampleFrequency();
+
+    uLCD.baudrate(3000000);
+    uLCD.cls();
+    
+    uLCD.filled_rectangle(0,0,128,128,0x0000FF);
+    uLCD.filled_circle(ballxpos, ballypos, ballrad, 0xFF00FF);
+    uLCD.filled_rectangle(wall1x1, wall1y1, wall1x2, wall1y2, 0x00FF00);
+    uLCD.filled_rectangle(wall2x1, wall2y1, wall2x2, wall2y2, 0x00FF00);
+    uLCD.locate(14,0);
+    uLCD.printf("%04d", score);
+    
+    int go = 1;
+    while(go) {
+        
+        switch (state) {
+        case begin:
+        
+        uLCD.locate(4,2);
+        uLCD.color(WHITE);
+        uLCD.textbackground_color(BLUE);
+        uLCD.text_mode(OPAQUE);
+        uLCD.set_font(FONT_7X8);
+        uLCD.printf("Flappy mbed");
+        
+        uLCD.locate(1,10);
+        uLCD.printf("Press PB to Start");
+        ready = 0;
+        
+        
+        break;
+        
+        case playing:
+        
+        if (!ready)
+        {
+            uLCD.cls();
+            
+            wall1x1 = 80;
+            wall1x2 = 100;
+            wall1y1 = 0;
+            wall1y2 = 40;
+            wall2x1 = 80;
+            wall2x2 = 100;
+            wall2y1 = 88;
+            wall2y2 = 128;
+
+            ballxpos = 30;
+            ballypos = 64;
+            ballrad = 3;
+    
+            uLCD.filled_rectangle(0,0,128,128,0x0000FF);
+            uLCD.filled_circle(ballxpos, ballypos, ballrad, 0xFF00FF);
+            uLCD.filled_rectangle(wall1x1, wall1y1, wall1x2, wall1y2, 0x00FF00);
+            uLCD.filled_rectangle(wall2x1, wall2y1, wall2x2, wall2y2, 0x00FF00);
+            ready = 1;
+        }
+        
+        wall1x1--;
+        wall2x1--;
+        wall1x2--;
+        wall2x2--;
+        
+        if (wall1x2 < -1)
+        {
+            wall1x2 = 148;
+            wall1x1 = 128;
+            wall2x2 = 148;
+            wall2x1 = 128;
+        
+            wall1y2 = rand() % (73) + 8;
+            wall2y1 = wall1y2 + 48;
+        }
+        
+        
+        uLCD.filled_rectangle(wall1x1, wall1y1, wall1x2, wall1y2, 0x00FF00);
+        uLCD.filled_rectangle(wall2x1, wall2y1, wall2x2, wall2y2, 0x00FF00);
+        uLCD.line(wall1x2+1,wall1y1,wall1x2+1,wall1y2+1,0x0000FF); 
+        uLCD.line(wall1x2+1,wall2y1,wall1x2+1,wall2y2+1,0x0000FF);
+        
+        if (ballxpos == (wall1x1 + 10))
+        {
+            thread.signal_set(0x1);
+            score++;
+            wave_file=fopen("/sd/sfx_point.wav","r");
+            uLCD.locate(14,0);
+            uLCD.printf("%04d", score);   
+        } 
+        
+        uLCD.filled_circle(ballxpos, ballypos, ballrad, 0x0000FF);
+        if (ballVel < 2)
+            ballVel++;
+            
+        ballypos = ballypos + ballVel;
+        uLCD.filled_circle(ballxpos, ballypos, ballrad, 0xFF00FF);
+        
+        if (ballypos - 2 < wall1y2) {
+            if (ballxpos+2 > wall1x1 && ballxpos-2 < wall1x2) {
+                state = over;
+            }
+        }
+        else if (ballypos + 2 > wall2y1) {
+            if (ballxpos+2 > wall2x1 && ballxpos-2 < wall2x2) {
+                state = over;    
+            }
+        }
+        else if (ballypos > 125) {
+            state = over;
+        }
+        
+        break;
+        
+        case over:
+        //open wav file
+        if (ready)
+        {
+            Thread::wait(300);
+            fclose(wave_file);
+            FILE *wave_file2;
+            wave_file2=fopen("/sd/sfx_hit.wav","r");
+    
+            //play wav file
+            waver.play(wave_file2);
+    
+            //close wav file
+            fclose(wave_file2);
+        
+            uLCD.locate(5,8);
+            uLCD.color(WHITE);
+            uLCD.textbackground_color(BLUE);
+            uLCD.text_mode(OPAQUE);
+            uLCD.set_font(FONT_7X8);
+            uLCD.printf("Game Over");
+        
+            uLCD.locate(14,0);
+            uLCD.printf("%04d", score);
+            ready = 0;
+            score = 0;
+        }
+        break;
+        }
+    }
+}