Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: 4DGL-uLCD-SE SDFileSystem mbed-rtos mbed wave_player
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 }
Generated on Mon Jul 18 2022 01:34:28 by
1.7.2