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

Dependents:   Starship

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