Initial Flappy mbed Game

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

Committer:
jmelliadis3
Date:
Mon Mar 24 15:04:47 2014 +0000
Revision:
2:22aa1c22ec77
Parent:
1:7d3e4ff9727c
Child:
3:642d90f34496
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 0:e5c12b0faa24 118 while(go) {
jmelliadis3 0:e5c12b0faa24 119
jmelliadis3 0:e5c12b0faa24 120 switch (state) {
jmelliadis3 0:e5c12b0faa24 121 case begin:
jmelliadis3 0:e5c12b0faa24 122
jmelliadis3 0:e5c12b0faa24 123 uLCD.locate(4,2);
jmelliadis3 0:e5c12b0faa24 124 uLCD.color(WHITE);
jmelliadis3 0:e5c12b0faa24 125 uLCD.textbackground_color(BLUE);
jmelliadis3 0:e5c12b0faa24 126 uLCD.text_mode(OPAQUE);
jmelliadis3 0:e5c12b0faa24 127 uLCD.set_font(FONT_7X8);
jmelliadis3 0:e5c12b0faa24 128 uLCD.printf("Flappy mbed");
jmelliadis3 0:e5c12b0faa24 129
jmelliadis3 0:e5c12b0faa24 130 uLCD.locate(1,10);
jmelliadis3 0:e5c12b0faa24 131 uLCD.printf("Press PB to Start");
jmelliadis3 0:e5c12b0faa24 132 ready = 0;
jmelliadis3 0:e5c12b0faa24 133
jmelliadis3 0:e5c12b0faa24 134
jmelliadis3 0:e5c12b0faa24 135 break;
jmelliadis3 0:e5c12b0faa24 136
jmelliadis3 0:e5c12b0faa24 137 case playing:
jmelliadis3 0:e5c12b0faa24 138
jmelliadis3 0:e5c12b0faa24 139 if (!ready)
jmelliadis3 0:e5c12b0faa24 140 {
jmelliadis3 0:e5c12b0faa24 141 uLCD.cls();
jmelliadis3 0:e5c12b0faa24 142
jmelliadis3 0:e5c12b0faa24 143 wall1x1 = 80;
jmelliadis3 0:e5c12b0faa24 144 wall1x2 = 100;
jmelliadis3 0:e5c12b0faa24 145 wall1y1 = 0;
jmelliadis3 0:e5c12b0faa24 146 wall1y2 = 40;
jmelliadis3 0:e5c12b0faa24 147 wall2x1 = 80;
jmelliadis3 0:e5c12b0faa24 148 wall2x2 = 100;
jmelliadis3 0:e5c12b0faa24 149 wall2y1 = 88;
jmelliadis3 0:e5c12b0faa24 150 wall2y2 = 128;
jmelliadis3 0:e5c12b0faa24 151
jmelliadis3 0:e5c12b0faa24 152 ballxpos = 30;
jmelliadis3 0:e5c12b0faa24 153 ballypos = 64;
jmelliadis3 0:e5c12b0faa24 154 ballrad = 3;
jmelliadis3 0:e5c12b0faa24 155
jmelliadis3 0:e5c12b0faa24 156 uLCD.filled_rectangle(0,0,128,128,0x0000FF);
jmelliadis3 0:e5c12b0faa24 157 uLCD.filled_circle(ballxpos, ballypos, ballrad, 0xFF00FF);
jmelliadis3 0:e5c12b0faa24 158 uLCD.filled_rectangle(wall1x1, wall1y1, wall1x2, wall1y2, 0x00FF00);
jmelliadis3 0:e5c12b0faa24 159 uLCD.filled_rectangle(wall2x1, wall2y1, wall2x2, wall2y2, 0x00FF00);
jmelliadis3 0:e5c12b0faa24 160 ready = 1;
jmelliadis3 0:e5c12b0faa24 161 }
jmelliadis3 0:e5c12b0faa24 162
jmelliadis3 0:e5c12b0faa24 163 wall1x1--;
jmelliadis3 0:e5c12b0faa24 164 wall2x1--;
jmelliadis3 0:e5c12b0faa24 165 wall1x2--;
jmelliadis3 0:e5c12b0faa24 166 wall2x2--;
jmelliadis3 0:e5c12b0faa24 167
jmelliadis3 0:e5c12b0faa24 168 if (wall1x2 < -1)
jmelliadis3 0:e5c12b0faa24 169 {
jmelliadis3 0:e5c12b0faa24 170 wall1x2 = 148;
jmelliadis3 0:e5c12b0faa24 171 wall1x1 = 128;
jmelliadis3 0:e5c12b0faa24 172 wall2x2 = 148;
jmelliadis3 0:e5c12b0faa24 173 wall2x1 = 128;
jmelliadis3 0:e5c12b0faa24 174
jmelliadis3 0:e5c12b0faa24 175 wall1y2 = rand() % (73) + 8;
jmelliadis3 0:e5c12b0faa24 176 wall2y1 = wall1y2 + 48;
jmelliadis3 0:e5c12b0faa24 177 }
jmelliadis3 0:e5c12b0faa24 178
jmelliadis3 0:e5c12b0faa24 179
jmelliadis3 0:e5c12b0faa24 180 uLCD.filled_rectangle(wall1x1, wall1y1, wall1x2, wall1y2, 0x00FF00);
jmelliadis3 0:e5c12b0faa24 181 uLCD.filled_rectangle(wall2x1, wall2y1, wall2x2, wall2y2, 0x00FF00);
jmelliadis3 0:e5c12b0faa24 182 uLCD.line(wall1x2+1,wall1y1,wall1x2+1,wall1y2+1,0x0000FF);
jmelliadis3 0:e5c12b0faa24 183 uLCD.line(wall1x2+1,wall2y1,wall1x2+1,wall2y2+1,0x0000FF);
jmelliadis3 0:e5c12b0faa24 184
jmelliadis3 0:e5c12b0faa24 185 if (ballxpos == (wall1x1 + 10))
jmelliadis3 0:e5c12b0faa24 186 {
jmelliadis3 0:e5c12b0faa24 187 thread.signal_set(0x1);
jmelliadis3 0:e5c12b0faa24 188 score++;
jmelliadis3 0:e5c12b0faa24 189 wave_file=fopen("/sd/sfx_point.wav","r");
jmelliadis3 0:e5c12b0faa24 190 uLCD.locate(14,0);
jmelliadis3 0:e5c12b0faa24 191 uLCD.printf("%04d", score);
jmelliadis3 0:e5c12b0faa24 192 }
jmelliadis3 0:e5c12b0faa24 193
jmelliadis3 0:e5c12b0faa24 194 uLCD.filled_circle(ballxpos, ballypos, ballrad, 0x0000FF);
jmelliadis3 0:e5c12b0faa24 195 if (ballVel < 2)
jmelliadis3 0:e5c12b0faa24 196 ballVel++;
jmelliadis3 0:e5c12b0faa24 197
jmelliadis3 0:e5c12b0faa24 198 ballypos = ballypos + ballVel;
jmelliadis3 0:e5c12b0faa24 199 uLCD.filled_circle(ballxpos, ballypos, ballrad, 0xFF00FF);
jmelliadis3 0:e5c12b0faa24 200
jmelliadis3 0:e5c12b0faa24 201 if (ballypos - 2 < wall1y2) {
jmelliadis3 0:e5c12b0faa24 202 if (ballxpos+2 > wall1x1 && ballxpos-2 < wall1x2) {
jmelliadis3 0:e5c12b0faa24 203 state = over;
jmelliadis3 0:e5c12b0faa24 204 }
jmelliadis3 0:e5c12b0faa24 205 }
jmelliadis3 0:e5c12b0faa24 206 else if (ballypos + 2 > wall2y1) {
jmelliadis3 0:e5c12b0faa24 207 if (ballxpos+2 > wall2x1 && ballxpos-2 < wall2x2) {
jmelliadis3 0:e5c12b0faa24 208 state = over;
jmelliadis3 0:e5c12b0faa24 209 }
jmelliadis3 0:e5c12b0faa24 210 }
jmelliadis3 1:7d3e4ff9727c 211
jmelliadis3 1:7d3e4ff9727c 212 if (ballypos > 125) {
jmelliadis3 0:e5c12b0faa24 213 state = over;
jmelliadis3 0:e5c12b0faa24 214 }
jmelliadis3 0:e5c12b0faa24 215
jmelliadis3 0:e5c12b0faa24 216 break;
jmelliadis3 0:e5c12b0faa24 217
jmelliadis3 0:e5c12b0faa24 218 case over:
jmelliadis3 0:e5c12b0faa24 219 //open wav file
jmelliadis3 0:e5c12b0faa24 220 if (ready)
jmelliadis3 0:e5c12b0faa24 221 {
jmelliadis3 0:e5c12b0faa24 222 Thread::wait(300);
jmelliadis3 0:e5c12b0faa24 223 fclose(wave_file);
jmelliadis3 0:e5c12b0faa24 224 FILE *wave_file2;
jmelliadis3 0:e5c12b0faa24 225 wave_file2=fopen("/sd/sfx_hit.wav","r");
jmelliadis3 0:e5c12b0faa24 226
jmelliadis3 0:e5c12b0faa24 227 //play wav file
jmelliadis3 0:e5c12b0faa24 228 waver.play(wave_file2);
jmelliadis3 0:e5c12b0faa24 229
jmelliadis3 0:e5c12b0faa24 230 //close wav file
jmelliadis3 0:e5c12b0faa24 231 fclose(wave_file2);
jmelliadis3 2:22aa1c22ec77 232
jmelliadis3 2:22aa1c22ec77 233 if (ballypos < 125)
jmelliadis3 2:22aa1c22ec77 234 {
jmelliadis3 2:22aa1c22ec77 235 //wave_file2=fopen("/sd/sfx_die.wav","r");
jmelliadis3 2:22aa1c22ec77 236
jmelliadis3 2:22aa1c22ec77 237 //play wav file
jmelliadis3 2:22aa1c22ec77 238 //waver.play(wave_file2);
jmelliadis3 2:22aa1c22ec77 239
jmelliadis3 2:22aa1c22ec77 240 //close wav file
jmelliadis3 2:22aa1c22ec77 241 //fclose(wave_file2);
jmelliadis3 2:22aa1c22ec77 242
jmelliadis3 2:22aa1c22ec77 243 thread2.signal_set(0x1);
jmelliadis3 2:22aa1c22ec77 244
jmelliadis3 2:22aa1c22ec77 245 for (int i = ballypos; i < 125; i++)
jmelliadis3 2:22aa1c22ec77 246 {
jmelliadis3 2:22aa1c22ec77 247 uLCD.filled_circle(ballxpos, i, ballrad, 0x0000FF);
jmelliadis3 2:22aa1c22ec77 248 uLCD.filled_circle(ballxpos, i+1, ballrad, 0xFF00FF);
jmelliadis3 2:22aa1c22ec77 249 }
jmelliadis3 2:22aa1c22ec77 250 }
jmelliadis3 0:e5c12b0faa24 251
jmelliadis3 0:e5c12b0faa24 252 uLCD.locate(5,8);
jmelliadis3 0:e5c12b0faa24 253 uLCD.color(WHITE);
jmelliadis3 0:e5c12b0faa24 254 uLCD.textbackground_color(BLUE);
jmelliadis3 0:e5c12b0faa24 255 uLCD.text_mode(OPAQUE);
jmelliadis3 0:e5c12b0faa24 256 uLCD.set_font(FONT_7X8);
jmelliadis3 0:e5c12b0faa24 257 uLCD.printf("Game Over");
jmelliadis3 0:e5c12b0faa24 258
jmelliadis3 0:e5c12b0faa24 259 uLCD.locate(14,0);
jmelliadis3 0:e5c12b0faa24 260 uLCD.printf("%04d", score);
jmelliadis3 0:e5c12b0faa24 261 ready = 0;
jmelliadis3 0:e5c12b0faa24 262 score = 0;
jmelliadis3 0:e5c12b0faa24 263 }
jmelliadis3 0:e5c12b0faa24 264 break;
jmelliadis3 0:e5c12b0faa24 265 }
jmelliadis3 0:e5c12b0faa24 266 }
jmelliadis3 0:e5c12b0faa24 267 }