Space Invaders Library
Dependents: PORGFINAL SpaceInvadersFINAL
SIgame.cpp
- Committer:
- zlee9
- Date:
- 2013-03-07
- Revision:
- 2:129acb1b98c7
- Parent:
- 0:4564efa43302
File content as of revision 2:129acb1b98c7:
#include "SIgame.h" #include "mbed.h" /***************************************************************/ /* */ /* Game-Related Functions */ /* */ /***************************************************************/ OBJECT startShip() {/****** * startShip * Sets up structure for player's ship ******/ OBJECT ship; ship.height = SHIP_HEIGHT; ship.width = SHIP_WIDTH; ship.y = SCREENHEIGHT - ship.height + 1; // Starting location ship.x = SCREENWIDTH >> 1; ship.color = GREEN; // Player's ship is green ship.killed = false; return ship; } void summonWave() {/****** * summonWave * Initialize 2-D array containing columns of aliens and their starting * indicies ******/ int r, c, i, j; j = 1; for (c = 0; c < NUM_ALIEN_COLS; c++) { i = 0; for (r = 0; r < NUM_ALIEN_ROWS; r++) { // Within current column, initialize aliens' locations wave[r][c].x = j; wave[r][c].width = ALIEN_WIDTH; wave[r][c].y = i; wave[r][c].height = ALIEN_HEIGHT; wave[r][c].color = WHITE; // Aliens are white wave[r][c].killed = false; i += (ALIEN_HEIGHT + 1); } j += (ALIEN_WIDTH + 3); // Ready gap for next column of aliens } } void destroyAlien(int *pals_rem, POINT *pylaser, OBJECT *frontline[]) {/****** * destroyAlien * Checks if ship's laser hits any alien and kill alien if so ******/ bool hit = false; int r, c = 0; do { // Go to column from wave of aliens of which laser may hit alien if (pylaser->x >= wave[0][c].x && pylaser->x <= wave[0][c].x + wave[0][c].width - 1) { r = 0; do // Find alien in column that laser touches if possible { if (pylaser->y >= wave[r][c].y && pylaser->y <= wave[r][c].y + wave[r][c].height && !(wave[r][c].killed) && !(pylaser->collide)) { // Alien is killed and not be drawn on screen (*pals_rem)--; wave[r][c].killed = pylaser->collide = hit = true; // Adjust pointer to front alien of selected column if killed // alien was one if (frontline[c] == &wave[r][c]) { if (!r) // All aliens on that are wiped out frontline[c] = NULL; else // Point to alien behind killed one frontline[c] = &wave[r-1][c]; } } r++; } while (!hit && r < NUM_ALIEN_ROWS); } c++; } while (!hit && c < NUM_ALIEN_COLS); } bool twoLasersCollide(POINT *pylaser, POINT elaser[]) {/****** * twoLasersCollide * Checks if player's laser touches any of alien's lasers and removes them if * so ******/ int i; for (i = 0; i < ELASER_CAP; i++) { // Find enemy laser in same location as player's laser if so if (pylaser->x == elaser[i].x && pylaser->y <= elaser[i].y+2 && !(pylaser->collide || elaser[i].collide)) { // Both lasers cancel each other out and disappear on screen pylaser->collide = elaser[i].collide = true; return true; } } return false; } bool moveAlienWave(bool *pleft) {/****** * moveAlienWave * Changes all aliens' locations to move wave of aliens ******/ int r, c; bool reach, old_dir; reach = false; old_dir = *pleft; // Flip direction when wave reaches either side of screen if (wave[NUM_ALIEN_ROWS-1][0].x <= 0 && *pleft) *pleft = false; else if (wave[NUM_ALIEN_ROWS-1][NUM_ALIEN_COLS-1].x + ALIEN_WIDTH >= SCREENWIDTH && !(*pleft)) *pleft = true; // Change all aliens' locations in array for (c = 0; c < NUM_ALIEN_COLS; c++) { for (r = 0; r < NUM_ALIEN_ROWS; r++) { if (old_dir ^ *pleft) // Moves downward if end columns touch borders wave[r][c].y += ALIEN_HEIGHT; // If not moving down, then moves horizontally if (*pleft) (wave[r][c].x)--; else (wave[r][c].x)++; // Player loses if any alien reaches screen border at player's side if (wave[r][c].y > SCREENHEIGHT - (wave[r][c].height << 1) + 1 && !(wave[r][c].killed)) reach = true; } } return reach; }