Mbed Galaga Game

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

Committer:
amostafa9
Date:
Mon Mar 14 16:34:47 2016 +0000
Revision:
0:c4b6bb8c2bf4
Galaga

Who changed what in which revision?

UserRevisionLine numberNew contents of line
amostafa9 0:c4b6bb8c2bf4 1 #include "mbed.h"
amostafa9 0:c4b6bb8c2bf4 2 #include "uLCD_4DGL.h"
amostafa9 0:c4b6bb8c2bf4 3 #include "wave_player.h"
amostafa9 0:c4b6bb8c2bf4 4 #include "SDFileSystem.h"
amostafa9 0:c4b6bb8c2bf4 5 //#include "enemies.h"
amostafa9 0:c4b6bb8c2bf4 6 #include <vector>
amostafa9 0:c4b6bb8c2bf4 7 #include "rtos.h"
amostafa9 0:c4b6bb8c2bf4 8 uLCD_4DGL uLCD(p28,p27,p29);
amostafa9 0:c4b6bb8c2bf4 9 AnalogOut DACout(p18);
amostafa9 0:c4b6bb8c2bf4 10 DigitalOut vib(p21);
amostafa9 0:c4b6bb8c2bf4 11 wave_player waver(&DACout);
amostafa9 0:c4b6bb8c2bf4 12 SDFileSystem sd(p5, p6, p7, p8, "sd"); // mosi, miso, sck, cs
amostafa9 0:c4b6bb8c2bf4 13 BusOut mbedleds(LED1,LED2,LED3,LED4);
amostafa9 0:c4b6bb8c2bf4 14 //BusOut/In is faster than multiple DigitalOut/Ins
amostafa9 0:c4b6bb8c2bf4 15 int playLaser = 0;int playEnemyExplode = 0;int playerExplode = 0;//variables to trigger the speaker to play sounds
amostafa9 0:c4b6bb8c2bf4 16 void sdcard_thread(void const *argument)//thread to play the sounds
amostafa9 0:c4b6bb8c2bf4 17 {
amostafa9 0:c4b6bb8c2bf4 18 while(1) {
amostafa9 0:c4b6bb8c2bf4 19
amostafa9 0:c4b6bb8c2bf4 20 if(playLaser){//play sound if player fires
amostafa9 0:c4b6bb8c2bf4 21 FILE *wave_file;
amostafa9 0:c4b6bb8c2bf4 22 wave_file=fopen("/sd/laser.wav","r");
amostafa9 0:c4b6bb8c2bf4 23 waver.play(wave_file);
amostafa9 0:c4b6bb8c2bf4 24 fclose(wave_file);
amostafa9 0:c4b6bb8c2bf4 25 playLaser = 0;
amostafa9 0:c4b6bb8c2bf4 26 }
amostafa9 0:c4b6bb8c2bf4 27 if(playerExplode) { //play sound if player dies
amostafa9 0:c4b6bb8c2bf4 28 FILE *wave_file;
amostafa9 0:c4b6bb8c2bf4 29 wave_file=fopen("/sd/Bomb.wav","r");
amostafa9 0:c4b6bb8c2bf4 30 waver.play(wave_file);
amostafa9 0:c4b6bb8c2bf4 31 fclose(wave_file);
amostafa9 0:c4b6bb8c2bf4 32 playerExplode = 0;
amostafa9 0:c4b6bb8c2bf4 33 }
amostafa9 0:c4b6bb8c2bf4 34
amostafa9 0:c4b6bb8c2bf4 35 if(playEnemyExplode){//play sound if enemies get hit
amostafa9 0:c4b6bb8c2bf4 36 FILE *wave_file;
amostafa9 0:c4b6bb8c2bf4 37 wave_file=fopen("/sd/Bombnew.wav","r");
amostafa9 0:c4b6bb8c2bf4 38 waver.play(wave_file);
amostafa9 0:c4b6bb8c2bf4 39 fclose(wave_file);
amostafa9 0:c4b6bb8c2bf4 40 playEnemyExplode = 0;
amostafa9 0:c4b6bb8c2bf4 41 }
amostafa9 0:c4b6bb8c2bf4 42 Thread::wait(50);
amostafa9 0:c4b6bb8c2bf4 43 }
amostafa9 0:c4b6bb8c2bf4 44 }
amostafa9 0:c4b6bb8c2bf4 45
amostafa9 0:c4b6bb8c2bf4 46 class Nav_Switch
amostafa9 0:c4b6bb8c2bf4 47 {
amostafa9 0:c4b6bb8c2bf4 48
amostafa9 0:c4b6bb8c2bf4 49 public:
amostafa9 0:c4b6bb8c2bf4 50
amostafa9 0:c4b6bb8c2bf4 51 Nav_Switch(PinName up,PinName down,PinName left,PinName right,PinName fire);
amostafa9 0:c4b6bb8c2bf4 52 int read();
amostafa9 0:c4b6bb8c2bf4 53 //boolean functions to test each switch
amostafa9 0:c4b6bb8c2bf4 54 bool up();
amostafa9 0:c4b6bb8c2bf4 55 bool down();
amostafa9 0:c4b6bb8c2bf4 56 bool left();
amostafa9 0:c4b6bb8c2bf4 57 bool right();
amostafa9 0:c4b6bb8c2bf4 58 bool fire();
amostafa9 0:c4b6bb8c2bf4 59 //automatic read on RHS
amostafa9 0:c4b6bb8c2bf4 60 operator int ();
amostafa9 0:c4b6bb8c2bf4 61 //index to any switch array style
amostafa9 0:c4b6bb8c2bf4 62
amostafa9 0:c4b6bb8c2bf4 63 bool operator[](int index) {
amostafa9 0:c4b6bb8c2bf4 64
amostafa9 0:c4b6bb8c2bf4 65 return _pins[index];
amostafa9 0:c4b6bb8c2bf4 66
amostafa9 0:c4b6bb8c2bf4 67 };
amostafa9 0:c4b6bb8c2bf4 68
amostafa9 0:c4b6bb8c2bf4 69 private:
amostafa9 0:c4b6bb8c2bf4 70
amostafa9 0:c4b6bb8c2bf4 71 BusIn _pins;
amostafa9 0:c4b6bb8c2bf4 72
amostafa9 0:c4b6bb8c2bf4 73
amostafa9 0:c4b6bb8c2bf4 74
amostafa9 0:c4b6bb8c2bf4 75 };
amostafa9 0:c4b6bb8c2bf4 76
amostafa9 0:c4b6bb8c2bf4 77 Nav_Switch::Nav_Switch (PinName up,PinName down,PinName left,PinName right,PinName fire):
amostafa9 0:c4b6bb8c2bf4 78
amostafa9 0:c4b6bb8c2bf4 79 _pins(up, down, left, right, fire)
amostafa9 0:c4b6bb8c2bf4 80
amostafa9 0:c4b6bb8c2bf4 81 {
amostafa9 0:c4b6bb8c2bf4 82
amostafa9 0:c4b6bb8c2bf4 83 _pins.mode(PullUp); //needed if pullups not on board or a bare nav switch is used - delete otherwise
amostafa9 0:c4b6bb8c2bf4 84
amostafa9 0:c4b6bb8c2bf4 85 wait(0.001); //delays just a bit for pullups to pull inputs high
amostafa9 0:c4b6bb8c2bf4 86
amostafa9 0:c4b6bb8c2bf4 87 }
amostafa9 0:c4b6bb8c2bf4 88
amostafa9 0:c4b6bb8c2bf4 89 inline bool Nav_Switch::up()
amostafa9 0:c4b6bb8c2bf4 90
amostafa9 0:c4b6bb8c2bf4 91 {
amostafa9 0:c4b6bb8c2bf4 92
amostafa9 0:c4b6bb8c2bf4 93 return !(_pins[0]);
amostafa9 0:c4b6bb8c2bf4 94
amostafa9 0:c4b6bb8c2bf4 95 }
amostafa9 0:c4b6bb8c2bf4 96
amostafa9 0:c4b6bb8c2bf4 97 inline bool Nav_Switch::down()
amostafa9 0:c4b6bb8c2bf4 98
amostafa9 0:c4b6bb8c2bf4 99 {
amostafa9 0:c4b6bb8c2bf4 100
amostafa9 0:c4b6bb8c2bf4 101 return !(_pins[1]);
amostafa9 0:c4b6bb8c2bf4 102
amostafa9 0:c4b6bb8c2bf4 103 }
amostafa9 0:c4b6bb8c2bf4 104
amostafa9 0:c4b6bb8c2bf4 105 inline bool Nav_Switch::left()
amostafa9 0:c4b6bb8c2bf4 106
amostafa9 0:c4b6bb8c2bf4 107 {
amostafa9 0:c4b6bb8c2bf4 108
amostafa9 0:c4b6bb8c2bf4 109 return !(_pins[2]);
amostafa9 0:c4b6bb8c2bf4 110
amostafa9 0:c4b6bb8c2bf4 111 }
amostafa9 0:c4b6bb8c2bf4 112
amostafa9 0:c4b6bb8c2bf4 113 inline bool Nav_Switch::right()
amostafa9 0:c4b6bb8c2bf4 114
amostafa9 0:c4b6bb8c2bf4 115 {
amostafa9 0:c4b6bb8c2bf4 116
amostafa9 0:c4b6bb8c2bf4 117 return !(_pins[3]);
amostafa9 0:c4b6bb8c2bf4 118
amostafa9 0:c4b6bb8c2bf4 119 }
amostafa9 0:c4b6bb8c2bf4 120
amostafa9 0:c4b6bb8c2bf4 121 inline bool Nav_Switch::fire()
amostafa9 0:c4b6bb8c2bf4 122
amostafa9 0:c4b6bb8c2bf4 123 {
amostafa9 0:c4b6bb8c2bf4 124
amostafa9 0:c4b6bb8c2bf4 125 return !(_pins[4]);
amostafa9 0:c4b6bb8c2bf4 126
amostafa9 0:c4b6bb8c2bf4 127 }
amostafa9 0:c4b6bb8c2bf4 128
amostafa9 0:c4b6bb8c2bf4 129 inline int Nav_Switch::read()
amostafa9 0:c4b6bb8c2bf4 130
amostafa9 0:c4b6bb8c2bf4 131 {
amostafa9 0:c4b6bb8c2bf4 132
amostafa9 0:c4b6bb8c2bf4 133 return _pins.read();
amostafa9 0:c4b6bb8c2bf4 134
amostafa9 0:c4b6bb8c2bf4 135 }
amostafa9 0:c4b6bb8c2bf4 136
amostafa9 0:c4b6bb8c2bf4 137 inline Nav_Switch::operator int ()
amostafa9 0:c4b6bb8c2bf4 138
amostafa9 0:c4b6bb8c2bf4 139 {
amostafa9 0:c4b6bb8c2bf4 140
amostafa9 0:c4b6bb8c2bf4 141 return _pins.read();
amostafa9 0:c4b6bb8c2bf4 142
amostafa9 0:c4b6bb8c2bf4 143 }
amostafa9 0:c4b6bb8c2bf4 144
amostafa9 0:c4b6bb8c2bf4 145 // Declar player dimensions
amostafa9 0:c4b6bb8c2bf4 146
amostafa9 0:c4b6bb8c2bf4 147 int playerWidth = 7;
amostafa9 0:c4b6bb8c2bf4 148
amostafa9 0:c4b6bb8c2bf4 149 int playerHeight = 3;
amostafa9 0:c4b6bb8c2bf4 150
amostafa9 0:c4b6bb8c2bf4 151 int playerDelta = 3;
amostafa9 0:c4b6bb8c2bf4 152
amostafa9 0:c4b6bb8c2bf4 153 int playerXpos = 64;
amostafa9 0:c4b6bb8c2bf4 154
amostafa9 0:c4b6bb8c2bf4 155 int playerYpos = 113;
amostafa9 0:c4b6bb8c2bf4 156
amostafa9 0:c4b6bb8c2bf4 157 #define maxNumPlayerMissiles 5
amostafa9 0:c4b6bb8c2bf4 158
amostafa9 0:c4b6bb8c2bf4 159 #define numEnemies 10
amostafa9 0:c4b6bb8c2bf4 160
amostafa9 0:c4b6bb8c2bf4 161 //struct for missiles
amostafa9 0:c4b6bb8c2bf4 162
amostafa9 0:c4b6bb8c2bf4 163 typedef struct {
amostafa9 0:c4b6bb8c2bf4 164
amostafa9 0:c4b6bb8c2bf4 165 int x; ///< The x-coordinate of missile current position
amostafa9 0:c4b6bb8c2bf4 166
amostafa9 0:c4b6bb8c2bf4 167 int y; ///< The y-coordinate of missile current position
amostafa9 0:c4b6bb8c2bf4 168
amostafa9 0:c4b6bb8c2bf4 169 int status; ///< The missile status, see MISSILE_STATUS
amostafa9 0:c4b6bb8c2bf4 170
amostafa9 0:c4b6bb8c2bf4 171 } playerMissile; // infomration about missile position and status
amostafa9 0:c4b6bb8c2bf4 172
amostafa9 0:c4b6bb8c2bf4 173 //struct for enemies
amostafa9 0:c4b6bb8c2bf4 174
amostafa9 0:c4b6bb8c2bf4 175 typedef struct {
amostafa9 0:c4b6bb8c2bf4 176
amostafa9 0:c4b6bb8c2bf4 177 int x;
amostafa9 0:c4b6bb8c2bf4 178
amostafa9 0:c4b6bb8c2bf4 179 int y;
amostafa9 0:c4b6bb8c2bf4 180
amostafa9 0:c4b6bb8c2bf4 181 int size;
amostafa9 0:c4b6bb8c2bf4 182
amostafa9 0:c4b6bb8c2bf4 183 int status;
amostafa9 0:c4b6bb8c2bf4 184
amostafa9 0:c4b6bb8c2bf4 185 } enemy;
amostafa9 0:c4b6bb8c2bf4 186
amostafa9 0:c4b6bb8c2bf4 187 enemy enemies[numEnemies];//create a struct array of enemies
amostafa9 0:c4b6bb8c2bf4 188
amostafa9 0:c4b6bb8c2bf4 189 // initialize the player's position, missile status, draw player,
amostafa9 0:c4b6bb8c2bf4 190
amostafa9 0:c4b6bb8c2bf4 191 void player_draw(int x, int y, int playerColor) {
amostafa9 0:c4b6bb8c2bf4 192
amostafa9 0:c4b6bb8c2bf4 193 uLCD.filled_rectangle(x, y, x+playerWidth, y+playerHeight, playerColor);
amostafa9 0:c4b6bb8c2bf4 194
amostafa9 0:c4b6bb8c2bf4 195 uLCD.filled_rectangle(x+playerDelta, y-playerDelta, x+playerWidth-playerDelta, y+playerHeight, playerColor);
amostafa9 0:c4b6bb8c2bf4 196
amostafa9 0:c4b6bb8c2bf4 197 }
amostafa9 0:c4b6bb8c2bf4 198
amostafa9 0:c4b6bb8c2bf4 199 playerMissile playerMissiles[maxNumPlayerMissiles]; //struct array of player missiles
amostafa9 0:c4b6bb8c2bf4 200
amostafa9 0:c4b6bb8c2bf4 201 //function to fire a missile
amostafa9 0:c4b6bb8c2bf4 202
amostafa9 0:c4b6bb8c2bf4 203 void player_fire(void){
amostafa9 0:c4b6bb8c2bf4 204
amostafa9 0:c4b6bb8c2bf4 205 playerMissile PM;
amostafa9 0:c4b6bb8c2bf4 206
amostafa9 0:c4b6bb8c2bf4 207 PM.x = playerXpos + (playerWidth/2);
amostafa9 0:c4b6bb8c2bf4 208
amostafa9 0:c4b6bb8c2bf4 209 PM.y = playerYpos-playerDelta;
amostafa9 0:c4b6bb8c2bf4 210
amostafa9 0:c4b6bb8c2bf4 211 PM.status = 1;
amostafa9 0:c4b6bb8c2bf4 212
amostafa9 0:c4b6bb8c2bf4 213 for(int i=0;i<maxNumPlayerMissiles;i++){
amostafa9 0:c4b6bb8c2bf4 214
amostafa9 0:c4b6bb8c2bf4 215 if(playerMissiles[i].status==0){
amostafa9 0:c4b6bb8c2bf4 216
amostafa9 0:c4b6bb8c2bf4 217 playerMissiles[i]=PM;
amostafa9 0:c4b6bb8c2bf4 218
amostafa9 0:c4b6bb8c2bf4 219 break;
amostafa9 0:c4b6bb8c2bf4 220
amostafa9 0:c4b6bb8c2bf4 221 }
amostafa9 0:c4b6bb8c2bf4 222
amostafa9 0:c4b6bb8c2bf4 223 }
amostafa9 0:c4b6bb8c2bf4 224
amostafa9 0:c4b6bb8c2bf4 225 }
amostafa9 0:c4b6bb8c2bf4 226
amostafa9 0:c4b6bb8c2bf4 227 //function to update all parts of the game
amostafa9 0:c4b6bb8c2bf4 228
amostafa9 0:c4b6bb8c2bf4 229 void updateGame(){
amostafa9 0:c4b6bb8c2bf4 230
amostafa9 0:c4b6bb8c2bf4 231 for(int i=0;i<maxNumPlayerMissiles;i++){
amostafa9 0:c4b6bb8c2bf4 232
amostafa9 0:c4b6bb8c2bf4 233 // update all missiles
amostafa9 0:c4b6bb8c2bf4 234
amostafa9 0:c4b6bb8c2bf4 235 if(playerMissiles[i].status == 1){
amostafa9 0:c4b6bb8c2bf4 236
amostafa9 0:c4b6bb8c2bf4 237 uLCD.circle(playerMissiles[i].x,playerMissiles[i].y,1,0x0);
amostafa9 0:c4b6bb8c2bf4 238
amostafa9 0:c4b6bb8c2bf4 239 playerMissiles[i].y-=5;
amostafa9 0:c4b6bb8c2bf4 240
amostafa9 0:c4b6bb8c2bf4 241 uLCD.circle(playerMissiles[i].x,playerMissiles[i].y,1,0xFF0000);
amostafa9 0:c4b6bb8c2bf4 242
amostafa9 0:c4b6bb8c2bf4 243 }
amostafa9 0:c4b6bb8c2bf4 244
amostafa9 0:c4b6bb8c2bf4 245 if(playerMissiles[i].y==0 || playerMissiles[i].status==0){
amostafa9 0:c4b6bb8c2bf4 246
amostafa9 0:c4b6bb8c2bf4 247 uLCD.circle(playerMissiles[i].x,playerMissiles[i].y,1,0x0);
amostafa9 0:c4b6bb8c2bf4 248
amostafa9 0:c4b6bb8c2bf4 249 playerMissiles[i].status = 0;
amostafa9 0:c4b6bb8c2bf4 250
amostafa9 0:c4b6bb8c2bf4 251 }
amostafa9 0:c4b6bb8c2bf4 252
amostafa9 0:c4b6bb8c2bf4 253 //update all enemies
amostafa9 0:c4b6bb8c2bf4 254
amostafa9 0:c4b6bb8c2bf4 255 for(int j=0;j<numEnemies;j++){
amostafa9 0:c4b6bb8c2bf4 256
amostafa9 0:c4b6bb8c2bf4 257 if(playerMissiles[i].status==1 && enemies[j].status==1 && playerMissiles[i].x>enemies[j].x && playerMissiles[i].x<enemies[j].x+enemies[j].size && playerMissiles[i].y>enemies[j].y && playerMissiles[i].y<enemies[j].y+enemies[j].size){
amostafa9 0:c4b6bb8c2bf4 258
amostafa9 0:c4b6bb8c2bf4 259 enemies[j].status = 0;
amostafa9 0:c4b6bb8c2bf4 260
amostafa9 0:c4b6bb8c2bf4 261 playerMissiles[i].status = 0;
amostafa9 0:c4b6bb8c2bf4 262
amostafa9 0:c4b6bb8c2bf4 263 playEnemyExplode=1;
amostafa9 0:c4b6bb8c2bf4 264
amostafa9 0:c4b6bb8c2bf4 265 uLCD.filled_rectangle(enemies[j].x,enemies[j].y,enemies[j].x+enemies[j].size,enemies[j].y+enemies[j].size,0x0);
amostafa9 0:c4b6bb8c2bf4 266
amostafa9 0:c4b6bb8c2bf4 267 }
amostafa9 0:c4b6bb8c2bf4 268
amostafa9 0:c4b6bb8c2bf4 269 }
amostafa9 0:c4b6bb8c2bf4 270
amostafa9 0:c4b6bb8c2bf4 271 }
amostafa9 0:c4b6bb8c2bf4 272
amostafa9 0:c4b6bb8c2bf4 273 }
amostafa9 0:c4b6bb8c2bf4 274
amostafa9 0:c4b6bb8c2bf4 275 //function to set initial position of enemies
amostafa9 0:c4b6bb8c2bf4 276
amostafa9 0:c4b6bb8c2bf4 277 void enemies_init(void){
amostafa9 0:c4b6bb8c2bf4 278
amostafa9 0:c4b6bb8c2bf4 279 enemies[0].x = 1;enemies[0].y = 1;enemies[0].size = 8;
amostafa9 0:c4b6bb8c2bf4 280
amostafa9 0:c4b6bb8c2bf4 281 enemies[1].x = 26;enemies[1].y = 1;enemies[1].size = 8;
amostafa9 0:c4b6bb8c2bf4 282
amostafa9 0:c4b6bb8c2bf4 283 enemies[2].x = 51;enemies[2].y = 1;enemies[2].size = 8;
amostafa9 0:c4b6bb8c2bf4 284
amostafa9 0:c4b6bb8c2bf4 285 enemies[3].x = 76;enemies[3].y = 1;enemies[3].size = 8;
amostafa9 0:c4b6bb8c2bf4 286
amostafa9 0:c4b6bb8c2bf4 287 enemies[4].x = 101;enemies[4].y = 1;enemies[4].size = 8;
amostafa9 0:c4b6bb8c2bf4 288
amostafa9 0:c4b6bb8c2bf4 289 enemies[5].x = 1;enemies[5].y = 20;enemies[5].size = 8;
amostafa9 0:c4b6bb8c2bf4 290
amostafa9 0:c4b6bb8c2bf4 291 enemies[6].x = 26;enemies[6].y = 20;enemies[6].size = 8;
amostafa9 0:c4b6bb8c2bf4 292
amostafa9 0:c4b6bb8c2bf4 293 enemies[7].x = 51;enemies[7].y = 20;enemies[7].size = 8;
amostafa9 0:c4b6bb8c2bf4 294
amostafa9 0:c4b6bb8c2bf4 295 enemies[8].x = 76;enemies[8].y = 20;enemies[8].size = 8;
amostafa9 0:c4b6bb8c2bf4 296
amostafa9 0:c4b6bb8c2bf4 297 enemies[9].x = 101;enemies[9].y = 20;enemies[9].size = 8;
amostafa9 0:c4b6bb8c2bf4 298
amostafa9 0:c4b6bb8c2bf4 299 }
amostafa9 0:c4b6bb8c2bf4 300
amostafa9 0:c4b6bb8c2bf4 301 Nav_Switch myNav( p15, p12, p13, p11, p14); //pin order on Sparkfun breakout
amostafa9 0:c4b6bb8c2bf4 302
amostafa9 0:c4b6bb8c2bf4 303
amostafa9 0:c4b6bb8c2bf4 304
amostafa9 0:c4b6bb8c2bf4 305 int main()
amostafa9 0:c4b6bb8c2bf4 306
amostafa9 0:c4b6bb8c2bf4 307 {
amostafa9 0:c4b6bb8c2bf4 308
amostafa9 0:c4b6bb8c2bf4 309 Thread thread1(sdcard_thread);
amostafa9 0:c4b6bb8c2bf4 310
amostafa9 0:c4b6bb8c2bf4 311 int ctr = 0;int distance=5;int vertical = 1;int win = 1;int numDeadEnemies=0;
amostafa9 0:c4b6bb8c2bf4 312
amostafa9 0:c4b6bb8c2bf4 313 //initialize enemy statuses
amostafa9 0:c4b6bb8c2bf4 314
amostafa9 0:c4b6bb8c2bf4 315 enemies[0].status = 1;enemies[1].status = 1;enemies[2].status = 1;enemies[3].status = 1;enemies[4].status = 1;
amostafa9 0:c4b6bb8c2bf4 316
amostafa9 0:c4b6bb8c2bf4 317 enemies[5].status = 1;enemies[6].status = 1;enemies[7].status = 1;enemies[8].status = 1;enemies[9].status = 1;
amostafa9 0:c4b6bb8c2bf4 318
amostafa9 0:c4b6bb8c2bf4 319 enemies_init();
amostafa9 0:c4b6bb8c2bf4 320
amostafa9 0:c4b6bb8c2bf4 321 //draw enemies
amostafa9 0:c4b6bb8c2bf4 322
amostafa9 0:c4b6bb8c2bf4 323 for(int i=0;i<numEnemies;i++){
amostafa9 0:c4b6bb8c2bf4 324
amostafa9 0:c4b6bb8c2bf4 325 uLCD.filled_rectangle(enemies[i].x,enemies[i].y,enemies[i].x+enemies[i].size,enemies[i].y+enemies[i].size,0x00FF00);
amostafa9 0:c4b6bb8c2bf4 326
amostafa9 0:c4b6bb8c2bf4 327 }
amostafa9 0:c4b6bb8c2bf4 328
amostafa9 0:c4b6bb8c2bf4 329 int i;
amostafa9 0:c4b6bb8c2bf4 330
amostafa9 0:c4b6bb8c2bf4 331 while(1) {
amostafa9 0:c4b6bb8c2bf4 332
amostafa9 0:c4b6bb8c2bf4 333 //with pullups a button hit is a "0" - "~" inverts data to leds
amostafa9 0:c4b6bb8c2bf4 334
amostafa9 0:c4b6bb8c2bf4 335 if(ctr%10==0){
amostafa9 0:c4b6bb8c2bf4 336
amostafa9 0:c4b6bb8c2bf4 337 for(i=0;i<numEnemies;i++){
amostafa9 0:c4b6bb8c2bf4 338
amostafa9 0:c4b6bb8c2bf4 339 if(enemies[i].status!=0){
amostafa9 0:c4b6bb8c2bf4 340
amostafa9 0:c4b6bb8c2bf4 341 //update enemy positions
amostafa9 0:c4b6bb8c2bf4 342
amostafa9 0:c4b6bb8c2bf4 343 uLCD.filled_rectangle(enemies[i].x,enemies[i].y,enemies[i].x+enemies[i].size,enemies[i].y+enemies[i].size,0x0);
amostafa9 0:c4b6bb8c2bf4 344
amostafa9 0:c4b6bb8c2bf4 345 if(vertical<0){enemies[i].x+=distance;}else{enemies[i].y+=5;}
amostafa9 0:c4b6bb8c2bf4 346
amostafa9 0:c4b6bb8c2bf4 347 uLCD.filled_rectangle(enemies[i].x,enemies[i].y,enemies[i].x+enemies[i].size,enemies[i].y+enemies[i].size,0x00FF00);
amostafa9 0:c4b6bb8c2bf4 348
amostafa9 0:c4b6bb8c2bf4 349 }
amostafa9 0:c4b6bb8c2bf4 350
amostafa9 0:c4b6bb8c2bf4 351 }
amostafa9 0:c4b6bb8c2bf4 352
amostafa9 0:c4b6bb8c2bf4 353 if(vertical<0){distance*=-1;}vertical*=-1;
amostafa9 0:c4b6bb8c2bf4 354
amostafa9 0:c4b6bb8c2bf4 355 }
amostafa9 0:c4b6bb8c2bf4 356
amostafa9 0:c4b6bb8c2bf4 357 mbedleds = ~(myNav & 0x0F); //update leds with nav switch direction inputs
amostafa9 0:c4b6bb8c2bf4 358
amostafa9 0:c4b6bb8c2bf4 359 if(myNav.fire()){//fire missile
amostafa9 0:c4b6bb8c2bf4 360
amostafa9 0:c4b6bb8c2bf4 361 vib = 1;
amostafa9 0:c4b6bb8c2bf4 362
amostafa9 0:c4b6bb8c2bf4 363 Thread::wait(100);
amostafa9 0:c4b6bb8c2bf4 364
amostafa9 0:c4b6bb8c2bf4 365 vib=0;
amostafa9 0:c4b6bb8c2bf4 366
amostafa9 0:c4b6bb8c2bf4 367 playLaser = 1;
amostafa9 0:c4b6bb8c2bf4 368
amostafa9 0:c4b6bb8c2bf4 369 player_fire();
amostafa9 0:c4b6bb8c2bf4 370
amostafa9 0:c4b6bb8c2bf4 371 mbedleds = 0x0F; //special all leds on case for fire (center button)
amostafa9 0:c4b6bb8c2bf4 372
amostafa9 0:c4b6bb8c2bf4 373 }
amostafa9 0:c4b6bb8c2bf4 374
amostafa9 0:c4b6bb8c2bf4 375 //or use - if(myNav[4]==0) mbedleds = 0x0F; //can index a switch bit like this
amostafa9 0:c4b6bb8c2bf4 376
amostafa9 0:c4b6bb8c2bf4 377 if(myNav.right() && playerXpos <= 110){//player moves right
amostafa9 0:c4b6bb8c2bf4 378
amostafa9 0:c4b6bb8c2bf4 379 player_draw(playerXpos,playerYpos,0x0);
amostafa9 0:c4b6bb8c2bf4 380
amostafa9 0:c4b6bb8c2bf4 381 playerXpos+=5;
amostafa9 0:c4b6bb8c2bf4 382
amostafa9 0:c4b6bb8c2bf4 383 }
amostafa9 0:c4b6bb8c2bf4 384
amostafa9 0:c4b6bb8c2bf4 385 if(myNav.left() && playerXpos >= 0){//player moves left
amostafa9 0:c4b6bb8c2bf4 386
amostafa9 0:c4b6bb8c2bf4 387 player_draw(playerXpos,playerYpos,0x0);
amostafa9 0:c4b6bb8c2bf4 388
amostafa9 0:c4b6bb8c2bf4 389 playerXpos-=5;
amostafa9 0:c4b6bb8c2bf4 390
amostafa9 0:c4b6bb8c2bf4 391 }
amostafa9 0:c4b6bb8c2bf4 392
amostafa9 0:c4b6bb8c2bf4 393 player_draw(playerXpos,playerYpos,0xFFFF00);//draw the player
amostafa9 0:c4b6bb8c2bf4 394
amostafa9 0:c4b6bb8c2bf4 395 updateGame();
amostafa9 0:c4b6bb8c2bf4 396
amostafa9 0:c4b6bb8c2bf4 397 //check if player has been hit
amostafa9 0:c4b6bb8c2bf4 398
amostafa9 0:c4b6bb8c2bf4 399 for(i=0;i<numEnemies;i++){
amostafa9 0:c4b6bb8c2bf4 400
amostafa9 0:c4b6bb8c2bf4 401 if(enemies[i].status==1 && playerXpos>enemies[i].x && playerXpos<enemies[i].x+enemies[i].size && playerYpos>enemies[i].y && playerYpos<enemies[i].y+enemies[i].size){
amostafa9 0:c4b6bb8c2bf4 402
amostafa9 0:c4b6bb8c2bf4 403 player_draw(playerXpos,playerYpos,0x0);win=0;playerExplode=1;vib=1;
amostafa9 0:c4b6bb8c2bf4 404
amostafa9 0:c4b6bb8c2bf4 405 }
amostafa9 0:c4b6bb8c2bf4 406
amostafa9 0:c4b6bb8c2bf4 407 if(enemies[i].status==0)numDeadEnemies++;
amostafa9 0:c4b6bb8c2bf4 408
amostafa9 0:c4b6bb8c2bf4 409 if(enemies[i].y>128)enemies[i].y=1;
amostafa9 0:c4b6bb8c2bf4 410
amostafa9 0:c4b6bb8c2bf4 411 }
amostafa9 0:c4b6bb8c2bf4 412
amostafa9 0:c4b6bb8c2bf4 413 // check for end game conditions
amostafa9 0:c4b6bb8c2bf4 414
amostafa9 0:c4b6bb8c2bf4 415 if(numDeadEnemies==numEnemies){Thread::wait(1000);break;}
amostafa9 0:c4b6bb8c2bf4 416
amostafa9 0:c4b6bb8c2bf4 417 if(!win){Thread::wait(1000);vib=0;playerExplode=0;break;}
amostafa9 0:c4b6bb8c2bf4 418
amostafa9 0:c4b6bb8c2bf4 419 numDeadEnemies = 0;
amostafa9 0:c4b6bb8c2bf4 420
amostafa9 0:c4b6bb8c2bf4 421 ctr++;
amostafa9 0:c4b6bb8c2bf4 422
amostafa9 0:c4b6bb8c2bf4 423 Thread::wait(10);
amostafa9 0:c4b6bb8c2bf4 424
amostafa9 0:c4b6bb8c2bf4 425 }
amostafa9 0:c4b6bb8c2bf4 426
amostafa9 0:c4b6bb8c2bf4 427 uLCD.locate(5,5);
amostafa9 0:c4b6bb8c2bf4 428
amostafa9 0:c4b6bb8c2bf4 429 if(win){
amostafa9 0:c4b6bb8c2bf4 430
amostafa9 0:c4b6bb8c2bf4 431 uLCD.printf("You Win!!");
amostafa9 0:c4b6bb8c2bf4 432
amostafa9 0:c4b6bb8c2bf4 433 }else{
amostafa9 0:c4b6bb8c2bf4 434
amostafa9 0:c4b6bb8c2bf4 435 uLCD.printf("GAME OVER");
amostafa9 0:c4b6bb8c2bf4 436
amostafa9 0:c4b6bb8c2bf4 437 }
amostafa9 0:c4b6bb8c2bf4 438
amostafa9 0:c4b6bb8c2bf4 439 }