Updated Space Invaders on the mbed. Improved upon Michael Son's "Mbed Space Invaders" at https://os.mbed.com/users/michaeljson/notebook/mbed-space-invaders/.

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

Fork of Two-PlayerSpaceInvaders by William Minix

test

Committer:
wminix3
Date:
Thu Apr 15 23:04:18 2021 +0000
Revision:
2:4a3f97570578
Parent:
1:618aa2c4ca6a
Child:
3:e6c081c7f6f1
Basic revisions from original space invaders. Added extra menu options, "volatile" on global variables, and serial mbed. Changed pins to add serial with second mbed.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
michaeljson 0:3817adfaeb06 1 #include "mbed.h"
michaeljson 0:3817adfaeb06 2 #include "SDFileSystem.h"
michaeljson 0:3817adfaeb06 3 #include "wave_player.h"
michaeljson 0:3817adfaeb06 4 #include "enemy.h"
michaeljson 0:3817adfaeb06 5 #include "player.h"
michaeljson 0:3817adfaeb06 6 #include "missile.h"
michaeljson 0:3817adfaeb06 7 #include "globals.h"
michaeljson 0:3817adfaeb06 8 #include "rtos.h"
michaeljson 0:3817adfaeb06 9 #include <string>
michaeljson 0:3817adfaeb06 10
michaeljson 0:3817adfaeb06 11 /* ==== Navigation Switch ===== */
michaeljson 0:3817adfaeb06 12 class Nav_Switch
michaeljson 0:3817adfaeb06 13 {
michaeljson 0:3817adfaeb06 14 public:
michaeljson 0:3817adfaeb06 15 Nav_Switch(PinName up,PinName down,PinName left,PinName right,PinName fire);
michaeljson 0:3817adfaeb06 16 int read();
michaeljson 0:3817adfaeb06 17 //boolean functions to test each switch
michaeljson 0:3817adfaeb06 18 bool up();
michaeljson 0:3817adfaeb06 19 bool down();
michaeljson 0:3817adfaeb06 20 bool left();
michaeljson 0:3817adfaeb06 21 bool right();
michaeljson 0:3817adfaeb06 22 bool fire();
michaeljson 0:3817adfaeb06 23 //automatic read on RHS
michaeljson 0:3817adfaeb06 24 operator int ();
michaeljson 0:3817adfaeb06 25 //index to any switch array style
michaeljson 0:3817adfaeb06 26 bool operator[](int index) {
michaeljson 0:3817adfaeb06 27 return _pins[index];
michaeljson 0:3817adfaeb06 28 };
michaeljson 0:3817adfaeb06 29 private:
michaeljson 0:3817adfaeb06 30 BusIn _pins;
michaeljson 0:3817adfaeb06 31
michaeljson 0:3817adfaeb06 32 };
michaeljson 0:3817adfaeb06 33 Nav_Switch::Nav_Switch (PinName up,PinName down,PinName left,PinName right,PinName fire):
michaeljson 0:3817adfaeb06 34 _pins(up, down, left, right, fire)
michaeljson 0:3817adfaeb06 35 {
michaeljson 0:3817adfaeb06 36 _pins.mode(PullUp); //needed if pullups not on board or a bare nav switch is used - delete otherwise
michaeljson 0:3817adfaeb06 37 wait(0.001); //delays just a bit for pullups to pull inputs high
michaeljson 0:3817adfaeb06 38 }
michaeljson 0:3817adfaeb06 39 inline bool Nav_Switch::up()
michaeljson 0:3817adfaeb06 40 {
michaeljson 0:3817adfaeb06 41 return !(_pins[0]);
michaeljson 0:3817adfaeb06 42 }
michaeljson 0:3817adfaeb06 43 inline bool Nav_Switch::down()
michaeljson 0:3817adfaeb06 44 {
michaeljson 0:3817adfaeb06 45 return !(_pins[1]);
michaeljson 0:3817adfaeb06 46 }
michaeljson 0:3817adfaeb06 47 inline bool Nav_Switch::left()
michaeljson 0:3817adfaeb06 48 {
michaeljson 0:3817adfaeb06 49 return !(_pins[2]);
michaeljson 0:3817adfaeb06 50 }
michaeljson 0:3817adfaeb06 51 inline bool Nav_Switch::right()
michaeljson 0:3817adfaeb06 52 {
michaeljson 0:3817adfaeb06 53 return !(_pins[3]);
michaeljson 0:3817adfaeb06 54 }
michaeljson 0:3817adfaeb06 55 inline bool Nav_Switch::fire()
michaeljson 0:3817adfaeb06 56 {
michaeljson 0:3817adfaeb06 57 return !(_pins[4]);
michaeljson 0:3817adfaeb06 58 }
michaeljson 0:3817adfaeb06 59 inline int Nav_Switch::read()
michaeljson 0:3817adfaeb06 60 {
michaeljson 0:3817adfaeb06 61 return _pins.read();
michaeljson 0:3817adfaeb06 62 }
michaeljson 0:3817adfaeb06 63 inline Nav_Switch::operator int ()
michaeljson 0:3817adfaeb06 64 {
michaeljson 0:3817adfaeb06 65 return _pins.read();
michaeljson 0:3817adfaeb06 66 }
michaeljson 0:3817adfaeb06 67
michaeljson 0:3817adfaeb06 68 // Platform initialization
michaeljson 0:3817adfaeb06 69 uLCD_4DGL uLCD(p28,p27,p29); // LCD (serial tx, serial rx, reset pin;)
michaeljson 0:3817adfaeb06 70 AnalogOut DACout(p18); // speaker
michaeljson 0:3817adfaeb06 71 wave_player waver(&DACout); // wav player
michaeljson 0:3817adfaeb06 72 SDFileSystem sd(p5, p6, p7, p8, "sd"); // SD card and filesystem (mosi, miso, sck, cs)
wminix3 2:4a3f97570578 73 Nav_Switch myNav(p16, p10, p11, p9, p12); //pin order on Sparkfun breakout. move U from p13 to p16 so we can use another Serial to communicate with mbed
michaeljson 0:3817adfaeb06 74 DigitalIn pb(p15); // push button for player misisle fire
wminix3 2:4a3f97570578 75 Serial pc(USBTX, USBRX);
wminix3 2:4a3f97570578 76 Serial secondMbed(p13, p14);
michaeljson 0:3817adfaeb06 77 // Initialize all global enemy objects
michaeljson 0:3817adfaeb06 78 enemy_t enemy_1;
michaeljson 0:3817adfaeb06 79 enemy_t enemy_2;
michaeljson 0:3817adfaeb06 80 enemy_t enemy_3;
michaeljson 0:3817adfaeb06 81 enemy_t enemy_4;
michaeljson 0:3817adfaeb06 82 enemy_t enemy_5;
michaeljson 0:3817adfaeb06 83 enemy_t enemy_6;
michaeljson 0:3817adfaeb06 84 enemy_t enemy_7;
michaeljson 0:3817adfaeb06 85 enemy_t enemy_8;
michaeljson 0:3817adfaeb06 86 enemy_t enemy_9;
michaeljson 0:3817adfaeb06 87 enemy_t enemy_10;
michaeljson 0:3817adfaeb06 88 enemy_t enemy_11;
michaeljson 0:3817adfaeb06 89 enemy_t enemy_12;
michaeljson 0:3817adfaeb06 90 enemy_t enemy_13;
michaeljson 0:3817adfaeb06 91 enemy_t enemy_14;
michaeljson 0:3817adfaeb06 92 enemy_t enemy_15;
michaeljson 0:3817adfaeb06 93
michaeljson 0:3817adfaeb06 94 // Initialize variables
wminix3 2:4a3f97570578 95 // Brice added "volatile" here to protect global variables.
wminix3 2:4a3f97570578 96 volatile int numOfEnemies = 0;
wminix3 2:4a3f97570578 97 volatile int ENEMY_MOVE = 1;
wminix3 2:4a3f97570578 98 volatile int MOVE_DOWN = 0;
wminix3 2:4a3f97570578 99 volatile int DIRECTION = 1;
wminix3 2:4a3f97570578 100 volatile int firing_col = 0;
wminix3 2:4a3f97570578 101 volatile int hit_player = 0;
wminix3 2:4a3f97570578 102 volatile bool lose = false;
wminix3 2:4a3f97570578 103 volatile int lives = 3;
wminix3 2:4a3f97570578 104 volatile bool game_menu = false;
wminix3 2:4a3f97570578 105 volatile bool begin_game = false;
wminix3 2:4a3f97570578 106 volatile bool gameover = false;
wminix3 2:4a3f97570578 107 volatile int numPlayers = 1;
michaeljson 0:3817adfaeb06 108
michaeljson 0:3817adfaeb06 109 // Initialize global player object
michaeljson 0:3817adfaeb06 110 player_t player;
michaeljson 0:3817adfaeb06 111
michaeljson 0:3817adfaeb06 112 // Intialize global player and enemy missile
michaeljson 0:3817adfaeb06 113 missile_t missile; // player missile
michaeljson 0:3817adfaeb06 114 missile_t enemy_missile; // enemy missile
michaeljson 0:3817adfaeb06 115
michaeljson 0:3817adfaeb06 116 // Array of enemy objects
michaeljson 0:3817adfaeb06 117 enemy_t * enemyArray[15];
michaeljson 0:3817adfaeb06 118
michaeljson 0:3817adfaeb06 119 // Function Prototypes
michaeljson 0:3817adfaeb06 120 void move_enemy_down();
michaeljson 0:3817adfaeb06 121 void playstart(void const *args);
michaeljson 0:3817adfaeb06 122
michaeljson 0:3817adfaeb06 123 // Draws the enemies at the initial starting location
michaeljson 0:3817adfaeb06 124 void draw_enemies_level()
michaeljson 0:3817adfaeb06 125 {
michaeljson 0:3817adfaeb06 126 // Initialize local variables
michaeljson 0:3817adfaeb06 127 unsigned int start_x_pos = 12;
michaeljson 0:3817adfaeb06 128 unsigned int start_enemy_y_pos = 20;
michaeljson 0:3817adfaeb06 129 numOfEnemies = 15;
michaeljson 0:3817adfaeb06 130
michaeljson 0:3817adfaeb06 131 // First Row of Enemies
michaeljson 0:3817adfaeb06 132 enemy_init(&enemy_1,start_x_pos,start_enemy_y_pos,WHITE); // initialize x-pos and y-pos and color of enemy
michaeljson 0:3817adfaeb06 133 enemy_show(&enemy_1); // displays the enemy on uLCD
michaeljson 0:3817adfaeb06 134
michaeljson 0:3817adfaeb06 135 enemy_init(&enemy_2,start_x_pos+15,start_enemy_y_pos,WHITE);
michaeljson 0:3817adfaeb06 136 enemy_show(&enemy_2);
michaeljson 0:3817adfaeb06 137
michaeljson 0:3817adfaeb06 138 enemy_init(&enemy_3,start_x_pos+30,start_enemy_y_pos,WHITE);
michaeljson 0:3817adfaeb06 139 enemy_show(&enemy_3);
michaeljson 0:3817adfaeb06 140
michaeljson 0:3817adfaeb06 141 enemy_init(&enemy_4,start_x_pos+45,start_enemy_y_pos,WHITE);
michaeljson 0:3817adfaeb06 142 enemy_show(&enemy_4);
michaeljson 0:3817adfaeb06 143
michaeljson 0:3817adfaeb06 144 enemy_init(&enemy_5,start_x_pos+60,start_enemy_y_pos,WHITE);
michaeljson 0:3817adfaeb06 145 enemy_show(&enemy_5);
michaeljson 0:3817adfaeb06 146
michaeljson 0:3817adfaeb06 147 // Second Row of Enemies
michaeljson 0:3817adfaeb06 148 enemy_init(&enemy_6,start_x_pos,start_enemy_y_pos+12,WHITE);
michaeljson 0:3817adfaeb06 149 enemy_show(&enemy_6);
michaeljson 0:3817adfaeb06 150
michaeljson 0:3817adfaeb06 151 enemy_init(&enemy_7,start_x_pos+15,start_enemy_y_pos+12,WHITE);
michaeljson 0:3817adfaeb06 152 enemy_show(&enemy_7);
michaeljson 0:3817adfaeb06 153
michaeljson 0:3817adfaeb06 154 enemy_init(&enemy_8,start_x_pos+30,start_enemy_y_pos+12,WHITE);
michaeljson 0:3817adfaeb06 155 enemy_show(&enemy_8);
michaeljson 0:3817adfaeb06 156
michaeljson 0:3817adfaeb06 157 enemy_init(&enemy_9,start_x_pos+45,start_enemy_y_pos+12,WHITE);
michaeljson 0:3817adfaeb06 158 enemy_show(&enemy_9);
michaeljson 0:3817adfaeb06 159
michaeljson 0:3817adfaeb06 160 enemy_init(&enemy_10,start_x_pos+60,start_enemy_y_pos+12,WHITE);
michaeljson 0:3817adfaeb06 161 enemy_show(&enemy_10);
michaeljson 0:3817adfaeb06 162
michaeljson 0:3817adfaeb06 163 // Third Row of Enemies
michaeljson 0:3817adfaeb06 164 enemy_init(&enemy_11,start_x_pos,start_enemy_y_pos+24,WHITE);
michaeljson 0:3817adfaeb06 165 enemy_show(&enemy_11);
michaeljson 0:3817adfaeb06 166
michaeljson 0:3817adfaeb06 167 enemy_init(&enemy_12,start_x_pos+15,start_enemy_y_pos+24,WHITE);
michaeljson 0:3817adfaeb06 168 enemy_show(&enemy_12);
michaeljson 0:3817adfaeb06 169
michaeljson 0:3817adfaeb06 170 enemy_init(&enemy_13,start_x_pos+30,start_enemy_y_pos+24,WHITE);
michaeljson 0:3817adfaeb06 171 enemy_show(&enemy_13);
michaeljson 0:3817adfaeb06 172
michaeljson 0:3817adfaeb06 173 enemy_init(&enemy_14,start_x_pos+45,start_enemy_y_pos+24,WHITE);
michaeljson 0:3817adfaeb06 174 enemy_show(&enemy_14);
michaeljson 0:3817adfaeb06 175
michaeljson 0:3817adfaeb06 176 enemy_init(&enemy_15,start_x_pos+60,start_enemy_y_pos+24,WHITE);
michaeljson 0:3817adfaeb06 177 enemy_show(&enemy_15);
michaeljson 0:3817adfaeb06 178
michaeljson 0:3817adfaeb06 179 // Put enemy objects into array
michaeljson 0:3817adfaeb06 180 enemyArray[0] = &enemy_1;
michaeljson 0:3817adfaeb06 181 enemyArray[1] = &enemy_2;
michaeljson 0:3817adfaeb06 182 enemyArray[2] = &enemy_3;
michaeljson 0:3817adfaeb06 183 enemyArray[3] = &enemy_4;
michaeljson 0:3817adfaeb06 184 enemyArray[4] = &enemy_5;
michaeljson 0:3817adfaeb06 185 enemyArray[5] = &enemy_6;
michaeljson 0:3817adfaeb06 186 enemyArray[6] = &enemy_7;
michaeljson 0:3817adfaeb06 187 enemyArray[7] = &enemy_8;
michaeljson 0:3817adfaeb06 188 enemyArray[8] = &enemy_9;
michaeljson 0:3817adfaeb06 189 enemyArray[9] = &enemy_10;
michaeljson 0:3817adfaeb06 190 enemyArray[10] = &enemy_11;
michaeljson 0:3817adfaeb06 191 enemyArray[11] = &enemy_12;
michaeljson 0:3817adfaeb06 192 enemyArray[12] = &enemy_13;
michaeljson 0:3817adfaeb06 193 enemyArray[13] = &enemy_14;
michaeljson 0:3817adfaeb06 194 enemyArray[14] = &enemy_15;
michaeljson 0:3817adfaeb06 195 }
michaeljson 0:3817adfaeb06 196
michaeljson 0:3817adfaeb06 197 // Draws the player at the initial starting location
michaeljson 0:3817adfaeb06 198 void draw_initial_player()
michaeljson 0:3817adfaeb06 199 {
michaeljson 0:3817adfaeb06 200 int start_x_pos = 59;
michaeljson 0:3817adfaeb06 201 int start_y_pos = 110;
michaeljson 0:3817adfaeb06 202
michaeljson 0:3817adfaeb06 203 player_init(&player,start_x_pos,start_y_pos,WHITE); // intialize x-pos and y-pos and color of player
michaeljson 0:3817adfaeb06 204 player_show(&player); // display player on uLCD
michaeljson 0:3817adfaeb06 205 }
michaeljson 0:3817adfaeb06 206
michaeljson 0:3817adfaeb06 207 // Checks all enemies in row 1
michaeljson 0:3817adfaeb06 208 void check_hit_enemy_row1()
michaeljson 0:3817adfaeb06 209 {
michaeljson 0:3817adfaeb06 210 int hit_enemy;
michaeljson 0:3817adfaeb06 211
michaeljson 0:3817adfaeb06 212 // First Row of Enemies
michaeljson 0:3817adfaeb06 213 hit_enemy = check_enemy(&enemy_1, &missile); // checks if the missile hits the enemy and returns 1 if hit, 0 if not hit
michaeljson 0:3817adfaeb06 214 numOfEnemies = numOfEnemies - hit_enemy; // updates the number of enemies left
michaeljson 0:3817adfaeb06 215 hit_enemy = check_enemy(&enemy_2, &missile);
michaeljson 0:3817adfaeb06 216 numOfEnemies = numOfEnemies - hit_enemy;
michaeljson 0:3817adfaeb06 217 hit_enemy = check_enemy(&enemy_3, &missile);
michaeljson 0:3817adfaeb06 218 numOfEnemies = numOfEnemies - hit_enemy;
michaeljson 0:3817adfaeb06 219 hit_enemy = check_enemy(&enemy_4, &missile);
michaeljson 0:3817adfaeb06 220 numOfEnemies = numOfEnemies - hit_enemy;
michaeljson 0:3817adfaeb06 221 hit_enemy = check_enemy(&enemy_5, &missile);
michaeljson 0:3817adfaeb06 222 numOfEnemies = numOfEnemies - hit_enemy;
michaeljson 0:3817adfaeb06 223 }
michaeljson 0:3817adfaeb06 224
michaeljson 0:3817adfaeb06 225 // Same as check_hit_enemy_row1, but checks enemies at row 2
michaeljson 0:3817adfaeb06 226 void check_hit_enemy_row2()
michaeljson 0:3817adfaeb06 227 {
michaeljson 0:3817adfaeb06 228 int hit_enemy;
michaeljson 0:3817adfaeb06 229
michaeljson 0:3817adfaeb06 230 // Second Row of Enemies
michaeljson 0:3817adfaeb06 231 hit_enemy = check_enemy(&enemy_6, &missile);
michaeljson 0:3817adfaeb06 232 numOfEnemies = numOfEnemies - hit_enemy;
michaeljson 0:3817adfaeb06 233 hit_enemy = check_enemy(&enemy_7, &missile);
michaeljson 0:3817adfaeb06 234 numOfEnemies = numOfEnemies - hit_enemy;
michaeljson 0:3817adfaeb06 235 hit_enemy = check_enemy(&enemy_8, &missile);
michaeljson 0:3817adfaeb06 236 numOfEnemies = numOfEnemies - hit_enemy;
michaeljson 0:3817adfaeb06 237 hit_enemy = check_enemy(&enemy_9, &missile);
michaeljson 0:3817adfaeb06 238 numOfEnemies = numOfEnemies - hit_enemy;
michaeljson 0:3817adfaeb06 239 hit_enemy = check_enemy(&enemy_10, &missile);
michaeljson 0:3817adfaeb06 240 numOfEnemies = numOfEnemies - hit_enemy;
michaeljson 0:3817adfaeb06 241 }
michaeljson 0:3817adfaeb06 242
michaeljson 0:3817adfaeb06 243 // Same as check_hit_enemy_row1, but checks enemies at row 3
michaeljson 0:3817adfaeb06 244 void check_hit_enemy_row3()
michaeljson 0:3817adfaeb06 245 {
michaeljson 0:3817adfaeb06 246 int hit_enemy;
michaeljson 0:3817adfaeb06 247
michaeljson 0:3817adfaeb06 248 // Third Row of Enemies
michaeljson 0:3817adfaeb06 249 hit_enemy = check_enemy(&enemy_11, &missile);
michaeljson 0:3817adfaeb06 250 numOfEnemies = numOfEnemies - hit_enemy;
michaeljson 0:3817adfaeb06 251 hit_enemy = check_enemy(&enemy_12, &missile);
michaeljson 0:3817adfaeb06 252 numOfEnemies = numOfEnemies - hit_enemy;
michaeljson 0:3817adfaeb06 253 hit_enemy = check_enemy(&enemy_13, &missile);
michaeljson 0:3817adfaeb06 254 numOfEnemies = numOfEnemies - hit_enemy;
michaeljson 0:3817adfaeb06 255 hit_enemy = check_enemy(&enemy_14, &missile);
michaeljson 0:3817adfaeb06 256 numOfEnemies = numOfEnemies - hit_enemy;
michaeljson 0:3817adfaeb06 257 hit_enemy = check_enemy(&enemy_15, &missile);
michaeljson 0:3817adfaeb06 258 numOfEnemies = numOfEnemies - hit_enemy;
michaeljson 0:3817adfaeb06 259 }
michaeljson 0:3817adfaeb06 260
michaeljson 0:3817adfaeb06 261 // Checks if player is hit
michaeljson 0:3817adfaeb06 262 void check_player_hit()
michaeljson 0:3817adfaeb06 263 {
michaeljson 0:3817adfaeb06 264 hit_player = check_player(&player, &enemy_missile); // checks if the missile hits the player and returns 1 if hit, 0 if not hit
michaeljson 0:3817adfaeb06 265 }
michaeljson 0:3817adfaeb06 266
michaeljson 0:3817adfaeb06 267 // Randomly selects an enemy to fire and updates the position of where the missile will fire from
michaeljson 0:3817adfaeb06 268 void random_attack_gen()
michaeljson 0:3817adfaeb06 269 {
michaeljson 0:3817adfaeb06 270 firing_col = rand() % 5; // selects a random column
michaeljson 0:3817adfaeb06 271
michaeljson 0:3817adfaeb06 272 // first checks if the 3rd row closest to the player is alive
michaeljson 0:3817adfaeb06 273 if (enemyArray[firing_col+10]->status == ENEMY_ALIVE)
michaeljson 0:3817adfaeb06 274 {
michaeljson 0:3817adfaeb06 275 // If alive, the enemy missile position is updated to the center of the enemy
michaeljson 0:3817adfaeb06 276 enemy_missile.missile_blk_x = enemyArray[firing_col+10]->enemy_blk_x + (enemyArray[firing_col+10]->enemy_width/2);
michaeljson 0:3817adfaeb06 277 enemy_missile.missile_blk_y = enemyArray[firing_col+10]->enemy_blk_y + enemyArray[firing_col+10]->enemy_height + 1;
michaeljson 0:3817adfaeb06 278 enemy_missile.status = ENEMY_MISSILE_ACTIVE; // sets the enemy missile as active
michaeljson 0:3817adfaeb06 279 }
michaeljson 0:3817adfaeb06 280 // if enemy at 3rd row is dead, checks the enemy in the 2nd row
michaeljson 0:3817adfaeb06 281 else if (enemyArray[firing_col+5]->status == ENEMY_ALIVE)
michaeljson 0:3817adfaeb06 282 {
michaeljson 0:3817adfaeb06 283 // If alive, the enemy missile position is updated to the center of the enemy
michaeljson 0:3817adfaeb06 284 enemy_missile.missile_blk_x = enemyArray[firing_col+5]->enemy_blk_x + (enemyArray[firing_col+5]->enemy_width/2);
michaeljson 0:3817adfaeb06 285 enemy_missile.missile_blk_y = enemyArray[firing_col+5]->enemy_blk_y + enemyArray[firing_col+5]->enemy_height + 1;
michaeljson 0:3817adfaeb06 286 enemy_missile.status = ENEMY_MISSILE_ACTIVE;
michaeljson 0:3817adfaeb06 287 }
michaeljson 0:3817adfaeb06 288 // if enemy at 2nd and 3rd row is dead, checks the enemy in the 1st row
michaeljson 0:3817adfaeb06 289 else if (enemyArray[firing_col]->status == ENEMY_ALIVE)
michaeljson 0:3817adfaeb06 290 {
michaeljson 0:3817adfaeb06 291 // If alive, the enemy missile position is updated to the center of the enemy
michaeljson 0:3817adfaeb06 292 enemy_missile.missile_blk_x = enemyArray[firing_col]->enemy_blk_x + (enemyArray[firing_col]->enemy_width/2);
michaeljson 0:3817adfaeb06 293 enemy_missile.missile_blk_y = enemyArray[firing_col]->enemy_blk_y + enemyArray[firing_col]->enemy_height + 1;
michaeljson 0:3817adfaeb06 294 enemy_missile.status = ENEMY_MISSILE_ACTIVE;
michaeljson 0:3817adfaeb06 295 }
michaeljson 0:3817adfaeb06 296 }
michaeljson 0:3817adfaeb06 297
michaeljson 0:3817adfaeb06 298 // moves the enemy
michaeljson 0:3817adfaeb06 299 void enemy_motion()
michaeljson 0:3817adfaeb06 300 {
michaeljson 0:3817adfaeb06 301 // will move the enemy every 6 loops
michaeljson 0:3817adfaeb06 302 if (ENEMY_MOVE % 6 == 0)
michaeljson 0:3817adfaeb06 303 {
michaeljson 0:3817adfaeb06 304 // FIrst Row of Enemies
michaeljson 0:3817adfaeb06 305 MOVE_DOWN = move_enemy(&enemy_1, MOVE_DOWN, DIRECTION); // moves the enemy based on the DIRECTION passed in and also sends global MOVE_DOWN to update in enemy.cpp
michaeljson 0:3817adfaeb06 306 MOVE_DOWN = move_enemy(&enemy_2, MOVE_DOWN, DIRECTION); // MOVE_DOWN will be 1 enemies reach the left or right edge of the screen
michaeljson 0:3817adfaeb06 307 MOVE_DOWN = move_enemy(&enemy_3, MOVE_DOWN, DIRECTION); // MOVE_DOWN will be 2 if enemies reach the player, otherwise 0
michaeljson 0:3817adfaeb06 308 MOVE_DOWN = move_enemy(&enemy_4, MOVE_DOWN, DIRECTION);
michaeljson 0:3817adfaeb06 309 MOVE_DOWN = move_enemy(&enemy_5, MOVE_DOWN, DIRECTION);
michaeljson 0:3817adfaeb06 310
michaeljson 0:3817adfaeb06 311 // Second Row of Enemies
michaeljson 0:3817adfaeb06 312 MOVE_DOWN = move_enemy(&enemy_6, MOVE_DOWN, DIRECTION);
michaeljson 0:3817adfaeb06 313 MOVE_DOWN = move_enemy(&enemy_7, MOVE_DOWN, DIRECTION);
michaeljson 0:3817adfaeb06 314 MOVE_DOWN = move_enemy(&enemy_8, MOVE_DOWN, DIRECTION);
michaeljson 0:3817adfaeb06 315 MOVE_DOWN = move_enemy(&enemy_9, MOVE_DOWN, DIRECTION);
michaeljson 0:3817adfaeb06 316 MOVE_DOWN = move_enemy(&enemy_10, MOVE_DOWN, DIRECTION);
michaeljson 0:3817adfaeb06 317
michaeljson 0:3817adfaeb06 318 // Third Row of Enemies
michaeljson 0:3817adfaeb06 319 MOVE_DOWN = move_enemy(&enemy_11, MOVE_DOWN, DIRECTION);
michaeljson 0:3817adfaeb06 320 MOVE_DOWN = move_enemy(&enemy_12, MOVE_DOWN, DIRECTION);
michaeljson 0:3817adfaeb06 321 MOVE_DOWN = move_enemy(&enemy_13, MOVE_DOWN, DIRECTION);
michaeljson 0:3817adfaeb06 322 MOVE_DOWN = move_enemy(&enemy_14, MOVE_DOWN, DIRECTION);
michaeljson 0:3817adfaeb06 323 MOVE_DOWN = move_enemy(&enemy_15, MOVE_DOWN, DIRECTION);
michaeljson 0:3817adfaeb06 324
michaeljson 0:3817adfaeb06 325 // if MOVE_DOWN is 2, then the enemies have reached the player
michaeljson 0:3817adfaeb06 326 if (MOVE_DOWN == 2)
michaeljson 0:3817adfaeb06 327 {
michaeljson 0:3817adfaeb06 328 lose = true; // set global lose to true to go to gameover screen
michaeljson 0:3817adfaeb06 329 }
michaeljson 0:3817adfaeb06 330
michaeljson 0:3817adfaeb06 331 // if MOVE_DOWN is 1, update the y-pos of the enemies
michaeljson 0:3817adfaeb06 332 if (MOVE_DOWN == 1)
michaeljson 0:3817adfaeb06 333 {
michaeljson 0:3817adfaeb06 334 move_enemy_down(); // updates the y-pos of the enemies
michaeljson 0:3817adfaeb06 335
michaeljson 0:3817adfaeb06 336 // Flips the direction when the enemy moves down
michaeljson 0:3817adfaeb06 337 if (DIRECTION == 1)
michaeljson 0:3817adfaeb06 338 {
michaeljson 0:3817adfaeb06 339 DIRECTION = 2;
michaeljson 0:3817adfaeb06 340 }
michaeljson 0:3817adfaeb06 341 else
michaeljson 0:3817adfaeb06 342 {
michaeljson 0:3817adfaeb06 343 DIRECTION = 1;
michaeljson 0:3817adfaeb06 344 }
michaeljson 0:3817adfaeb06 345 MOVE_DOWN = 0; // sets MOVE_DOWN back to 0 to stop down movement until
michaeljson 0:3817adfaeb06 346 }
michaeljson 0:3817adfaeb06 347
michaeljson 0:3817adfaeb06 348 ENEMY_MOVE += 1;
michaeljson 0:3817adfaeb06 349 }
michaeljson 0:3817adfaeb06 350 else
michaeljson 0:3817adfaeb06 351 {
michaeljson 0:3817adfaeb06 352 ENEMY_MOVE += 1;
michaeljson 0:3817adfaeb06 353 }
michaeljson 0:3817adfaeb06 354 }
michaeljson 0:3817adfaeb06 355
michaeljson 0:3817adfaeb06 356 // moves all the enemies down in the y-direction
michaeljson 0:3817adfaeb06 357 void move_enemy_down()
michaeljson 0:3817adfaeb06 358 {
michaeljson 0:3817adfaeb06 359 // First Row of Enemies
michaeljson 0:3817adfaeb06 360 enemy_erase(&enemy_1);
michaeljson 0:3817adfaeb06 361 enemy_erase(&enemy_2);
michaeljson 0:3817adfaeb06 362 enemy_erase(&enemy_3);
michaeljson 0:3817adfaeb06 363 enemy_erase(&enemy_4);
michaeljson 0:3817adfaeb06 364 enemy_erase(&enemy_5);
michaeljson 0:3817adfaeb06 365
michaeljson 0:3817adfaeb06 366 enemy_1.enemy_blk_y += enemy_1.enemy_height+4;
michaeljson 0:3817adfaeb06 367 enemy_2.enemy_blk_y += enemy_2.enemy_height+4;
michaeljson 0:3817adfaeb06 368 enemy_3.enemy_blk_y += enemy_3.enemy_height+4;
michaeljson 0:3817adfaeb06 369 enemy_4.enemy_blk_y += enemy_4.enemy_height+4;
michaeljson 0:3817adfaeb06 370 enemy_5.enemy_blk_y += enemy_5.enemy_height+4;
michaeljson 0:3817adfaeb06 371
michaeljson 0:3817adfaeb06 372 // Second Row of Enemies
michaeljson 0:3817adfaeb06 373 enemy_erase(&enemy_6);
michaeljson 0:3817adfaeb06 374 enemy_erase(&enemy_7);
michaeljson 0:3817adfaeb06 375 enemy_erase(&enemy_8);
michaeljson 0:3817adfaeb06 376 enemy_erase(&enemy_9);
michaeljson 0:3817adfaeb06 377 enemy_erase(&enemy_10);
michaeljson 0:3817adfaeb06 378
michaeljson 0:3817adfaeb06 379 enemy_6.enemy_blk_y += enemy_6.enemy_height+4;
michaeljson 0:3817adfaeb06 380 enemy_7.enemy_blk_y += enemy_7.enemy_height+4;
michaeljson 0:3817adfaeb06 381 enemy_8.enemy_blk_y += enemy_8.enemy_height+4;
michaeljson 0:3817adfaeb06 382 enemy_9.enemy_blk_y += enemy_9.enemy_height+4;
michaeljson 0:3817adfaeb06 383 enemy_10.enemy_blk_y += enemy_10.enemy_height+4;
michaeljson 0:3817adfaeb06 384
michaeljson 0:3817adfaeb06 385 // Third Row of Enemies
michaeljson 0:3817adfaeb06 386 enemy_erase(&enemy_11);
michaeljson 0:3817adfaeb06 387 enemy_erase(&enemy_12);
michaeljson 0:3817adfaeb06 388 enemy_erase(&enemy_13);
michaeljson 0:3817adfaeb06 389 enemy_erase(&enemy_14);
michaeljson 0:3817adfaeb06 390 enemy_erase(&enemy_15);
michaeljson 0:3817adfaeb06 391
michaeljson 0:3817adfaeb06 392 enemy_11.enemy_blk_y += enemy_11.enemy_height+4;
michaeljson 0:3817adfaeb06 393 enemy_12.enemy_blk_y += enemy_12.enemy_height+4;
michaeljson 0:3817adfaeb06 394 enemy_13.enemy_blk_y += enemy_13.enemy_height+4;
michaeljson 0:3817adfaeb06 395 enemy_14.enemy_blk_y += enemy_14.enemy_height+4;
michaeljson 0:3817adfaeb06 396 enemy_15.enemy_blk_y += enemy_15.enemy_height+4;
michaeljson 0:3817adfaeb06 397 }
michaeljson 0:3817adfaeb06 398
michaeljson 0:3817adfaeb06 399 // thread that plays sounds during game
michaeljson 0:3817adfaeb06 400 void playstart(void const *args)//Th
michaeljson 0:3817adfaeb06 401 { //Depending on the state of the game,
michaeljson 0:3817adfaeb06 402 //queue either screen music or play sound effect upon fire
michaeljson 0:3817adfaeb06 403 while(true) {
michaeljson 0:3817adfaeb06 404 FILE *wave_file;
michaeljson 0:3817adfaeb06 405
michaeljson 0:3817adfaeb06 406 // plays intro music during menu screen
michaeljson 0:3817adfaeb06 407 while(game_menu)
michaeljson 0:3817adfaeb06 408 {
wminix3 2:4a3f97570578 409 wave_file=fopen("/sd/wavfiles/futureEdit2.wav","r");
wminix3 2:4a3f97570578 410 if(wave_file==NULL) pc.printf("file open error!\n\n\r"); // added this for open error check
michaeljson 0:3817adfaeb06 411 waver.play(wave_file);
michaeljson 0:3817adfaeb06 412 fclose(wave_file);
michaeljson 0:3817adfaeb06 413 }
michaeljson 0:3817adfaeb06 414
michaeljson 0:3817adfaeb06 415 // Checks in game sound conditions
michaeljson 0:3817adfaeb06 416 while(begin_game)
michaeljson 0:3817adfaeb06 417 {
michaeljson 0:3817adfaeb06 418 // play firing sound when the player fires
michaeljson 0:3817adfaeb06 419 if(!pb && missile.status == PLAYER_MISSILE_INACTIVE) {
michaeljson 0:3817adfaeb06 420
wminix3 2:4a3f97570578 421 wave_file=fopen("/sd/wavfiles/laserEdit.wav","r");
wminix3 2:4a3f97570578 422 if(wave_file==NULL) pc.printf("laser file open error!\n\n\r"); // added this for open error check
michaeljson 0:3817adfaeb06 423
michaeljson 0:3817adfaeb06 424 waver.play(wave_file);
michaeljson 0:3817adfaeb06 425 fclose(wave_file);
michaeljson 0:3817adfaeb06 426 }
michaeljson 0:3817adfaeb06 427
michaeljson 0:3817adfaeb06 428 // if player hit, play hit sound
michaeljson 0:3817adfaeb06 429 if (hit_player)
michaeljson 0:3817adfaeb06 430 {
wminix3 2:4a3f97570578 431 wave_file=fopen("/sd/wavfiles/bigExplosionEdit2.wav","r");
wminix3 2:4a3f97570578 432 if(wave_file==NULL) pc.printf("explosion file open error!\n\n\r"); // added this for open error check
michaeljson 0:3817adfaeb06 433 waver.play(wave_file);
michaeljson 0:3817adfaeb06 434 fclose(wave_file);
michaeljson 0:3817adfaeb06 435 }
michaeljson 0:3817adfaeb06 436 }
michaeljson 0:3817adfaeb06 437
michaeljson 0:3817adfaeb06 438 // players gameover voice if player loses
michaeljson 0:3817adfaeb06 439 while(gameover)
michaeljson 0:3817adfaeb06 440 {
wminix3 2:4a3f97570578 441 wave_file=fopen("/sd/wavfiles/comicalgameoverEdit.wav","r");
wminix3 2:4a3f97570578 442 if(wave_file==NULL) pc.printf("gameover file open error!\n\n\r"); // added this for open error check
michaeljson 0:3817adfaeb06 443 waver.play(wave_file);
michaeljson 0:3817adfaeb06 444 fclose(wave_file);
michaeljson 0:3817adfaeb06 445 }
michaeljson 0:3817adfaeb06 446 }
michaeljson 0:3817adfaeb06 447 }
michaeljson 0:3817adfaeb06 448
michaeljson 0:3817adfaeb06 449 int main() {
michaeljson 0:3817adfaeb06 450
michaeljson 0:3817adfaeb06 451 // Initialization of Setup variables
michaeljson 0:3817adfaeb06 452 int blk_x, blk_y;
michaeljson 0:3817adfaeb06 453 pb.mode(PullUp);
michaeljson 0:3817adfaeb06 454
michaeljson 0:3817adfaeb06 455 Thread thread(playstart); // intializes the thread to play sound
michaeljson 0:3817adfaeb06 456
michaeljson 0:3817adfaeb06 457 uLCD.baudrate(500000); // set to 500000 to increase smooth gameplay
michaeljson 0:3817adfaeb06 458
michaeljson 0:3817adfaeb06 459 // Initialization of Game Menu variables
michaeljson 0:3817adfaeb06 460 const int title_x_pos = 2; // initial x-pos of title
michaeljson 0:3817adfaeb06 461 const int title_y_pos = 3; // initial y-pos of title
michaeljson 0:3817adfaeb06 462 int start_label_x_pos = 7; // start label x-pos
michaeljson 0:3817adfaeb06 463 int start_label_y_pos = 7; // start label y-pos
michaeljson 0:3817adfaeb06 464 int level_cursor_x_pos = 5; // level cursor x-position
wminix3 2:4a3f97570578 465 int level_cursor_y_pos_start = 7; // level cursor y-position
wminix3 2:4a3f97570578 466 //int level_cursor_y_pos = 7; // initial level_cursor_y_pos @ start -- Added by Brice for more menu options
wminix3 2:4a3f97570578 467 int level_cursor_y_pos_end = 8; // BOTTOM CURSOR POS -- Added by Brice for more menu options
michaeljson 0:3817adfaeb06 468 int gameover_x_pos = 5; // gameover label x-position
michaeljson 0:3817adfaeb06 469 int gameover_y_pos = 5; // gameover label y-position
michaeljson 0:3817adfaeb06 470 int win_x_pos = 2; // congratulations label x-position
michaeljson 0:3817adfaeb06 471 int win_y_pos = 5; // congratulations label y-position
michaeljson 0:3817adfaeb06 472 int startover_x_pos = 3; // startover label x-position
michaeljson 0:3817adfaeb06 473 int startover_y_pos = 8; // startover label y-position
michaeljson 0:3817adfaeb06 474
michaeljson 0:3817adfaeb06 475 // intialize temporary score and current score
michaeljson 0:3817adfaeb06 476 int temp = 0;
michaeljson 0:3817adfaeb06 477 int score = 0;
michaeljson 0:3817adfaeb06 478
wminix3 2:4a3f97570578 479 // Additional globals added for two-player and one-player capabilities (by Brice)
wminix3 2:4a3f97570578 480
michaeljson 0:3817adfaeb06 481 // Begin game loop
michaeljson 0:3817adfaeb06 482 while(1)
michaeljson 0:3817adfaeb06 483 {
michaeljson 0:3817adfaeb06 484 // initialize all starting conditions for the beginning of the game
michaeljson 0:3817adfaeb06 485 game_menu = true; // defaults to display menu screen
michaeljson 0:3817adfaeb06 486 ENEMY_MOVE = true; // defaults to move enemy
michaeljson 0:3817adfaeb06 487 DIRECTION = 1; // default to move right
michaeljson 0:3817adfaeb06 488 hit_player = 0; // default to not player hit
michaeljson 0:3817adfaeb06 489 MOVE_DOWN = 0; // default to not move down
michaeljson 0:3817adfaeb06 490 lose = false; // default to not lose
michaeljson 0:3817adfaeb06 491 lives = 3; // defaults to 3 lives
michaeljson 0:3817adfaeb06 492 score = 0; // default to score of 0
wminix3 2:4a3f97570578 493 int level_cursor_y_pos = 7; // initial level_cursor_y_pos @ start -- Added by Brice for more menu options
michaeljson 0:3817adfaeb06 494 uLCD.cls();
wminix3 2:4a3f97570578 495 // Brice moved this out of the loop since it shouldn't change
wminix3 2:4a3f97570578 496 //uLCD.locate(title_x_pos,title_y_pos); // "SPACE INVADERS" title position
wminix3 2:4a3f97570578 497 //uLCD.printf("SPACE INVADERS"); // Title
michaeljson 0:3817adfaeb06 498 // Implementation of Game Menu
michaeljson 0:3817adfaeb06 499 while(game_menu)
michaeljson 0:3817adfaeb06 500 {
wminix3 2:4a3f97570578 501 // Brice added this in order to move the cursor through the menu options
wminix3 2:4a3f97570578 502 uLCD.locate(level_cursor_x_pos, level_cursor_y_pos);
wminix3 2:4a3f97570578 503 uLCD.printf(" ");
wminix3 2:4a3f97570578 504 if (myNav.down() && level_cursor_y_pos < level_cursor_y_pos_end) {
wminix3 2:4a3f97570578 505 level_cursor_y_pos += 1;
wminix3 2:4a3f97570578 506 } else if (myNav.up() && level_cursor_y_pos > level_cursor_y_pos_start) {
wminix3 2:4a3f97570578 507 level_cursor_y_pos -= 1;
wminix3 2:4a3f97570578 508 }
wminix3 2:4a3f97570578 509 // end of movable cursor
michaeljson 0:3817adfaeb06 510 uLCD.locate(level_cursor_x_pos,level_cursor_y_pos); // draws cursor next to "START" label
michaeljson 0:3817adfaeb06 511 uLCD.printf("->");
michaeljson 0:3817adfaeb06 512
michaeljson 0:3817adfaeb06 513 uLCD.locate(title_x_pos,title_y_pos); // "SPACE INVADERS" title position
michaeljson 0:3817adfaeb06 514 uLCD.printf("SPACE INVADERS"); // Title
michaeljson 0:3817adfaeb06 515
michaeljson 0:3817adfaeb06 516 uLCD.locate(start_label_x_pos,start_label_y_pos); // "START" label position
wminix3 2:4a3f97570578 517 uLCD.printf("ONE-PLAYER");
wminix3 2:4a3f97570578 518
wminix3 2:4a3f97570578 519 uLCD.locate(start_label_x_pos,start_label_y_pos + 1);
wminix3 2:4a3f97570578 520 uLCD.printf("TWO-PLAYER");
michaeljson 0:3817adfaeb06 521 // if pushbutton is pressed, game menu is exited and game begins
michaeljson 0:3817adfaeb06 522 if(!pb)
michaeljson 0:3817adfaeb06 523 {
michaeljson 0:3817adfaeb06 524 game_menu = false;
wminix3 2:4a3f97570578 525 if (level_cursor_y_pos == start_label_y_pos) {
wminix3 2:4a3f97570578 526 numPlayers = 1;
wminix3 2:4a3f97570578 527 } else if (level_cursor_y_pos == start_label_y_pos + 1) {
wminix3 2:4a3f97570578 528 numPlayers = 2;
wminix3 2:4a3f97570578 529 }
michaeljson 0:3817adfaeb06 530 wait(0.5);
michaeljson 0:3817adfaeb06 531 }
michaeljson 0:3817adfaeb06 532 }
michaeljson 0:3817adfaeb06 533
michaeljson 0:3817adfaeb06 534 begin_game = true; // defaults begin_game to true
michaeljson 0:3817adfaeb06 535
michaeljson 0:3817adfaeb06 536 uLCD.cls();
michaeljson 0:3817adfaeb06 537
michaeljson 0:3817adfaeb06 538 // Draw the enemies
michaeljson 0:3817adfaeb06 539 draw_enemies_level();
michaeljson 0:3817adfaeb06 540
michaeljson 0:3817adfaeb06 541 // Draw the player
michaeljson 0:3817adfaeb06 542 draw_initial_player();
michaeljson 0:3817adfaeb06 543
michaeljson 0:3817adfaeb06 544 // sets the initial position of player missile and enemy missile (later updated)
michaeljson 0:3817adfaeb06 545 blk_x = player.player_blk_x+(player.player_width/2);
michaeljson 0:3817adfaeb06 546 blk_y = player.player_blk_y;
michaeljson 0:3817adfaeb06 547 missile_init(&missile, blk_x, blk_y, WHITE);
michaeljson 1:618aa2c4ca6a 548 int e_blk_x = 0;
michaeljson 1:618aa2c4ca6a 549 int e_blk_y = 2;
michaeljson 1:618aa2c4ca6a 550 enemy_missile_init(&enemy_missile, e_blk_x, e_blk_y, WHITE);
michaeljson 0:3817adfaeb06 551
michaeljson 0:3817adfaeb06 552 // prints lives
michaeljson 0:3817adfaeb06 553 uLCD.locate(0,0);
michaeljson 0:3817adfaeb06 554 uLCD.printf("Lives:%i", lives);
michaeljson 0:3817adfaeb06 555
michaeljson 0:3817adfaeb06 556 // prints score
michaeljson 0:3817adfaeb06 557 uLCD.locate(9,0);
michaeljson 0:3817adfaeb06 558 uLCD.printf("Score:%i", score);
michaeljson 0:3817adfaeb06 559
michaeljson 0:3817adfaeb06 560 // game play loop
michaeljson 0:3817adfaeb06 561 while(begin_game)
michaeljson 0:3817adfaeb06 562 {
michaeljson 0:3817adfaeb06 563 // updates score
michaeljson 0:3817adfaeb06 564 temp = score;
michaeljson 0:3817adfaeb06 565 score = (15-numOfEnemies)*15;
michaeljson 0:3817adfaeb06 566
michaeljson 0:3817adfaeb06 567 // prints score if score changes
michaeljson 0:3817adfaeb06 568 if (score != temp)
michaeljson 0:3817adfaeb06 569 {
michaeljson 0:3817adfaeb06 570 uLCD.locate(9,0);
michaeljson 0:3817adfaeb06 571 uLCD.printf("Score:%i", score);
michaeljson 0:3817adfaeb06 572 }
michaeljson 0:3817adfaeb06 573
michaeljson 0:3817adfaeb06 574 // move enemy
michaeljson 0:3817adfaeb06 575 enemy_motion();
michaeljson 0:3817adfaeb06 576
michaeljson 0:3817adfaeb06 577 // checks if player missile passes y-pos of row1
michaeljson 0:3817adfaeb06 578 if (missile.missile_blk_y+1-missile.missile_height <= enemy_1.enemy_blk_y
michaeljson 0:3817adfaeb06 579 && missile.missile_blk_y+1-missile.missile_height >= enemy_1.enemy_blk_y-enemy_1.enemy_height)
michaeljson 0:3817adfaeb06 580 {
michaeljson 0:3817adfaeb06 581 check_hit_enemy_row1();
michaeljson 0:3817adfaeb06 582 }
michaeljson 0:3817adfaeb06 583
michaeljson 0:3817adfaeb06 584 // checks if player missile passes y-pos of row2
michaeljson 0:3817adfaeb06 585 if (missile.missile_blk_y+1-missile.missile_height <= enemy_6.enemy_blk_y
michaeljson 0:3817adfaeb06 586 && missile.missile_blk_y+1-missile.missile_height >= enemy_6.enemy_blk_y-enemy_6.enemy_height)
michaeljson 0:3817adfaeb06 587 {
michaeljson 0:3817adfaeb06 588 check_hit_enemy_row2();
michaeljson 0:3817adfaeb06 589 }
michaeljson 0:3817adfaeb06 590
michaeljson 0:3817adfaeb06 591 // checks if player missile passes y-pos of row3
michaeljson 0:3817adfaeb06 592 if (missile.missile_blk_y+1-missile.missile_height <= enemy_11.enemy_blk_y
michaeljson 0:3817adfaeb06 593 && missile.missile_blk_y+1-missile.missile_height >= enemy_11.enemy_blk_y-enemy_11.enemy_height)
michaeljson 0:3817adfaeb06 594 {
michaeljson 0:3817adfaeb06 595 check_hit_enemy_row3();
michaeljson 0:3817adfaeb06 596 }
michaeljson 0:3817adfaeb06 597
michaeljson 0:3817adfaeb06 598 // Random Enemy Fire
michaeljson 0:3817adfaeb06 599 if (enemy_missile.status == ENEMY_MISSILE_INACTIVE)
michaeljson 0:3817adfaeb06 600 {
michaeljson 0:3817adfaeb06 601 random_attack_gen();
michaeljson 0:3817adfaeb06 602 }
michaeljson 0:3817adfaeb06 603
michaeljson 0:3817adfaeb06 604 // checks if enemy missile passes y-pos of player
michaeljson 0:3817adfaeb06 605 if (enemy_missile.missile_blk_y >= player.player_blk_y
michaeljson 0:3817adfaeb06 606 && enemy_missile.missile_blk_y <= player.player_blk_y+player.player_height)
michaeljson 0:3817adfaeb06 607 {
michaeljson 0:3817adfaeb06 608 check_player_hit();
michaeljson 0:3817adfaeb06 609 }
michaeljson 0:3817adfaeb06 610
michaeljson 0:3817adfaeb06 611 update_missile_pos(&missile); // updates player missile position
michaeljson 0:3817adfaeb06 612 update_enemy_missile_pos(&enemy_missile); // updates enemy missile position
michaeljson 0:3817adfaeb06 613
michaeljson 0:3817adfaeb06 614 // Player Movement checked with navigation switch
michaeljson 0:3817adfaeb06 615 if (myNav.left() && ((player.player_blk_x-3) > 0))
michaeljson 0:3817adfaeb06 616 {
michaeljson 0:3817adfaeb06 617 player_erase(&player);
michaeljson 0:3817adfaeb06 618 player.player_blk_x -= 3;
michaeljson 0:3817adfaeb06 619 player_show(&player);
michaeljson 0:3817adfaeb06 620 }
michaeljson 0:3817adfaeb06 621 else if (myNav.right() && ((player.player_blk_x+3) < (128-player.player_width)))
michaeljson 0:3817adfaeb06 622 {
michaeljson 0:3817adfaeb06 623 player_erase(&player);
michaeljson 0:3817adfaeb06 624 player.player_blk_x += 3;
michaeljson 0:3817adfaeb06 625 player_show(&player);
michaeljson 0:3817adfaeb06 626 }
michaeljson 0:3817adfaeb06 627
michaeljson 0:3817adfaeb06 628 // Player Fire
michaeljson 0:3817adfaeb06 629 if (pb == 0 && missile.status == PLAYER_MISSILE_INACTIVE)
michaeljson 0:3817adfaeb06 630 {
michaeljson 0:3817adfaeb06 631 missile.missile_blk_x = player.player_blk_x+(player.player_width/2);
michaeljson 0:3817adfaeb06 632 missile.missile_blk_y = player.player_blk_y;
michaeljson 0:3817adfaeb06 633 missile.status = PLAYER_MISSILE_ACTIVE;
michaeljson 0:3817adfaeb06 634 }
michaeljson 0:3817adfaeb06 635
michaeljson 0:3817adfaeb06 636 // checks if player destroyed all enemies
michaeljson 0:3817adfaeb06 637 if (numOfEnemies == 0)
michaeljson 0:3817adfaeb06 638 {
michaeljson 0:3817adfaeb06 639 uLCD.cls();
michaeljson 0:3817adfaeb06 640
michaeljson 0:3817adfaeb06 641 bool win = true; // sets win to true, for win screen
michaeljson 0:3817adfaeb06 642 begin_game = false;
michaeljson 0:3817adfaeb06 643
michaeljson 0:3817adfaeb06 644 // displays video clip
michaeljson 0:3817adfaeb06 645 uLCD.cls();
michaeljson 0:3817adfaeb06 646 uLCD.media_init();
michaeljson 0:3817adfaeb06 647 uLCD.set_sector_address(0x00, 0x00);
michaeljson 0:3817adfaeb06 648 uLCD.display_video(0,0);
michaeljson 0:3817adfaeb06 649 wait(1);
michaeljson 0:3817adfaeb06 650
michaeljson 0:3817adfaeb06 651 uLCD.cls();
michaeljson 0:3817adfaeb06 652
michaeljson 0:3817adfaeb06 653 // prints "Congratulations" on uLCD
michaeljson 0:3817adfaeb06 654 uLCD.locate(win_x_pos,win_y_pos);
michaeljson 0:3817adfaeb06 655 uLCD.printf("CONGRATULATIONS!");
michaeljson 0:3817adfaeb06 656
michaeljson 0:3817adfaeb06 657 // prints "Play Again?" and "Press pb..."
michaeljson 0:3817adfaeb06 658 uLCD.locate(startover_x_pos, startover_y_pos);
michaeljson 0:3817adfaeb06 659 uLCD.printf("Play Again?");
michaeljson 0:3817adfaeb06 660 uLCD.locate(startover_x_pos, startover_y_pos+1);
michaeljson 0:3817adfaeb06 661 uLCD.printf("Press pb...");
michaeljson 0:3817adfaeb06 662
michaeljson 0:3817adfaeb06 663 // waits at win screen until pushbutton is pressed
michaeljson 0:3817adfaeb06 664 while (win)
michaeljson 0:3817adfaeb06 665 {
michaeljson 0:3817adfaeb06 666 // if pb is pressed, reset game to start menu
michaeljson 0:3817adfaeb06 667 if (!pb)
michaeljson 0:3817adfaeb06 668 {
michaeljson 0:3817adfaeb06 669 win = false;
michaeljson 0:3817adfaeb06 670 wait(0.5);
michaeljson 0:3817adfaeb06 671 }
michaeljson 0:3817adfaeb06 672 }
michaeljson 0:3817adfaeb06 673
michaeljson 0:3817adfaeb06 674 }
michaeljson 0:3817adfaeb06 675
michaeljson 0:3817adfaeb06 676 // checks if player was hit
michaeljson 0:3817adfaeb06 677 if (hit_player)
michaeljson 0:3817adfaeb06 678 {
michaeljson 0:3817adfaeb06 679 // updates lives
michaeljson 0:3817adfaeb06 680 lives -= 1;
michaeljson 0:3817adfaeb06 681 wait(0.5);
michaeljson 0:3817adfaeb06 682 hit_player = 0;
michaeljson 0:3817adfaeb06 683 player_show(&player);
michaeljson 0:3817adfaeb06 684 player.status = PLAYER_ALIVE;
michaeljson 0:3817adfaeb06 685
michaeljson 0:3817adfaeb06 686 // prints updated lives number
michaeljson 0:3817adfaeb06 687 uLCD.locate(0,0);
michaeljson 0:3817adfaeb06 688 uLCD.printf("Lives:%i", lives);
michaeljson 0:3817adfaeb06 689 }
michaeljson 0:3817adfaeb06 690
michaeljson 0:3817adfaeb06 691 // if player loses all lives or enemy reaches the player
michaeljson 0:3817adfaeb06 692 if (lose || lives == 0)
michaeljson 0:3817adfaeb06 693 {
michaeljson 0:3817adfaeb06 694 begin_game = false; // set to false to end game
michaeljson 0:3817adfaeb06 695 uLCD.cls();
michaeljson 0:3817adfaeb06 696
michaeljson 0:3817adfaeb06 697 gameover = true; // set to go to display gameover screen
michaeljson 0:3817adfaeb06 698
michaeljson 0:3817adfaeb06 699 // prints "GAMEOVER" to uLCD
michaeljson 0:3817adfaeb06 700 uLCD.locate(gameover_x_pos, gameover_y_pos);
michaeljson 0:3817adfaeb06 701 uLCD.printf("GAMEOVER");
michaeljson 0:3817adfaeb06 702 wait(1);
michaeljson 0:3817adfaeb06 703
michaeljson 0:3817adfaeb06 704 // prints "Play Again?" and "Press pb..."
michaeljson 0:3817adfaeb06 705 uLCD.locate(startover_x_pos, startover_y_pos);
michaeljson 0:3817adfaeb06 706 uLCD.printf("Play Again?");
michaeljson 0:3817adfaeb06 707 uLCD.locate(startover_x_pos, startover_y_pos+1);
michaeljson 0:3817adfaeb06 708 uLCD.printf("Press pb...");
michaeljson 0:3817adfaeb06 709
michaeljson 0:3817adfaeb06 710 // stays in gameover screen until pb is pressed
michaeljson 0:3817adfaeb06 711 while (gameover)
michaeljson 0:3817adfaeb06 712 {
michaeljson 0:3817adfaeb06 713 // if pb is pressed, game is reset to the game menu screen
michaeljson 0:3817adfaeb06 714 if (!pb)
michaeljson 0:3817adfaeb06 715 {
michaeljson 0:3817adfaeb06 716 gameover = false;
michaeljson 0:3817adfaeb06 717 game_menu = true;
michaeljson 0:3817adfaeb06 718 wait(0.5);
michaeljson 0:3817adfaeb06 719 }
michaeljson 0:3817adfaeb06 720 }
michaeljson 0:3817adfaeb06 721 }
michaeljson 0:3817adfaeb06 722
michaeljson 0:3817adfaeb06 723 }
michaeljson 0:3817adfaeb06 724 }
michaeljson 0:3817adfaeb06 725 }