SharpShooter
Dependencies: 4DGL-uLCD-SE SDFileSystem mbed-rtos mbed wave_player
MainGame.cpp
- Committer:
- jboettcher
- Date:
- 2016-10-31
- Revision:
- 15:e09ab0d14d4b
- Parent:
- 13:67e79a582164
File content as of revision 15:e09ab0d14d4b:
#include "mbed.h"
#include "Speaker.h"
#include "uLCD_4DGL.h"
#include "SDFileSystem.h"
#include "wave_player.h"
#include "Nav_Switch.h"
#include "rtos.h"
#include "Obstacle.h"
#include "Shooter.h"
#include "Bullet.h"
/*DIRECTIVES*/
#define NUMTRIES 10
/*INSTANTIATION*/
DigitalOut myled1(LED1);
DigitalOut myled2(LED2);
DigitalOut myled3(LED3);
DigitalOut myled4(LED4);
InterruptIn center(p25);
InterruptIn left(p26);
InterruptIn right(p28);
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");
AnalogOut DACout(p18);
wave_player waver(&DACout);
Shooter player1;
Bullet bullet;
bool isBullet;
Mutex mutex;
/*STRUCT INITIALIZATION*/
struct TargetLocation {
int x,y,r;
};
/*GLOBAL VARIABLES*/
int numTries;
int levelNum;
BulletLocation bulletLocation;
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.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/intro.wav","r");
waver.play(wave_file);
fclose(wave_file);
wait(0.3);
uLCD.cls();
}
void createTargets() {
//draw all targets
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() {
player1.drawShooter();
}
void createObstacles(int num) {
//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);
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++) {
obsArr[i].drawObstacle();
}
}
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);
}
}
}
void movingObs(void const *args) {
while (true) {
if(play) {
mutex.lock();
if (levelNum == 1) {
obsArr[0].move(3);
} else if (levelNum == 2) {
obsArr[0].move(6);
obsArr[1].move(6);
} else if (levelNum == 3) {
obsArr[0].move(9);
obsArr[1].move(9);
obsArr[2].move(9);
}
mutex.unlock();
Thread::wait(500);
}
}
}
void shoot() {
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);
}
}
int main() {
levelNum = 1;
isBullet = 0;
Thread bulletThread(movingBullet);
Thread obstacleThread(movingObs);
startGame();
while(1) {
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();
wait(0.12);
}
}
}
