Initial Flappy mbed Game

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

Committer:
jmelliadis3
Date:
Mon Mar 24 19:23:12 2014 +0000
Revision:
3:642d90f34496
Parent:
2:22aa1c22ec77
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 2:22aa1c22ec77 61 void playDeadSound(void const *argument) {
jmelliadis3 2:22aa1c22ec77 62 while(1) {
jmelliadis3 2:22aa1c22ec77 63 Thread::signal_wait(0x1);
jmelliadis3 2:22aa1c22ec77 64 //open wav file
jmelliadis3 2:22aa1c22ec77 65 FILE *wave_file;
jmelliadis3 2:22aa1c22ec77 66 wave_file=fopen("/sd/sfx_die.wav","r");
jmelliadis3 2:22aa1c22ec77 67
jmelliadis3 2:22aa1c22ec77 68 //play wav file
jmelliadis3 2:22aa1c22ec77 69 waver.play(wave_file);
jmelliadis3 2:22aa1c22ec77 70
jmelliadis3 2:22aa1c22ec77 71 //close wav file
jmelliadis3 2:22aa1c22ec77 72 fclose(wave_file);
jmelliadis3 2:22aa1c22ec77 73 }
jmelliadis3 2:22aa1c22ec77 74 }
jmelliadis3 2:22aa1c22ec77 75
jmelliadis3 2:22aa1c22ec77 76
jmelliadis3 0:e5c12b0faa24 77 void pb1_hit_callback() {
jmelliadis3 0:e5c12b0faa24 78
jmelliadis3 0:e5c12b0faa24 79 switch (state) {
jmelliadis3 0:e5c12b0faa24 80 case begin:
jmelliadis3 0:e5c12b0faa24 81 state = playing;
jmelliadis3 0:e5c12b0faa24 82 break;
jmelliadis3 0:e5c12b0faa24 83 case playing:
jmelliadis3 0:e5c12b0faa24 84 ballVel = ballVel-10;
jmelliadis3 0:e5c12b0faa24 85 break;
jmelliadis3 0:e5c12b0faa24 86 case over:
jmelliadis3 0:e5c12b0faa24 87 state = begin;
jmelliadis3 0:e5c12b0faa24 88 break;
jmelliadis3 0:e5c12b0faa24 89 }
jmelliadis3 0:e5c12b0faa24 90 }
jmelliadis3 0:e5c12b0faa24 91
jmelliadis3 0:e5c12b0faa24 92 int main() {
jmelliadis3 0:e5c12b0faa24 93
jmelliadis3 0:e5c12b0faa24 94 state = begin;
jmelliadis3 0:e5c12b0faa24 95 Thread thread(playPointSound);
jmelliadis3 2:22aa1c22ec77 96 Thread thread2(playDeadSound);
jmelliadis3 0:e5c12b0faa24 97
jmelliadis3 0:e5c12b0faa24 98 wave_file=fopen("/sd/sfx_point.wav","r");
jmelliadis3 0:e5c12b0faa24 99
jmelliadis3 0:e5c12b0faa24 100 int ready = 0;
jmelliadis3 0:e5c12b0faa24 101
jmelliadis3 0:e5c12b0faa24 102 pb1.mode(PullUp);
jmelliadis3 0:e5c12b0faa24 103 wait(.01);
jmelliadis3 0:e5c12b0faa24 104 pb1.attach_deasserted(&pb1_hit_callback);
jmelliadis3 0:e5c12b0faa24 105 pb1.setSampleFrequency();
jmelliadis3 0:e5c12b0faa24 106
jmelliadis3 0:e5c12b0faa24 107 uLCD.baudrate(3000000);
jmelliadis3 0:e5c12b0faa24 108 uLCD.cls();
jmelliadis3 0:e5c12b0faa24 109
jmelliadis3 0:e5c12b0faa24 110 uLCD.filled_rectangle(0,0,128,128,0x0000FF);
jmelliadis3 0:e5c12b0faa24 111 uLCD.filled_circle(ballxpos, ballypos, ballrad, 0xFF00FF);
jmelliadis3 0:e5c12b0faa24 112 uLCD.filled_rectangle(wall1x1, wall1y1, wall1x2, wall1y2, 0x00FF00);
jmelliadis3 0:e5c12b0faa24 113 uLCD.filled_rectangle(wall2x1, wall2y1, wall2x2, wall2y2, 0x00FF00);
jmelliadis3 0:e5c12b0faa24 114 uLCD.locate(14,0);
jmelliadis3 0:e5c12b0faa24 115 uLCD.printf("%04d", score);
jmelliadis3 0:e5c12b0faa24 116
jmelliadis3 0:e5c12b0faa24 117 int go = 1;
jmelliadis3 3:642d90f34496 118 int scoreWrite = 1;
jmelliadis3 0:e5c12b0faa24 119 while(go) {
jmelliadis3 0:e5c12b0faa24 120
jmelliadis3 0:e5c12b0faa24 121 switch (state) {
jmelliadis3 0:e5c12b0faa24 122 case begin:
jmelliadis3 0:e5c12b0faa24 123
jmelliadis3 0:e5c12b0faa24 124 uLCD.locate(4,2);
jmelliadis3 0:e5c12b0faa24 125 uLCD.color(WHITE);
jmelliadis3 0:e5c12b0faa24 126 uLCD.textbackground_color(BLUE);
jmelliadis3 0:e5c12b0faa24 127 uLCD.text_mode(OPAQUE);
jmelliadis3 0:e5c12b0faa24 128 uLCD.set_font(FONT_7X8);
jmelliadis3 0:e5c12b0faa24 129 uLCD.printf("Flappy mbed");
jmelliadis3 0:e5c12b0faa24 130
jmelliadis3 0:e5c12b0faa24 131 uLCD.locate(1,10);
jmelliadis3 0:e5c12b0faa24 132 uLCD.printf("Press PB to Start");
jmelliadis3 0:e5c12b0faa24 133 ready = 0;
jmelliadis3 0:e5c12b0faa24 134
jmelliadis3 0:e5c12b0faa24 135
jmelliadis3 0:e5c12b0faa24 136 break;
jmelliadis3 0:e5c12b0faa24 137
jmelliadis3 0:e5c12b0faa24 138 case playing:
jmelliadis3 0:e5c12b0faa24 139
jmelliadis3 0:e5c12b0faa24 140 if (!ready)
jmelliadis3 0:e5c12b0faa24 141 {
jmelliadis3 0:e5c12b0faa24 142 uLCD.cls();
jmelliadis3 0:e5c12b0faa24 143
jmelliadis3 0:e5c12b0faa24 144 wall1x1 = 80;
jmelliadis3 0:e5c12b0faa24 145 wall1x2 = 100;
jmelliadis3 0:e5c12b0faa24 146 wall1y1 = 0;
jmelliadis3 0:e5c12b0faa24 147 wall1y2 = 40;
jmelliadis3 0:e5c12b0faa24 148 wall2x1 = 80;
jmelliadis3 0:e5c12b0faa24 149 wall2x2 = 100;
jmelliadis3 0:e5c12b0faa24 150 wall2y1 = 88;
jmelliadis3 0:e5c12b0faa24 151 wall2y2 = 128;
jmelliadis3 0:e5c12b0faa24 152
jmelliadis3 0:e5c12b0faa24 153 ballxpos = 30;
jmelliadis3 0:e5c12b0faa24 154 ballypos = 64;
jmelliadis3 0:e5c12b0faa24 155 ballrad = 3;
jmelliadis3 0:e5c12b0faa24 156
jmelliadis3 0:e5c12b0faa24 157 uLCD.filled_rectangle(0,0,128,128,0x0000FF);
jmelliadis3 0:e5c12b0faa24 158 uLCD.filled_circle(ballxpos, ballypos, ballrad, 0xFF00FF);
jmelliadis3 0:e5c12b0faa24 159 uLCD.filled_rectangle(wall1x1, wall1y1, wall1x2, wall1y2, 0x00FF00);
jmelliadis3 0:e5c12b0faa24 160 uLCD.filled_rectangle(wall2x1, wall2y1, wall2x2, wall2y2, 0x00FF00);
jmelliadis3 0:e5c12b0faa24 161 ready = 1;
jmelliadis3 0:e5c12b0faa24 162 }
jmelliadis3 0:e5c12b0faa24 163
jmelliadis3 0:e5c12b0faa24 164 wall1x1--;
jmelliadis3 0:e5c12b0faa24 165 wall2x1--;
jmelliadis3 0:e5c12b0faa24 166 wall1x2--;
jmelliadis3 0:e5c12b0faa24 167 wall2x2--;
jmelliadis3 0:e5c12b0faa24 168
jmelliadis3 0:e5c12b0faa24 169 if (wall1x2 < -1)
jmelliadis3 0:e5c12b0faa24 170 {
jmelliadis3 0:e5c12b0faa24 171 wall1x2 = 148;
jmelliadis3 0:e5c12b0faa24 172 wall1x1 = 128;
jmelliadis3 0:e5c12b0faa24 173 wall2x2 = 148;
jmelliadis3 0:e5c12b0faa24 174 wall2x1 = 128;
jmelliadis3 0:e5c12b0faa24 175
jmelliadis3 0:e5c12b0faa24 176 wall1y2 = rand() % (73) + 8;
jmelliadis3 0:e5c12b0faa24 177 wall2y1 = wall1y2 + 48;
jmelliadis3 3:642d90f34496 178 scoreWrite = 1;
jmelliadis3 3:642d90f34496 179 }
jmelliadis3 3:642d90f34496 180
jmelliadis3 3:642d90f34496 181 if(wall1x2 < 95 && scoreWrite == 1)
jmelliadis3 3:642d90f34496 182 {
jmelliadis3 3:642d90f34496 183 uLCD.locate(14,0);
jmelliadis3 3:642d90f34496 184 uLCD.printf("%04d", score);
jmelliadis3 3:642d90f34496 185 scoreWrite = 0;
jmelliadis3 0:e5c12b0faa24 186 }
jmelliadis3 0:e5c12b0faa24 187
jmelliadis3 0:e5c12b0faa24 188
jmelliadis3 0:e5c12b0faa24 189 uLCD.filled_rectangle(wall1x1, wall1y1, wall1x2, wall1y2, 0x00FF00);
jmelliadis3 0:e5c12b0faa24 190 uLCD.filled_rectangle(wall2x1, wall2y1, wall2x2, wall2y2, 0x00FF00);
jmelliadis3 0:e5c12b0faa24 191 uLCD.line(wall1x2+1,wall1y1,wall1x2+1,wall1y2+1,0x0000FF);
jmelliadis3 0:e5c12b0faa24 192 uLCD.line(wall1x2+1,wall2y1,wall1x2+1,wall2y2+1,0x0000FF);
jmelliadis3 0:e5c12b0faa24 193
jmelliadis3 0:e5c12b0faa24 194 if (ballxpos == (wall1x1 + 10))
jmelliadis3 0:e5c12b0faa24 195 {
jmelliadis3 0:e5c12b0faa24 196 thread.signal_set(0x1);
jmelliadis3 0:e5c12b0faa24 197 score++;
jmelliadis3 0:e5c12b0faa24 198 wave_file=fopen("/sd/sfx_point.wav","r");
jmelliadis3 0:e5c12b0faa24 199 uLCD.locate(14,0);
jmelliadis3 0:e5c12b0faa24 200 uLCD.printf("%04d", score);
jmelliadis3 0:e5c12b0faa24 201 }
jmelliadis3 0:e5c12b0faa24 202
jmelliadis3 0:e5c12b0faa24 203 uLCD.filled_circle(ballxpos, ballypos, ballrad, 0x0000FF);
jmelliadis3 0:e5c12b0faa24 204 if (ballVel < 2)
jmelliadis3 0:e5c12b0faa24 205 ballVel++;
jmelliadis3 0:e5c12b0faa24 206
jmelliadis3 0:e5c12b0faa24 207 ballypos = ballypos + ballVel;
jmelliadis3 0:e5c12b0faa24 208 uLCD.filled_circle(ballxpos, ballypos, ballrad, 0xFF00FF);
jmelliadis3 0:e5c12b0faa24 209
jmelliadis3 0:e5c12b0faa24 210 if (ballypos - 2 < wall1y2) {
jmelliadis3 0:e5c12b0faa24 211 if (ballxpos+2 > wall1x1 && ballxpos-2 < wall1x2) {
jmelliadis3 0:e5c12b0faa24 212 state = over;
jmelliadis3 0:e5c12b0faa24 213 }
jmelliadis3 0:e5c12b0faa24 214 }
jmelliadis3 0:e5c12b0faa24 215 else if (ballypos + 2 > wall2y1) {
jmelliadis3 0:e5c12b0faa24 216 if (ballxpos+2 > wall2x1 && ballxpos-2 < wall2x2) {
jmelliadis3 0:e5c12b0faa24 217 state = over;
jmelliadis3 0:e5c12b0faa24 218 }
jmelliadis3 0:e5c12b0faa24 219 }
jmelliadis3 1:7d3e4ff9727c 220
jmelliadis3 1:7d3e4ff9727c 221 if (ballypos > 125) {
jmelliadis3 0:e5c12b0faa24 222 state = over;
jmelliadis3 0:e5c12b0faa24 223 }
jmelliadis3 0:e5c12b0faa24 224
jmelliadis3 0:e5c12b0faa24 225 break;
jmelliadis3 0:e5c12b0faa24 226
jmelliadis3 0:e5c12b0faa24 227 case over:
jmelliadis3 0:e5c12b0faa24 228 //open wav file
jmelliadis3 0:e5c12b0faa24 229 if (ready)
jmelliadis3 0:e5c12b0faa24 230 {
jmelliadis3 0:e5c12b0faa24 231 Thread::wait(300);
jmelliadis3 0:e5c12b0faa24 232 fclose(wave_file);
jmelliadis3 0:e5c12b0faa24 233 FILE *wave_file2;
jmelliadis3 0:e5c12b0faa24 234 wave_file2=fopen("/sd/sfx_hit.wav","r");
jmelliadis3 0:e5c12b0faa24 235
jmelliadis3 0:e5c12b0faa24 236 //play wav file
jmelliadis3 0:e5c12b0faa24 237 waver.play(wave_file2);
jmelliadis3 0:e5c12b0faa24 238
jmelliadis3 0:e5c12b0faa24 239 //close wav file
jmelliadis3 0:e5c12b0faa24 240 fclose(wave_file2);
jmelliadis3 2:22aa1c22ec77 241
jmelliadis3 2:22aa1c22ec77 242 if (ballypos < 125)
jmelliadis3 2:22aa1c22ec77 243 {
jmelliadis3 2:22aa1c22ec77 244 //wave_file2=fopen("/sd/sfx_die.wav","r");
jmelliadis3 2:22aa1c22ec77 245
jmelliadis3 2:22aa1c22ec77 246 //play wav file
jmelliadis3 2:22aa1c22ec77 247 //waver.play(wave_file2);
jmelliadis3 2:22aa1c22ec77 248
jmelliadis3 2:22aa1c22ec77 249 //close wav file
jmelliadis3 2:22aa1c22ec77 250 //fclose(wave_file2);
jmelliadis3 2:22aa1c22ec77 251
jmelliadis3 2:22aa1c22ec77 252 thread2.signal_set(0x1);
jmelliadis3 2:22aa1c22ec77 253
jmelliadis3 2:22aa1c22ec77 254 for (int i = ballypos; i < 125; i++)
jmelliadis3 2:22aa1c22ec77 255 {
jmelliadis3 2:22aa1c22ec77 256 uLCD.filled_circle(ballxpos, i, ballrad, 0x0000FF);
jmelliadis3 2:22aa1c22ec77 257 uLCD.filled_circle(ballxpos, i+1, ballrad, 0xFF00FF);
jmelliadis3 2:22aa1c22ec77 258 }
jmelliadis3 2:22aa1c22ec77 259 }
jmelliadis3 0:e5c12b0faa24 260
jmelliadis3 0:e5c12b0faa24 261 uLCD.locate(5,8);
jmelliadis3 0:e5c12b0faa24 262 uLCD.color(WHITE);
jmelliadis3 0:e5c12b0faa24 263 uLCD.textbackground_color(BLUE);
jmelliadis3 0:e5c12b0faa24 264 uLCD.text_mode(OPAQUE);
jmelliadis3 0:e5c12b0faa24 265 uLCD.set_font(FONT_7X8);
jmelliadis3 0:e5c12b0faa24 266 uLCD.printf("Game Over");
jmelliadis3 0:e5c12b0faa24 267
jmelliadis3 0:e5c12b0faa24 268 uLCD.locate(14,0);
jmelliadis3 0:e5c12b0faa24 269 uLCD.printf("%04d", score);
jmelliadis3 0:e5c12b0faa24 270 ready = 0;
jmelliadis3 0:e5c12b0faa24 271 score = 0;
jmelliadis3 0:e5c12b0faa24 272 }
jmelliadis3 0:e5c12b0faa24 273 break;
jmelliadis3 0:e5c12b0faa24 274 }
jmelliadis3 0:e5c12b0faa24 275 }
jmelliadis3 0:e5c12b0faa24 276 }