Joseph Boettcher / ECE4180_Lab4_Sharpshooter

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

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers MainGame.cpp Source File

MainGame.cpp

00001 #include "mbed.h"
00002 #include "Speaker.h"
00003 #include "uLCD_4DGL.h"
00004 #include "SDFileSystem.h"
00005 #include "wave_player.h"
00006 #include "Nav_Switch.h"
00007 #include "rtos.h"
00008 #include "Obstacle.h"
00009 #include "Shooter.h"
00010 #include "Bullet.h"
00011 
00012 /*DIRECTIVES*/
00013 #define NUMTRIES 10
00014 
00015 /*INSTANTIATION*/
00016 DigitalOut myled1(LED1);
00017 DigitalOut myled2(LED2);
00018 DigitalOut myled3(LED3);
00019 DigitalOut myled4(LED4);
00020 
00021 InterruptIn center(p25);
00022 InterruptIn left(p26);
00023 InterruptIn right(p28);
00024 
00025 uLCD_4DGL uLCD(p9,p10,p11); // serial tx, serial rx, reset pin;
00026 Nav_Switch myNav( p24, p25, p26, p27, p28); //up, down, left, right, fire
00027 SDFileSystem sd(p5, p6, p7, p8, "sd");
00028 AnalogOut DACout(p18);
00029 wave_player waver(&DACout);
00030 Shooter player1;
00031 Bullet bullet;
00032 bool isBullet;
00033 Mutex mutex;
00034 
00035 /*STRUCT INITIALIZATION*/
00036 struct TargetLocation {
00037     int x,y,r;
00038 };
00039 
00040 /*GLOBAL VARIABLES*/
00041 int numTries;
00042 int levelNum;
00043 BulletLocation bulletLocation;
00044 Obstacle obsArr[3];
00045 TargetLocation * targetsPtr = new TargetLocation[3];
00046 bool play = 0;
00047 int targetY = 15;
00048 int targetRad = 5;
00049 int targetsLeft = 3;
00050 bool targetsHit[3];
00051 
00052 void startGame() {
00053     uLCD.background_color(BACKGROUND);
00054     uLCD.filled_rectangle(0,0,127,127,BLUE);
00055     uLCD.locate(3,6);
00056     uLCD.printf("Sharp Shooter!");
00057     wait(0.1);
00058     
00059     FILE *wave_file;
00060     wave_file=fopen("/sd/wavfiles/intro.wav","r");
00061     waver.play(wave_file);
00062     fclose(wave_file);
00063     
00064     wait(0.3);
00065     uLCD.cls();
00066 }
00067 
00068 void createTargets() {
00069     //draw all targets
00070     uLCD.filled_circle(24,targetY,targetRad,TARGET);
00071     uLCD.filled_circle(64,targetY,targetRad,TARGET);
00072     uLCD.filled_circle(104,targetY,targetRad,TARGET);
00073     targetsLeft = 3;
00074     for (int i=0; i<targetsLeft; i++) {
00075         targetsHit[i] = 0;
00076     }
00077 }
00078 
00079 void createShooter() {
00080     player1.drawShooter();
00081 }
00082 
00083 void createObstacles(int num) {
00084     //instantiate obstacles and store in obsArr
00085     if (num == 1) { //if Level 1
00086         obsArr[0] = Obstacle(2, 62, 50, 65);
00087         obsArr[0].setDirection(1);
00088     } else if (num == 2) { //if Level 2
00089         obsArr[0] = Obstacle(2, 62, 50, 65);
00090         obsArr[0].setDirection(1);
00091         obsArr[1] = Obstacle(67, 32, 115, 35);
00092         obsArr[1].setDirection(0);
00093     } else if (num == 3) { //if Level 3
00094         obsArr[0] = Obstacle(2, 62, 50, 65);
00095         obsArr[0].setDirection(1);
00096         obsArr[1] = Obstacle(67, 32, 115, 35);
00097         obsArr[1].setDirection(0);
00098         obsArr[2] = Obstacle(48, 48, 96, 51);
00099         obsArr[2].setDirection(1);        
00100     }
00101     //draw obstacles
00102     for (int i = 0; i < num; i++) {
00103         obsArr[i].drawObstacle();
00104     }   
00105 }
00106 
00107 void drawHeader() {
00108     mutex.lock();
00109     if (numTries>=9) uLCD.filled_rectangle(0,0,128,7,BLACK); //clear header if over double digits
00110     uLCD.locate(0,0);
00111     uLCD.printf("LEVEL:%d BULLETS:%d", levelNum, numTries);
00112     mutex.unlock();
00113 }
00114 
00115 void initializeLevel() {
00116     mutex.lock();
00117     uLCD.cls();
00118     mutex.unlock();
00119     numTries = NUMTRIES;
00120     drawHeader();
00121     createTargets();
00122     createObstacles(levelNum);
00123     createShooter();
00124 }
00125 
00126 void gameOver() {
00127     play = 0;
00128     mutex.lock();
00129     uLCD.filled_rectangle(0,0,127,127,RED);
00130     uLCD.locate(5,6);
00131     uLCD.printf("GAM3 0V3R");
00132     mutex.unlock();
00133     
00134     FILE *wave_file;
00135     wave_file=fopen("/sd/wavfiles/gameover.wav","r");
00136     waver.play(wave_file);
00137     fclose(wave_file);
00138     
00139     while(1); //gameOver screen forever
00140 }
00141 
00142 void removeBullet() {
00143     bullet.eraseBullet();
00144     isBullet = 0;
00145     numTries -= 1;
00146     drawHeader();
00147     if (numTries==0 && targetsLeft>0) gameOver();
00148 }
00149 
00150 void killTarget(BulletLocation currBullet,int i) {
00151     targetsHit[i] = 1;
00152     targetsLeft -= 1;
00153     uLCD.filled_circle(currBullet.x,targetY,targetRad,BLUE);
00154     uLCD.line(currBullet.x-targetRad,targetY+targetRad,currBullet.x+targetRad,targetY-targetRad,BLACK);
00155     uLCD.line(currBullet.x-targetRad,targetY-targetRad,currBullet.x+targetRad,targetY+targetRad,BLACK);
00156     
00157     FILE *wave_file;
00158     wave_file=fopen("/sd/wavfiles/hittarget.wav","r");
00159     waver.play(wave_file);
00160     fclose(wave_file);
00161 }
00162 
00163 void movingBullet(void const *args) {
00164     while (true) {
00165         if(isBullet) {
00166             mutex.lock();
00167             bullet.move();
00168             // Remove bullet if it hits an obstacle
00169             ObstLocation currObs;
00170             BulletLocation currBullet;
00171             for (int i=0; i<levelNum; i++) {
00172                 currObs = obsArr[i].getLocation(); // {x1, y1, x2, y2}
00173                 currBullet = bullet.getLocation(); // {x, topY, bottomY}
00174                 if ((currBullet.topY<=currObs.y2 && currBullet.topY>=currObs.y1) || (currBullet.bottomY<=currObs.y2 && currBullet.bottomY>=currObs.y1)) {
00175                     if (currBullet.x>=currObs.x1 && currBullet.x<=currObs.x2) {
00176                         removeBullet();
00177                         FILE *wave_file;
00178                         wave_file=fopen("/sd/wavfiles/hitobstacle.wav","r");
00179                         waver.play(wave_file);
00180                         fclose(wave_file);
00181                     }
00182                 }
00183             }
00184             // Remove bullet, and draw dead target if it hits a target
00185             if (currBullet.topY<=targetY+targetRad) {
00186                 //if target is already hit
00187                 if (currBullet.x==24 && targetsHit[0]==0) killTarget(currBullet,0);
00188                 if (currBullet.x==64 && targetsHit[1]==0) killTarget(currBullet,1);
00189                 if (currBullet.x==104 && targetsHit[2]==0) killTarget(currBullet,2);
00190                 removeBullet();
00191             }
00192             mutex.unlock();
00193 
00194             Thread::wait(100);
00195         }   
00196     }
00197 }
00198 
00199 void movingObs(void const *args) {
00200     while (true) {
00201         if(play) {
00202             mutex.lock();
00203             if (levelNum == 1) {
00204                 obsArr[0].move(3);
00205             } else if (levelNum == 2) {
00206                 obsArr[0].move(6);
00207                 obsArr[1].move(6);
00208             } else if (levelNum == 3) {
00209                 obsArr[0].move(9);
00210                 obsArr[1].move(9);
00211                 obsArr[2].move(9);
00212             }   
00213             mutex.unlock();
00214             Thread::wait(500);
00215         }
00216     }
00217 }
00218 
00219 void shoot() {
00220     if (!isBullet) {
00221         bullet.drawBullet(player1.getLocation(), 115);
00222         isBullet = 1;
00223         
00224         FILE *wave_file;
00225         wave_file=fopen("/sd/wavfiles/shoot.wav","r");
00226         waver.play(wave_file);
00227         fclose(wave_file);
00228     }
00229 }
00230 
00231 int main() {
00232     levelNum = 1;
00233     isBullet = 0;
00234     Thread bulletThread(movingBullet);
00235     Thread obstacleThread(movingObs);
00236     startGame();
00237     while(1) {
00238         initializeLevel();
00239         play = 1;
00240         while (play) { //actual game play code
00241             if(targetsLeft==0) {
00242                 play = 0;
00243                 levelNum++;
00244             }
00245             if(!right.read()) player1.moveRight();
00246             if(!left.read()) player1.moveLeft();
00247             if(!center.read()) shoot();
00248             wait(0.12);
00249         }
00250     }
00251 }