This code contains the game Starship designed for the STM32F429i-DISC1 board. It requires a keyboard to play.
Dependencies: Starship LCD_DISCO_F429ZI USBHost mbed
Diff: Enemy.c
- Revision:
- 0:c9afe145b57b
- Child:
- 1:527a11035e0b
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Enemy.c Sun Sep 17 17:05:27 2017 +0000 @@ -0,0 +1,127 @@ +#include "Enemy.h" + + + +void addEnemy(uint16_t x_pos, uint16_t x_vel,uint16_t y_vel, uint16_t health) +{ + struct Enemy * newEnemy = (struct Enemy *) malloc(sizeof(struct Enemy)); + newEnemy->x_pos = x_pos; + newEnemy->y_pos = -ENEMY_HEIGHT; + newEnemy->x_vel = x_vel; + newEnemy->y_vel = y_vel; + newEnemy->health = health; + enemyCount++; + if(enemyCount==1) + { + newEnemy->prev = newEnemy; + newEnemy->next = newEnemy; + enemyPTR = newEnemy; + return; + } + struct Enemy * tempNext = enemyPTR->next; + enemyPTR->next = newEnemy; + newEnemy->prev = enemyPTR; + tempNext->prev = newEnemy; + newEnemy->next = tempNext; +} +void removeEnemy(struct Enemy * removePTR) +{ + if(enemyCount <= 0) + return; + enemyCount--; + if(enemyCount == 1) + enemyPTR = (struct Enemy *) 0; + else + { + enemyPTR = removePTR->prev; + struct Enemy * tempNext = removePTR->next; + enemyPTR->next = tempNext; + tempNext->prev = enemyPTR; + } + free(removePTR); +} +void clearEnemies() +{ + while(enemyCount) + removeEnemy(enemyPTR); +} +void freezeEnemies() +{ + int i; + for(i = enemyCount; i; i--) + { + enemyPTR->freezeTimer = FREEZE_TIME; + enemyPTR = enemyPTR->next; + } +} +uint16_t getBulletPos(struct Enemy * enemy,uint8_t XOrY) +{ + if(XOrY==X_ID) + return enemy->x_pos+ENEMY_WIDTH/2-BULLET_SIZE/2; + return enemy->y_pos+ENEMY_HEIGHT-BULLET_SIZE/2; +} +void enemyMovement(struct Enemy * enemy) +{ + if(enemy->freezeTimer) + return; + if(enemy->x_pos + ENEMY_WIDTH >= LCD_WIDTH-ENEMY_WIDTH && enemy->x_vel>0) + enemy->x_vel = -enemy->x_vel; + else if(enemy->x_pos<=0 && enemy->x_vel<0) + enemy->x_vel = -enemy->x_vel; + enemy->x_pos+=enemy->x_vel; + enemy->y_pos+=enemy->y_vel; +} + +void enemyMovement_ALL() +{ + int i; + for(i = enemyCount; i; i--) + { + enemyMovement(enemyPTR); + enemyPTR = enemyPTR->next; + } +} +void updateEnemyTimers(struct Enemy * enemy) +{ + enemy->freezeTimer = enemy->freezeTimer ? (enemy->freezeTimer -1) : 0; + enemy->gunTimer = enemy->gunTimer ? (enemy->gunTimer -1) : 0; +} +void updateEnemyTimers_ALL() +{ + int i; + for(i = enemyCount;i;i--) + { + updateEnemyTimers(enemyPTR); + enemyPTR = enemyPTR->next; + } +} +void removeEnemyIfOOB(struct Enemy * enemy) +{ + if(enemy->x_pos>=LCD_HEIGHT) + removeEnemy(enemy); +} +void removeEnemyIfOOB_ALL() +{ + int i; + for(i = enemyCount; i ;i--) + { + enemyPTR = enemyPTR->next; + removeEnemyIfOOB(enemyPTR); + } +} +uint8_t dealDamage(struct Enemy * enemy, uint8_t damage) +{ + enemy->health-=damage; + if(enemy->health<=0) + { + removeEnemy(enemy); + return 1; + } + return 0; +} +void callMultiFuncEnemy() +{ + removeEnemyIfOOB_ALL(); + updateEnemyTimers_ALL(); + enemyMovement_ALL(); +} \ No newline at end of file