Initial Flappy mbed Game

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

Committer:
jmelliadis3
Date:
Mon Mar 24 08:54:25 2014 +0000
Revision:
0:e5c12b0faa24
Child:
1:7d3e4ff9727c
Initial Flappy mbed game

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jmelliadis3 0:e5c12b0faa24 1 #include "mbed.h"
jmelliadis3 0:e5c12b0faa24 2 #include "rtos.h"
jmelliadis3 0:e5c12b0faa24 3
jmelliadis3 0:e5c12b0faa24 4 #include "SDFileSystem.h"
jmelliadis3 0:e5c12b0faa24 5 #include "wave_player.h"
jmelliadis3 0:e5c12b0faa24 6 #include "uLCD_4DGL.h"
jmelliadis3 0:e5c12b0faa24 7 #include "PinDetect.h"
jmelliadis3 0:e5c12b0faa24 8
jmelliadis3 0:e5c12b0faa24 9
jmelliadis3 0:e5c12b0faa24 10 uLCD_4DGL uLCD(p28, p27, p29); // create a global lcd object
jmelliadis3 0:e5c12b0faa24 11
jmelliadis3 0:e5c12b0faa24 12 SDFileSystem sd(p5, p6, p7, p8, "sd"); //SD card
jmelliadis3 0:e5c12b0faa24 13
jmelliadis3 0:e5c12b0faa24 14 AnalogOut DACout(p18);
jmelliadis3 0:e5c12b0faa24 15
jmelliadis3 0:e5c12b0faa24 16 wave_player waver(&DACout);
jmelliadis3 0:e5c12b0faa24 17
jmelliadis3 0:e5c12b0faa24 18 PinDetect pb1(p26);
jmelliadis3 0:e5c12b0faa24 19
jmelliadis3 0:e5c12b0faa24 20 int score = 0;
jmelliadis3 0:e5c12b0faa24 21 int wallSpeed = 1;
jmelliadis3 0:e5c12b0faa24 22 int wall1x1 = 80;
jmelliadis3 0:e5c12b0faa24 23 int wall1x2 = 100;
jmelliadis3 0:e5c12b0faa24 24 int wall1y1 = 0;
jmelliadis3 0:e5c12b0faa24 25 int wall1y2 = 40;
jmelliadis3 0:e5c12b0faa24 26 int wall2x1 = 80;
jmelliadis3 0:e5c12b0faa24 27 int wall2x2 = 100;
jmelliadis3 0:e5c12b0faa24 28 int wall2y1 = 88;
jmelliadis3 0:e5c12b0faa24 29 int wall2y2 = 128;
jmelliadis3 0:e5c12b0faa24 30
jmelliadis3 0:e5c12b0faa24 31 int ballxpos = 30;
jmelliadis3 0:e5c12b0faa24 32 int ballypos = 64;
jmelliadis3 0:e5c12b0faa24 33 int ballrad = 3;
jmelliadis3 0:e5c12b0faa24 34
jmelliadis3 0:e5c12b0faa24 35 int volatile ballVel = 1;
jmelliadis3 0:e5c12b0faa24 36
jmelliadis3 0:e5c12b0faa24 37 enum gameState{
jmelliadis3 0:e5c12b0faa24 38 begin,
jmelliadis3 0:e5c12b0faa24 39 playing,
jmelliadis3 0:e5c12b0faa24 40 over};
jmelliadis3 0:e5c12b0faa24 41
jmelliadis3 0:e5c12b0faa24 42 int volatile state;
jmelliadis3 0:e5c12b0faa24 43
jmelliadis3 0:e5c12b0faa24 44 FILE *wave_file;
jmelliadis3 0:e5c12b0faa24 45
jmelliadis3 0:e5c12b0faa24 46 void playPointSound(void const *argument) {
jmelliadis3 0:e5c12b0faa24 47 while(1) {
jmelliadis3 0:e5c12b0faa24 48 Thread::signal_wait(0x1);
jmelliadis3 0:e5c12b0faa24 49 //open wav file
jmelliadis3 0:e5c12b0faa24 50 //FILE *wave_file;
jmelliadis3 0:e5c12b0faa24 51 //wave_file=fopen("/sd/sfx_point.wav","r");
jmelliadis3 0:e5c12b0faa24 52
jmelliadis3 0:e5c12b0faa24 53 //play wav file
jmelliadis3 0:e5c12b0faa24 54 waver.play(wave_file);
jmelliadis3 0:e5c12b0faa24 55
jmelliadis3 0:e5c12b0faa24 56 //close wav file
jmelliadis3 0:e5c12b0faa24 57 fclose(wave_file);
jmelliadis3 0:e5c12b0faa24 58 }
jmelliadis3 0:e5c12b0faa24 59 }
jmelliadis3 0:e5c12b0faa24 60
jmelliadis3 0:e5c12b0faa24 61 void pb1_hit_callback() {
jmelliadis3 0:e5c12b0faa24 62
jmelliadis3 0:e5c12b0faa24 63 switch (state) {
jmelliadis3 0:e5c12b0faa24 64 case begin:
jmelliadis3 0:e5c12b0faa24 65 state = playing;
jmelliadis3 0:e5c12b0faa24 66 break;
jmelliadis3 0:e5c12b0faa24 67 case playing:
jmelliadis3 0:e5c12b0faa24 68 ballVel = ballVel-10;
jmelliadis3 0:e5c12b0faa24 69 break;
jmelliadis3 0:e5c12b0faa24 70 case over:
jmelliadis3 0:e5c12b0faa24 71 state = begin;
jmelliadis3 0:e5c12b0faa24 72 break;
jmelliadis3 0:e5c12b0faa24 73 }
jmelliadis3 0:e5c12b0faa24 74 }
jmelliadis3 0:e5c12b0faa24 75
jmelliadis3 0:e5c12b0faa24 76 int main() {
jmelliadis3 0:e5c12b0faa24 77
jmelliadis3 0:e5c12b0faa24 78 state = begin;
jmelliadis3 0:e5c12b0faa24 79 Thread thread(playPointSound);
jmelliadis3 0:e5c12b0faa24 80
jmelliadis3 0:e5c12b0faa24 81 wave_file=fopen("/sd/sfx_point.wav","r");
jmelliadis3 0:e5c12b0faa24 82
jmelliadis3 0:e5c12b0faa24 83 int ready = 0;
jmelliadis3 0:e5c12b0faa24 84
jmelliadis3 0:e5c12b0faa24 85 pb1.mode(PullUp);
jmelliadis3 0:e5c12b0faa24 86 wait(.01);
jmelliadis3 0:e5c12b0faa24 87 pb1.attach_deasserted(&pb1_hit_callback);
jmelliadis3 0:e5c12b0faa24 88 pb1.setSampleFrequency();
jmelliadis3 0:e5c12b0faa24 89
jmelliadis3 0:e5c12b0faa24 90 uLCD.baudrate(3000000);
jmelliadis3 0:e5c12b0faa24 91 uLCD.cls();
jmelliadis3 0:e5c12b0faa24 92
jmelliadis3 0:e5c12b0faa24 93 uLCD.filled_rectangle(0,0,128,128,0x0000FF);
jmelliadis3 0:e5c12b0faa24 94 uLCD.filled_circle(ballxpos, ballypos, ballrad, 0xFF00FF);
jmelliadis3 0:e5c12b0faa24 95 uLCD.filled_rectangle(wall1x1, wall1y1, wall1x2, wall1y2, 0x00FF00);
jmelliadis3 0:e5c12b0faa24 96 uLCD.filled_rectangle(wall2x1, wall2y1, wall2x2, wall2y2, 0x00FF00);
jmelliadis3 0:e5c12b0faa24 97 uLCD.locate(14,0);
jmelliadis3 0:e5c12b0faa24 98 uLCD.printf("%04d", score);
jmelliadis3 0:e5c12b0faa24 99
jmelliadis3 0:e5c12b0faa24 100 int go = 1;
jmelliadis3 0:e5c12b0faa24 101 while(go) {
jmelliadis3 0:e5c12b0faa24 102
jmelliadis3 0:e5c12b0faa24 103 switch (state) {
jmelliadis3 0:e5c12b0faa24 104 case begin:
jmelliadis3 0:e5c12b0faa24 105
jmelliadis3 0:e5c12b0faa24 106 uLCD.locate(4,2);
jmelliadis3 0:e5c12b0faa24 107 uLCD.color(WHITE);
jmelliadis3 0:e5c12b0faa24 108 uLCD.textbackground_color(BLUE);
jmelliadis3 0:e5c12b0faa24 109 uLCD.text_mode(OPAQUE);
jmelliadis3 0:e5c12b0faa24 110 uLCD.set_font(FONT_7X8);
jmelliadis3 0:e5c12b0faa24 111 uLCD.printf("Flappy mbed");
jmelliadis3 0:e5c12b0faa24 112
jmelliadis3 0:e5c12b0faa24 113 uLCD.locate(1,10);
jmelliadis3 0:e5c12b0faa24 114 uLCD.printf("Press PB to Start");
jmelliadis3 0:e5c12b0faa24 115 ready = 0;
jmelliadis3 0:e5c12b0faa24 116
jmelliadis3 0:e5c12b0faa24 117
jmelliadis3 0:e5c12b0faa24 118 break;
jmelliadis3 0:e5c12b0faa24 119
jmelliadis3 0:e5c12b0faa24 120 case playing:
jmelliadis3 0:e5c12b0faa24 121
jmelliadis3 0:e5c12b0faa24 122 if (!ready)
jmelliadis3 0:e5c12b0faa24 123 {
jmelliadis3 0:e5c12b0faa24 124 uLCD.cls();
jmelliadis3 0:e5c12b0faa24 125
jmelliadis3 0:e5c12b0faa24 126 wall1x1 = 80;
jmelliadis3 0:e5c12b0faa24 127 wall1x2 = 100;
jmelliadis3 0:e5c12b0faa24 128 wall1y1 = 0;
jmelliadis3 0:e5c12b0faa24 129 wall1y2 = 40;
jmelliadis3 0:e5c12b0faa24 130 wall2x1 = 80;
jmelliadis3 0:e5c12b0faa24 131 wall2x2 = 100;
jmelliadis3 0:e5c12b0faa24 132 wall2y1 = 88;
jmelliadis3 0:e5c12b0faa24 133 wall2y2 = 128;
jmelliadis3 0:e5c12b0faa24 134
jmelliadis3 0:e5c12b0faa24 135 ballxpos = 30;
jmelliadis3 0:e5c12b0faa24 136 ballypos = 64;
jmelliadis3 0:e5c12b0faa24 137 ballrad = 3;
jmelliadis3 0:e5c12b0faa24 138
jmelliadis3 0:e5c12b0faa24 139 uLCD.filled_rectangle(0,0,128,128,0x0000FF);
jmelliadis3 0:e5c12b0faa24 140 uLCD.filled_circle(ballxpos, ballypos, ballrad, 0xFF00FF);
jmelliadis3 0:e5c12b0faa24 141 uLCD.filled_rectangle(wall1x1, wall1y1, wall1x2, wall1y2, 0x00FF00);
jmelliadis3 0:e5c12b0faa24 142 uLCD.filled_rectangle(wall2x1, wall2y1, wall2x2, wall2y2, 0x00FF00);
jmelliadis3 0:e5c12b0faa24 143 ready = 1;
jmelliadis3 0:e5c12b0faa24 144 }
jmelliadis3 0:e5c12b0faa24 145
jmelliadis3 0:e5c12b0faa24 146 wall1x1--;
jmelliadis3 0:e5c12b0faa24 147 wall2x1--;
jmelliadis3 0:e5c12b0faa24 148 wall1x2--;
jmelliadis3 0:e5c12b0faa24 149 wall2x2--;
jmelliadis3 0:e5c12b0faa24 150
jmelliadis3 0:e5c12b0faa24 151 if (wall1x2 < -1)
jmelliadis3 0:e5c12b0faa24 152 {
jmelliadis3 0:e5c12b0faa24 153 wall1x2 = 148;
jmelliadis3 0:e5c12b0faa24 154 wall1x1 = 128;
jmelliadis3 0:e5c12b0faa24 155 wall2x2 = 148;
jmelliadis3 0:e5c12b0faa24 156 wall2x1 = 128;
jmelliadis3 0:e5c12b0faa24 157
jmelliadis3 0:e5c12b0faa24 158 wall1y2 = rand() % (73) + 8;
jmelliadis3 0:e5c12b0faa24 159 wall2y1 = wall1y2 + 48;
jmelliadis3 0:e5c12b0faa24 160 }
jmelliadis3 0:e5c12b0faa24 161
jmelliadis3 0:e5c12b0faa24 162
jmelliadis3 0:e5c12b0faa24 163 uLCD.filled_rectangle(wall1x1, wall1y1, wall1x2, wall1y2, 0x00FF00);
jmelliadis3 0:e5c12b0faa24 164 uLCD.filled_rectangle(wall2x1, wall2y1, wall2x2, wall2y2, 0x00FF00);
jmelliadis3 0:e5c12b0faa24 165 uLCD.line(wall1x2+1,wall1y1,wall1x2+1,wall1y2+1,0x0000FF);
jmelliadis3 0:e5c12b0faa24 166 uLCD.line(wall1x2+1,wall2y1,wall1x2+1,wall2y2+1,0x0000FF);
jmelliadis3 0:e5c12b0faa24 167
jmelliadis3 0:e5c12b0faa24 168 if (ballxpos == (wall1x1 + 10))
jmelliadis3 0:e5c12b0faa24 169 {
jmelliadis3 0:e5c12b0faa24 170 thread.signal_set(0x1);
jmelliadis3 0:e5c12b0faa24 171 score++;
jmelliadis3 0:e5c12b0faa24 172 wave_file=fopen("/sd/sfx_point.wav","r");
jmelliadis3 0:e5c12b0faa24 173 uLCD.locate(14,0);
jmelliadis3 0:e5c12b0faa24 174 uLCD.printf("%04d", score);
jmelliadis3 0:e5c12b0faa24 175 }
jmelliadis3 0:e5c12b0faa24 176
jmelliadis3 0:e5c12b0faa24 177 uLCD.filled_circle(ballxpos, ballypos, ballrad, 0x0000FF);
jmelliadis3 0:e5c12b0faa24 178 if (ballVel < 2)
jmelliadis3 0:e5c12b0faa24 179 ballVel++;
jmelliadis3 0:e5c12b0faa24 180
jmelliadis3 0:e5c12b0faa24 181 ballypos = ballypos + ballVel;
jmelliadis3 0:e5c12b0faa24 182 uLCD.filled_circle(ballxpos, ballypos, ballrad, 0xFF00FF);
jmelliadis3 0:e5c12b0faa24 183
jmelliadis3 0:e5c12b0faa24 184 if (ballypos - 2 < wall1y2) {
jmelliadis3 0:e5c12b0faa24 185 if (ballxpos+2 > wall1x1 && ballxpos-2 < wall1x2) {
jmelliadis3 0:e5c12b0faa24 186 state = over;
jmelliadis3 0:e5c12b0faa24 187 }
jmelliadis3 0:e5c12b0faa24 188 }
jmelliadis3 0:e5c12b0faa24 189 else if (ballypos + 2 > wall2y1) {
jmelliadis3 0:e5c12b0faa24 190 if (ballxpos+2 > wall2x1 && ballxpos-2 < wall2x2) {
jmelliadis3 0:e5c12b0faa24 191 state = over;
jmelliadis3 0:e5c12b0faa24 192 }
jmelliadis3 0:e5c12b0faa24 193 }
jmelliadis3 0:e5c12b0faa24 194 else if (ballypos > 125) {
jmelliadis3 0:e5c12b0faa24 195 state = over;
jmelliadis3 0:e5c12b0faa24 196 }
jmelliadis3 0:e5c12b0faa24 197
jmelliadis3 0:e5c12b0faa24 198 break;
jmelliadis3 0:e5c12b0faa24 199
jmelliadis3 0:e5c12b0faa24 200 case over:
jmelliadis3 0:e5c12b0faa24 201 //open wav file
jmelliadis3 0:e5c12b0faa24 202 if (ready)
jmelliadis3 0:e5c12b0faa24 203 {
jmelliadis3 0:e5c12b0faa24 204 Thread::wait(300);
jmelliadis3 0:e5c12b0faa24 205 fclose(wave_file);
jmelliadis3 0:e5c12b0faa24 206 FILE *wave_file2;
jmelliadis3 0:e5c12b0faa24 207 wave_file2=fopen("/sd/sfx_hit.wav","r");
jmelliadis3 0:e5c12b0faa24 208
jmelliadis3 0:e5c12b0faa24 209 //play wav file
jmelliadis3 0:e5c12b0faa24 210 waver.play(wave_file2);
jmelliadis3 0:e5c12b0faa24 211
jmelliadis3 0:e5c12b0faa24 212 //close wav file
jmelliadis3 0:e5c12b0faa24 213 fclose(wave_file2);
jmelliadis3 0:e5c12b0faa24 214
jmelliadis3 0:e5c12b0faa24 215 uLCD.locate(5,8);
jmelliadis3 0:e5c12b0faa24 216 uLCD.color(WHITE);
jmelliadis3 0:e5c12b0faa24 217 uLCD.textbackground_color(BLUE);
jmelliadis3 0:e5c12b0faa24 218 uLCD.text_mode(OPAQUE);
jmelliadis3 0:e5c12b0faa24 219 uLCD.set_font(FONT_7X8);
jmelliadis3 0:e5c12b0faa24 220 uLCD.printf("Game Over");
jmelliadis3 0:e5c12b0faa24 221
jmelliadis3 0:e5c12b0faa24 222 uLCD.locate(14,0);
jmelliadis3 0:e5c12b0faa24 223 uLCD.printf("%04d", score);
jmelliadis3 0:e5c12b0faa24 224 ready = 0;
jmelliadis3 0:e5c12b0faa24 225 score = 0;
jmelliadis3 0:e5c12b0faa24 226 }
jmelliadis3 0:e5c12b0faa24 227 break;
jmelliadis3 0:e5c12b0faa24 228 }
jmelliadis3 0:e5c12b0faa24 229 }
jmelliadis3 0:e5c12b0faa24 230 }