SharpShooter
Dependencies: 4DGL-uLCD-SE SDFileSystem mbed-rtos mbed wave_player
Diff: MainGame.cpp
- Revision:
- 15:e09ab0d14d4b
- Parent:
- 13:67e79a582164
diff -r 3f7b826ad15e -r e09ab0d14d4b MainGame.cpp --- a/MainGame.cpp Sat Oct 29 20:02:57 2016 +0000 +++ b/MainGame.cpp Mon Oct 31 18:15:21 2016 +0000 @@ -9,6 +9,10 @@ #include "Shooter.h" #include "Bullet.h" +/*DIRECTIVES*/ +#define NUMTRIES 10 + +/*INSTANTIATION*/ DigitalOut myled1(LED1); DigitalOut myled2(LED2); DigitalOut myled3(LED3); @@ -18,9 +22,6 @@ InterruptIn left(p26); InterruptIn right(p28); -///sd/wavfiles/def_swar.wav - -/*INSTANTIATION*/ uLCD_4DGL uLCD(p9,p10,p11); // serial tx, serial rx, reset pin; Nav_Switch myNav( p24, p25, p26, p27, p28); //up, down, left, right, fire SDFileSystem sd(p5, p6, p7, p8, "sd"); @@ -32,57 +33,47 @@ Mutex mutex; /*STRUCT INITIALIZATION*/ -/* -struct ObstLocation { - int x1, y1, x2, y2; -}; -*/ - struct TargetLocation { int x,y,r; }; - -/* -struct BulletLocation { - int x, topY, bottomY; -}; -*/ -/*LOCAL VARIABLES*/ +/*GLOBAL VARIABLES*/ int numTries; int levelNum; BulletLocation bulletLocation; -ObstLocation * obstaclePtr; Obstacle obsArr[3]; TargetLocation * targetsPtr = new TargetLocation[3]; bool play = 0; - - +int targetY = 15; +int targetRad = 5; +int targetsLeft = 3; +bool targetsHit[3]; void startGame() { uLCD.background_color(BACKGROUND); - uLCD.locate(0,0); - //uLCD.set_font_size(44, 44); - uLCD.printf("\nSharp Shooter!!\n"); + uLCD.filled_rectangle(0,0,127,127,BLUE); + uLCD.locate(3,6); + uLCD.printf("Sharp Shooter!"); wait(0.1); FILE *wave_file; - wave_file=fopen("/sd/wavfiles/pitfall.wav","r"); + wave_file=fopen("/sd/wavfiles/intro.wav","r"); waver.play(wave_file); fclose(wave_file); - wait(2); + wait(0.3); uLCD.cls(); - //uLCD.filled_rectangle(0,0,127,127,BACKGROUND); } void createTargets() { //draw all targets - //initialize targetPtr w locations of where theyre drawn - uLCD.filled_circle(24,15,5,TARGET); - uLCD.filled_circle(64,15,5,TARGET); - uLCD.filled_circle(104,15,5,TARGET); - + uLCD.filled_circle(24,targetY,targetRad,TARGET); + uLCD.filled_circle(64,targetY,targetRad,TARGET); + uLCD.filled_circle(104,targetY,targetRad,TARGET); + targetsLeft = 3; + for (int i=0; i<targetsLeft; i++) { + targetsHit[i] = 0; + } } void createShooter() { @@ -90,40 +81,114 @@ } void createObstacles(int num) { - obstaclePtr = new ObstLocation[num]; - //dummy x values, CHANGE LATER - if (num == 1) { + //instantiate obstacles and store in obsArr + if (num == 1) { //if Level 1 + obsArr[0] = Obstacle(2, 62, 50, 65); + obsArr[0].setDirection(1); + } else if (num == 2) { //if Level 2 obsArr[0] = Obstacle(2, 62, 50, 65); - } else if (num == 2) { - obsArr[0] = Obstacle(15, 15, 115, 115); - obsArr[1] = Obstacle(15, 15, 115, 115); - } else if (num == 3) { - obsArr[0] = Obstacle(15, 15, 115, 115); - obsArr[1] = Obstacle(15, 15, 115, 115); - obsArr[2] = Obstacle(15, 15, 115, 115); + obsArr[0].setDirection(1); + obsArr[1] = Obstacle(67, 32, 115, 35); + obsArr[1].setDirection(0); + } else if (num == 3) { //if Level 3 + obsArr[0] = Obstacle(2, 62, 50, 65); + obsArr[0].setDirection(1); + obsArr[1] = Obstacle(67, 32, 115, 35); + obsArr[1].setDirection(0); + obsArr[2] = Obstacle(48, 48, 96, 51); + obsArr[2].setDirection(1); } + //draw obstacles for (int i = 0; i < num; i++) { - obstaclePtr[i] = obsArr[i].getLocation(); obsArr[i].drawObstacle(); } } -void initializeLevel() { - numTries = 10; - //draw header (level #, numTries) at the top +void drawHeader() { + mutex.lock(); + if (numTries>=9) uLCD.filled_rectangle(0,0,128,7,BLACK); //clear header if over double digits uLCD.locate(0,0); uLCD.printf("LEVEL:%d BULLETS:%d", levelNum, numTries); - + mutex.unlock(); +} + +void initializeLevel() { + mutex.lock(); + uLCD.cls(); + mutex.unlock(); + numTries = NUMTRIES; + drawHeader(); createTargets(); createObstacles(levelNum); createShooter(); } +void gameOver() { + play = 0; + mutex.lock(); + uLCD.filled_rectangle(0,0,127,127,RED); + uLCD.locate(5,6); + uLCD.printf("GAM3 0V3R"); + mutex.unlock(); + + FILE *wave_file; + wave_file=fopen("/sd/wavfiles/gameover.wav","r"); + waver.play(wave_file); + fclose(wave_file); + + while(1); //gameOver screen forever +} + +void removeBullet() { + bullet.eraseBullet(); + isBullet = 0; + numTries -= 1; + drawHeader(); + if (numTries==0 && targetsLeft>0) gameOver(); +} + +void killTarget(BulletLocation currBullet,int i) { + targetsHit[i] = 1; + targetsLeft -= 1; + uLCD.filled_circle(currBullet.x,targetY,targetRad,BLUE); + uLCD.line(currBullet.x-targetRad,targetY+targetRad,currBullet.x+targetRad,targetY-targetRad,BLACK); + uLCD.line(currBullet.x-targetRad,targetY-targetRad,currBullet.x+targetRad,targetY+targetRad,BLACK); + + FILE *wave_file; + wave_file=fopen("/sd/wavfiles/hittarget.wav","r"); + waver.play(wave_file); + fclose(wave_file); +} + void movingBullet(void const *args) { while (true) { if(isBullet) { mutex.lock(); bullet.move(); + // Remove bullet if it hits an obstacle + ObstLocation currObs; + BulletLocation currBullet; + for (int i=0; i<levelNum; i++) { + currObs = obsArr[i].getLocation(); // {x1, y1, x2, y2} + currBullet = bullet.getLocation(); // {x, topY, bottomY} + if ((currBullet.topY<=currObs.y2 && currBullet.topY>=currObs.y1) || (currBullet.bottomY<=currObs.y2 && currBullet.bottomY>=currObs.y1)) { + if (currBullet.x>=currObs.x1 && currBullet.x<=currObs.x2) { + removeBullet(); + FILE *wave_file; + wave_file=fopen("/sd/wavfiles/hitobstacle.wav","r"); + waver.play(wave_file); + fclose(wave_file); + } + } + } + // Remove bullet, and draw dead target if it hits a target + if (currBullet.topY<=targetY+targetRad) { + //if target is already hit + if (currBullet.x==24 && targetsHit[0]==0) killTarget(currBullet,0); + if (currBullet.x==64 && targetsHit[1]==0) killTarget(currBullet,1); + if (currBullet.x==104 && targetsHit[2]==0) killTarget(currBullet,2); + removeBullet(); + } mutex.unlock(); Thread::wait(100); @@ -136,19 +201,13 @@ if(play) { mutex.lock(); if (levelNum == 1) { - obsArr[0].setDirection(1); obsArr[0].move(3); } else if (levelNum == 2) { - obsArr[0].setDirection(1); obsArr[0].move(6); - obsArr[1].setDirection(0); obsArr[1].move(6); } else if (levelNum == 3) { - obsArr[0].setDirection(1); obsArr[0].move(9); - obsArr[1].setDirection(0); obsArr[1].move(9); - obsArr[2].setDirection(1); obsArr[2].move(9); } mutex.unlock(); @@ -158,38 +217,34 @@ } void shoot() { - bullet.drawBullet(player1.getLocation(), 115); - isBullet = 1; + if (!isBullet) { + bullet.drawBullet(player1.getLocation(), 115); + isBullet = 1; + + FILE *wave_file; + wave_file=fopen("/sd/wavfiles/shoot.wav","r"); + waver.play(wave_file); + fclose(wave_file); + } } -void checkIfHit(); - -void gameOver(); - - - -void handleObstacleHit(); - -void handleTargetHit(); - -void redrawTarget(); - int main() { levelNum = 1; isBullet = 0; Thread bulletThread(movingBullet); Thread obstacleThread(movingObs); + startGame(); while(1) { - - startGame(); - //uLCD.rectangle(0,0,100,100, 0xffffff); initializeLevel(); play = 1; while (play) { //actual game play code + if(targetsLeft==0) { + play = 0; + levelNum++; + } if(!right.read()) player1.moveRight(); if(!left.read()) player1.moveLeft(); if(!center.read()) shoot(); - //if(isBullet) bullet.move(); wait(0.12); } }