World War Zombies! Kirby vs. Zombies in an endless post apocalyptic brawl!

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

Committer:
zjohnson31
Date:
Wed Mar 16 17:04:50 2016 +0000
Revision:
0:4b2a1290ce3a
publish;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
zjohnson31 0:4b2a1290ce3a 1 #include "mbed.h"
zjohnson31 0:4b2a1290ce3a 2 #include "globals.h"
zjohnson31 0:4b2a1290ce3a 3 #include "Zombie.h"
zjohnson31 0:4b2a1290ce3a 4 #include "Player.h"
zjohnson31 0:4b2a1290ce3a 5 #include "uLCD_4DGL.h"
zjohnson31 0:4b2a1290ce3a 6 #include "wave_player.h"
zjohnson31 0:4b2a1290ce3a 7 #include "SDFileSystem.h"
zjohnson31 0:4b2a1290ce3a 8 #include "microphone.h"
zjohnson31 0:4b2a1290ce3a 9 #include "rtos.h"
zjohnson31 0:4b2a1290ce3a 10
zjohnson31 0:4b2a1290ce3a 11 void playSound(char * wav);
zjohnson31 0:4b2a1290ce3a 12 void noiseThread(void const* name);
zjohnson31 0:4b2a1290ce3a 13
zjohnson31 0:4b2a1290ce3a 14 // Global Objects
zjohnson31 0:4b2a1290ce3a 15 AnalogOut Speaker(p18);
zjohnson31 0:4b2a1290ce3a 16 SDFileSystem sd(p5, p6, p7, p8, "sd"); // SD card and filesystem (mosi, miso, sck, cs)
zjohnson31 0:4b2a1290ce3a 17 wave_player waver(&Speaker);
zjohnson31 0:4b2a1290ce3a 18 uLCD_4DGL uLCD(p28,p27,p30);
zjohnson31 0:4b2a1290ce3a 19 microphone mic(p16);
zjohnson31 0:4b2a1290ce3a 20 DigitalOut myled(LED1);
zjohnson31 0:4b2a1290ce3a 21 AnalogIn ir(p20);
zjohnson31 0:4b2a1290ce3a 22 Player p;
zjohnson31 0:4b2a1290ce3a 23 Timer timer;
zjohnson31 0:4b2a1290ce3a 24
zjohnson31 0:4b2a1290ce3a 25 Zombie * zombies = new Zombie[4];
zjohnson31 0:4b2a1290ce3a 26 Zombie * z;
zjohnson31 0:4b2a1290ce3a 27 float noise;
zjohnson31 0:4b2a1290ce3a 28 bool gameover = false;
zjohnson31 0:4b2a1290ce3a 29
zjohnson31 0:4b2a1290ce3a 30 void small_explosion(int, int);
zjohnson31 0:4b2a1290ce3a 31 void drawZombies();
zjohnson31 0:4b2a1290ce3a 32 void checkCollisions();
zjohnson31 0:4b2a1290ce3a 33 void eraseZombies();
zjohnson31 0:4b2a1290ce3a 34 void updateZombies();
zjohnson31 0:4b2a1290ce3a 35 void killFirstZombie(bool);
zjohnson31 0:4b2a1290ce3a 36 int ammo = 20;
zjohnson31 0:4b2a1290ce3a 37 int score = 0;
zjohnson31 0:4b2a1290ce3a 38 int jj = 5;
zjohnson31 0:4b2a1290ce3a 39 int jumpcounter = jj;
zjohnson31 0:4b2a1290ce3a 40 Mutex lcd_mutex;
zjohnson31 0:4b2a1290ce3a 41
zjohnson31 0:4b2a1290ce3a 42
zjohnson31 0:4b2a1290ce3a 43
zjohnson31 0:4b2a1290ce3a 44 int main() {
zjohnson31 0:4b2a1290ce3a 45 Thread t1(noiseThread);
zjohnson31 0:4b2a1290ce3a 46
zjohnson31 0:4b2a1290ce3a 47 //locals
zjohnson31 0:4b2a1290ce3a 48 //int tick,tock = 0;
zjohnson31 0:4b2a1290ce3a 49 int start = 1;
zjohnson31 0:4b2a1290ce3a 50 bool ready,jump = false;
zjohnson31 0:4b2a1290ce3a 51 float irRead;
zjohnson31 0:4b2a1290ce3a 52 timer.start();
zjohnson31 0:4b2a1290ce3a 53
zjohnson31 0:4b2a1290ce3a 54
zjohnson31 0:4b2a1290ce3a 55 start = 1;
zjohnson31 0:4b2a1290ce3a 56 if(start == 1){
zjohnson31 0:4b2a1290ce3a 57 uLCD.text_string("", 0, 0, FONT_7X8, WHITE);
zjohnson31 0:4b2a1290ce3a 58 uLCD.text_width(2);
zjohnson31 0:4b2a1290ce3a 59 uLCD.text_height(2);
zjohnson31 0:4b2a1290ce3a 60 uLCD.printf("WORLD WAR \nZOMBIES!\n\n\n");
zjohnson31 0:4b2a1290ce3a 61 wait(1);
zjohnson31 0:4b2a1290ce3a 62 uLCD.text_width(1);
zjohnson31 0:4b2a1290ce3a 63 uLCD.text_height(1);
zjohnson31 0:4b2a1290ce3a 64 uLCD.printf("\n\nTo fire, place \nhand in front \nof IR, to jump\nsay jump in\nthe mic.");
zjohnson31 0:4b2a1290ce3a 65 wait(5);
zjohnson31 0:4b2a1290ce3a 66 uLCD.cls();
zjohnson31 0:4b2a1290ce3a 67 uLCD.text_string("", 0, 0, FONT_7X8, RED);
zjohnson31 0:4b2a1290ce3a 68 uLCD.printf("To begin the\ngame, make a\nnoise near the\nmic!");
zjohnson31 0:4b2a1290ce3a 69 while(!ready){
zjohnson31 0:4b2a1290ce3a 70 noise = int(abs((mic - (0.67/3.3)))*500.0);
zjohnson31 0:4b2a1290ce3a 71 if(noise>3){
zjohnson31 0:4b2a1290ce3a 72 ready = true;
zjohnson31 0:4b2a1290ce3a 73 uLCD.cls();
zjohnson31 0:4b2a1290ce3a 74 noise = 0;
zjohnson31 0:4b2a1290ce3a 75 }
zjohnson31 0:4b2a1290ce3a 76 }//while
zjohnson31 0:4b2a1290ce3a 77 }//if
zjohnson31 0:4b2a1290ce3a 78
zjohnson31 0:4b2a1290ce3a 79 //Zombie z1,z2,z3,z4;
zjohnson31 0:4b2a1290ce3a 80 for (int i = 1; i < 4; i++)
zjohnson31 0:4b2a1290ce3a 81 {
zjohnson31 0:4b2a1290ce3a 82 zombies[i].posX = zombies[i-1].posX + 45;
zjohnson31 0:4b2a1290ce3a 83 }
zjohnson31 0:4b2a1290ce3a 84 float fmic = .67/3.3;
zjohnson31 0:4b2a1290ce3a 85 float pmic = fmic;
zjohnson31 0:4b2a1290ce3a 86 p.draw();
zjohnson31 0:4b2a1290ce3a 87 while(!gameover){
zjohnson31 0:4b2a1290ce3a 88 uLCD.locate(0,0);
zjohnson31 0:4b2a1290ce3a 89 uLCD.printf("Ammo: %d\nScore: %d\n", p.ammo, killed);
zjohnson31 0:4b2a1290ce3a 90 pmic = fmic;
zjohnson31 0:4b2a1290ce3a 91 fmic = (abs(mic - (0.67/3.3)))*500.0;
zjohnson31 0:4b2a1290ce3a 92 // uLCD.printf("mic: %f", fmic);
zjohnson31 0:4b2a1290ce3a 93 //drawZombies();
zjohnson31 0:4b2a1290ce3a 94 checkCollisions();
zjohnson31 0:4b2a1290ce3a 95 //eraseZombies();
zjohnson31 0:4b2a1290ce3a 96 updateZombies();
zjohnson31 0:4b2a1290ce3a 97
zjohnson31 0:4b2a1290ce3a 98 irRead = ir;
zjohnson31 0:4b2a1290ce3a 99 irRead -= 1;
zjohnson31 0:4b2a1290ce3a 100 irRead *= -1;
zjohnson31 0:4b2a1290ce3a 101
zjohnson31 0:4b2a1290ce3a 102 jump = jump || fmic-pmic > 1.5;
zjohnson31 0:4b2a1290ce3a 103
zjohnson31 0:4b2a1290ce3a 104 if(jump && jumpcounter > 0){
zjohnson31 0:4b2a1290ce3a 105 if (jumpcounter == jj)
zjohnson31 0:4b2a1290ce3a 106 {
zjohnson31 0:4b2a1290ce3a 107 p.erase();
zjohnson31 0:4b2a1290ce3a 108 p.posY = 127-18;
zjohnson31 0:4b2a1290ce3a 109 p.draw();
zjohnson31 0:4b2a1290ce3a 110 }
zjohnson31 0:4b2a1290ce3a 111 jumpcounter--;
zjohnson31 0:4b2a1290ce3a 112 }// jump
zjohnson31 0:4b2a1290ce3a 113 else if (jumpcounter == 0)
zjohnson31 0:4b2a1290ce3a 114 {
zjohnson31 0:4b2a1290ce3a 115 p.erase();
zjohnson31 0:4b2a1290ce3a 116 p.posY = 127;
zjohnson31 0:4b2a1290ce3a 117 jumpcounter = jj;
zjohnson31 0:4b2a1290ce3a 118 jump = false;
zjohnson31 0:4b2a1290ce3a 119 p.draw();
zjohnson31 0:4b2a1290ce3a 120 }
zjohnson31 0:4b2a1290ce3a 121
zjohnson31 0:4b2a1290ce3a 122 // p.draw();
zjohnson31 0:4b2a1290ce3a 123
zjohnson31 0:4b2a1290ce3a 124 wait(0.1);
zjohnson31 0:4b2a1290ce3a 125
zjohnson31 0:4b2a1290ce3a 126 //player input to shoot zombie
zjohnson31 0:4b2a1290ce3a 127 if(irRead < 0.5){
zjohnson31 0:4b2a1290ce3a 128 //check collision with zombies if there is ammo
zjohnson31 0:4b2a1290ce3a 129 if(p.ammo>0){
zjohnson31 0:4b2a1290ce3a 130 //shoot
zjohnson31 0:4b2a1290ce3a 131 p.ammo -=1;
zjohnson31 0:4b2a1290ce3a 132 uLCD.filled_rectangle(0, 0,127,127,WHITE);
zjohnson31 0:4b2a1290ce3a 133
zjohnson31 0:4b2a1290ce3a 134 //if zombie on screen, kill front most
zjohnson31 0:4b2a1290ce3a 135 // function finds first zombie, kill it, increment kill counter
zjohnson31 0:4b2a1290ce3a 136 killFirstZombie(jump);
zjohnson31 0:4b2a1290ce3a 137
zjohnson31 0:4b2a1290ce3a 138
zjohnson31 0:4b2a1290ce3a 139 uLCD.filled_rectangle(0, 0,127,127,BLACK);
zjohnson31 0:4b2a1290ce3a 140 p.draw();
zjohnson31 0:4b2a1290ce3a 141 }
zjohnson31 0:4b2a1290ce3a 142 }
zjohnson31 0:4b2a1290ce3a 143
zjohnson31 0:4b2a1290ce3a 144 wait(1/10000);
zjohnson31 0:4b2a1290ce3a 145 }//while not gameover
zjohnson31 0:4b2a1290ce3a 146 uLCD.cls();
zjohnson31 0:4b2a1290ce3a 147
zjohnson31 0:4b2a1290ce3a 148 small_explosion(115, 119);
zjohnson31 0:4b2a1290ce3a 149 small_explosion(38, 77);
zjohnson31 0:4b2a1290ce3a 150 small_explosion(66, 39);
zjohnson31 0:4b2a1290ce3a 151 small_explosion(33, 50);
zjohnson31 0:4b2a1290ce3a 152 small_explosion(72, 60);
zjohnson31 0:4b2a1290ce3a 153 small_explosion(8, 57);
zjohnson31 0:4b2a1290ce3a 154 small_explosion(30, 80);
zjohnson31 0:4b2a1290ce3a 155 small_explosion(46, 48);
zjohnson31 0:4b2a1290ce3a 156 small_explosion(76, 44);
zjohnson31 0:4b2a1290ce3a 157 small_explosion(49, 101);
zjohnson31 0:4b2a1290ce3a 158 small_explosion(p.posX,p.posY-5);
zjohnson31 0:4b2a1290ce3a 159 uLCD.text_string("", 0, 0, FONT_7X8, WHITE);
zjohnson31 0:4b2a1290ce3a 160 uLCD.text_width(2);
zjohnson31 0:4b2a1290ce3a 161 uLCD.text_height(2);
zjohnson31 0:4b2a1290ce3a 162 uLCD.printf("GAME OVER \nScore: %d\n\n\n", killed);
zjohnson31 0:4b2a1290ce3a 163 }//main
zjohnson31 0:4b2a1290ce3a 164
zjohnson31 0:4b2a1290ce3a 165 //plays a wav file from sd card
zjohnson31 0:4b2a1290ce3a 166 void playSound(char * wav)
zjohnson31 0:4b2a1290ce3a 167 {
zjohnson31 0:4b2a1290ce3a 168 // open wav file
zjohnson31 0:4b2a1290ce3a 169 FILE *wave_file;
zjohnson31 0:4b2a1290ce3a 170 wave_file=fopen(wav,"r");
zjohnson31 0:4b2a1290ce3a 171
zjohnson31 0:4b2a1290ce3a 172 if(wave_file == NULL){
zjohnson31 0:4b2a1290ce3a 173 uLCD.locate(9,0);
zjohnson31 0:4b2a1290ce3a 174 uLCD.printf("ERROR_SD");
zjohnson31 0:4b2a1290ce3a 175 return;
zjohnson31 0:4b2a1290ce3a 176 }
zjohnson31 0:4b2a1290ce3a 177
zjohnson31 0:4b2a1290ce3a 178 // play wav file
zjohnson31 0:4b2a1290ce3a 179 waver.play(wave_file);
zjohnson31 0:4b2a1290ce3a 180
zjohnson31 0:4b2a1290ce3a 181 fclose(wave_file);
zjohnson31 0:4b2a1290ce3a 182 return;
zjohnson31 0:4b2a1290ce3a 183 }//playsound
zjohnson31 0:4b2a1290ce3a 184
zjohnson31 0:4b2a1290ce3a 185 void noiseThread(void const* name){
zjohnson31 0:4b2a1290ce3a 186
zjohnson31 0:4b2a1290ce3a 187 //Thread::wait(2);
zjohnson31 0:4b2a1290ce3a 188 while(1) playSound("/sd/wavfiles/titlemusic.wav");
zjohnson31 0:4b2a1290ce3a 189 //{
zjohnson31 0:4b2a1290ce3a 190 //noise = (abs((mic - (0.67/3.3)))*500.0);
zjohnson31 0:4b2a1290ce3a 191 //Use an 8kHz audio sample rate (phone quality audio);
zjohnson31 0:4b2a1290ce3a 192 // Thread::wait(1.0/8000.0);
zjohnson31 0:4b2a1290ce3a 193 //}
zjohnson31 0:4b2a1290ce3a 194 }//noisethread
zjohnson31 0:4b2a1290ce3a 195
zjohnson31 0:4b2a1290ce3a 196
zjohnson31 0:4b2a1290ce3a 197 // this function draws all the zombies on the screen
zjohnson31 0:4b2a1290ce3a 198 void drawZombies()
zjohnson31 0:4b2a1290ce3a 199 {
zjohnson31 0:4b2a1290ce3a 200 for (int i = 0; i < 4; i++)
zjohnson31 0:4b2a1290ce3a 201 {
zjohnson31 0:4b2a1290ce3a 202 z = &zombies[i];
zjohnson31 0:4b2a1290ce3a 203 if ((*z).alive && (*z).posX <= 127)
zjohnson31 0:4b2a1290ce3a 204 {
zjohnson31 0:4b2a1290ce3a 205 (*z).draw();
zjohnson31 0:4b2a1290ce3a 206 }
zjohnson31 0:4b2a1290ce3a 207 }
zjohnson31 0:4b2a1290ce3a 208 }
zjohnson31 0:4b2a1290ce3a 209
zjohnson31 0:4b2a1290ce3a 210 void checkCollisions()
zjohnson31 0:4b2a1290ce3a 211 {
zjohnson31 0:4b2a1290ce3a 212 for (int i = 0; i < 4; i++)
zjohnson31 0:4b2a1290ce3a 213 {
zjohnson31 0:4b2a1290ce3a 214 z = &zombies[i];
zjohnson31 0:4b2a1290ce3a 215 int x1 = p.posX;
zjohnson31 0:4b2a1290ce3a 216 int x2 = p.posX + 10;
zjohnson31 0:4b2a1290ce3a 217 int y = p.posY;
zjohnson31 0:4b2a1290ce3a 218 if (((*z).posX-12 >= x1 && (*z).posX-12 <= x2) && (y == (*z).posY))
zjohnson31 0:4b2a1290ce3a 219 {
zjohnson31 0:4b2a1290ce3a 220 gameover = true;
zjohnson31 0:4b2a1290ce3a 221 }
zjohnson31 0:4b2a1290ce3a 222 }
zjohnson31 0:4b2a1290ce3a 223 }
zjohnson31 0:4b2a1290ce3a 224
zjohnson31 0:4b2a1290ce3a 225 void eraseZombies()
zjohnson31 0:4b2a1290ce3a 226 {
zjohnson31 0:4b2a1290ce3a 227 for (int i = 0; i < 4; i++)
zjohnson31 0:4b2a1290ce3a 228 {
zjohnson31 0:4b2a1290ce3a 229 z = &zombies[i];
zjohnson31 0:4b2a1290ce3a 230 if ((*z).alive && (*z).posX <= 127)
zjohnson31 0:4b2a1290ce3a 231 {
zjohnson31 0:4b2a1290ce3a 232 (*z).erase();
zjohnson31 0:4b2a1290ce3a 233 }
zjohnson31 0:4b2a1290ce3a 234 }
zjohnson31 0:4b2a1290ce3a 235 }
zjohnson31 0:4b2a1290ce3a 236
zjohnson31 0:4b2a1290ce3a 237 void updateZombies()
zjohnson31 0:4b2a1290ce3a 238 {
zjohnson31 0:4b2a1290ce3a 239 for (int i = 0; i < 4; i++)
zjohnson31 0:4b2a1290ce3a 240 {
zjohnson31 0:4b2a1290ce3a 241 z = &zombies[i];
zjohnson31 0:4b2a1290ce3a 242 if ((*z).alive)
zjohnson31 0:4b2a1290ce3a 243 {
zjohnson31 0:4b2a1290ce3a 244 (*z).move();
zjohnson31 0:4b2a1290ce3a 245 if ((*z).posX <= 5)
zjohnson31 0:4b2a1290ce3a 246 {
zjohnson31 0:4b2a1290ce3a 247 z->kill();
zjohnson31 0:4b2a1290ce3a 248 z->erase();
zjohnson31 0:4b2a1290ce3a 249 }
zjohnson31 0:4b2a1290ce3a 250 }
zjohnson31 0:4b2a1290ce3a 251 }
zjohnson31 0:4b2a1290ce3a 252 }
zjohnson31 0:4b2a1290ce3a 253
zjohnson31 0:4b2a1290ce3a 254 void killFirstZombie(bool jump)
zjohnson31 0:4b2a1290ce3a 255 {
zjohnson31 0:4b2a1290ce3a 256 int first = 0;
zjohnson31 0:4b2a1290ce3a 257 int last = 0;
zjohnson31 0:4b2a1290ce3a 258 int x = 128;
zjohnson31 0:4b2a1290ce3a 259 int x2 = 128;
zjohnson31 0:4b2a1290ce3a 260 // find first zombie
zjohnson31 0:4b2a1290ce3a 261 for (int i = 0; i < 4; i++)
zjohnson31 0:4b2a1290ce3a 262 {
zjohnson31 0:4b2a1290ce3a 263 z = &zombies[i];
zjohnson31 0:4b2a1290ce3a 264 if ((*z).posX < x && z->alive)
zjohnson31 0:4b2a1290ce3a 265 {
zjohnson31 0:4b2a1290ce3a 266 first = i;
zjohnson31 0:4b2a1290ce3a 267 x = (*z).posX;
zjohnson31 0:4b2a1290ce3a 268 }
zjohnson31 0:4b2a1290ce3a 269 else if ((*z).posX > x2 && (*z).alive)
zjohnson31 0:4b2a1290ce3a 270 {
zjohnson31 0:4b2a1290ce3a 271 last = i;
zjohnson31 0:4b2a1290ce3a 272 x2 = (*z).posX;
zjohnson31 0:4b2a1290ce3a 273 }
zjohnson31 0:4b2a1290ce3a 274 }
zjohnson31 0:4b2a1290ce3a 275 // kill first zombie
zjohnson31 0:4b2a1290ce3a 276 z = &zombies[first];
zjohnson31 0:4b2a1290ce3a 277 if (z->alive)
zjohnson31 0:4b2a1290ce3a 278 {
zjohnson31 0:4b2a1290ce3a 279 z->kill();
zjohnson31 0:4b2a1290ce3a 280 if (jump) killed++;
zjohnson31 0:4b2a1290ce3a 281 z->erase();
zjohnson31 0:4b2a1290ce3a 282 small_explosion(x, 125);
zjohnson31 0:4b2a1290ce3a 283 z->posX = x2 + 45;
zjohnson31 0:4b2a1290ce3a 284 z->alive = true;
zjohnson31 0:4b2a1290ce3a 285 }
zjohnson31 0:4b2a1290ce3a 286 }
zjohnson31 0:4b2a1290ce3a 287
zjohnson31 0:4b2a1290ce3a 288 /*
zjohnson31 0:4b2a1290ce3a 289 * This makes explosion
zjohnson31 0:4b2a1290ce3a 290 */
zjohnson31 0:4b2a1290ce3a 291 void small_explosion(int x, int y) {
zjohnson31 0:4b2a1290ce3a 292 uLCD.filled_circle(x, y, 2, 0xFF22BB);
zjohnson31 0:4b2a1290ce3a 293 uLCD.filled_circle(x, y, 1, 0);
zjohnson31 0:4b2a1290ce3a 294 uLCD.filled_circle(x, y, 3, 0xFF22BB);
zjohnson31 0:4b2a1290ce3a 295 uLCD.filled_circle(x, y, 1, 0);
zjohnson31 0:4b2a1290ce3a 296 uLCD.filled_circle(x, y, 4, 0xFF22BB);
zjohnson31 0:4b2a1290ce3a 297 uLCD.filled_circle(x, y, 2, 0);
zjohnson31 0:4b2a1290ce3a 298 uLCD.filled_circle(x, y, 5, 0xFF22BB);
zjohnson31 0:4b2a1290ce3a 299 uLCD.filled_circle(x, y, 3, 0);
zjohnson31 0:4b2a1290ce3a 300 uLCD.filled_circle(x, y, 6, 0xFF22BB);
zjohnson31 0:4b2a1290ce3a 301 uLCD.filled_circle(x, y, 4, 0);
zjohnson31 0:4b2a1290ce3a 302 uLCD.filled_circle(x, y, 7, 0xFF22BB);
zjohnson31 0:4b2a1290ce3a 303 uLCD.filled_circle(x, y, 5, 0);
zjohnson31 0:4b2a1290ce3a 304 uLCD.filled_circle(x, y, 7, 0);
zjohnson31 0:4b2a1290ce3a 305 }