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

Bullet.c

Committer:
Oshyrath
Date:
2017-09-17
Revision:
0:c9afe145b57b
Child:
1:527a11035e0b

File content as of revision 0:c9afe145b57b:

#include "Bullet.h"
void addEnemyBullet(uint16_t x_pos, uint16_t y_pos)
{
    struct Bullet * newBullet = (struct Bullet *) malloc(sizeof(struct Bullet));
    newBullet->x_pos = x_pos;
    newBullet->y_pos = y_pos;
    newBullet->x_vel = 0;
    newBullet->y_vel = DEFAULT_BULLET_SPEED;
    newBullet->isPlayerBullet = 0;
    enemyBulletCount++;
    if(enemyBulletCount==1)
    {
        newBullet->prev = newBullet;
        newBullet->next = newBullet;
        enemyBulletPTR = newBullet;
        return;
    }
    struct Bullet * tempNext = enemyBulletPTR->next;
    enemyBulletPTR->next = newBullet;
    newBullet->prev = enemyBulletPTR;
    tempNext->prev = newBullet;
    newBullet->next = tempNext;
}
void addPlayerBullet(uint16_t x_pos, uint16_t y_pos, uint16_t x_vel, uint16_t y_vel, uint8_t power)
{
    struct Bullet * newBullet = (struct Bullet *) malloc(sizeof(struct Bullet));
    newBullet->x_pos = x_pos;
    newBullet->y_pos = y_pos;
    newBullet->x_vel = x_vel;
    newBullet->y_vel = y_vel;
    newBullet->powerShot = power;
    newBullet->isPlayerBullet = 1;
    playerBulletCount++;
    if(playerBulletCount==1)
    {
        newBullet->prev = newBullet;
        newBullet->next = newBullet;
        playerBulletPTR = newBullet;
        return;
    }
    struct Bullet * tempNext = playerBulletPTR->next;
    playerBulletPTR->next = newBullet;
    newBullet->prev = playerBulletPTR;
    tempNext->prev = newBullet;
    newBullet->next = tempNext;   
} 
void removeBullet(struct Bullet * removePTR)
{
    if(removePTR->isPlayerBullet)
    {
        if(playerBulletCount <= 0)
            return;
        playerBulletCount--;
        if(playerBulletCount == 1)
            playerBulletPTR = (struct Bullet *) 0;
        else
        {
            playerBulletPTR = removePTR->prev;
            struct Bullet * tempNext = removePTR->next;
            playerBulletPTR->next = tempNext;
            tempNext->prev = playerBulletPTR;
        }
    }
    else
    {
        if(enemyBulletCount <= 0)
            return;
        enemyBulletCount--;
        if(enemyBulletCount == 1)
            enemyBulletPTR = (struct Bullet *) 0;
        else
        {
            enemyBulletPTR = removePTR->prev;
            struct Bullet * tempNext = removePTR->next;
            enemyBulletPTR->next = tempNext;
            tempNext->prev = enemyBulletPTR;
        }
    }
    free(removePTR);
}
void clearBullets()
{
    while(enemyBulletCount)
        removeBullet(enemyBulletPTR);
    while(playerBulletCount)
        removeBullet(playerBulletPTR);
}

//Specific to 1 Bullet
void bulletMovement(struct Bullet * bullet)
{
    bullet->x_pos+=bullet->x_vel;
    bullet->y_pos+=bullet->y_vel;
}
void bulletMovement_ALL()
{
    int i;
    for(i = playerBulletCount; i; i--)
    {
        bulletMovement(playerBulletPTR);
        playerBulletPTR = playerBulletPTR->next;
    }
    for(i = enemyBulletCount; i; i--)
    {
        bulletMovement(enemyBulletPTR);
        enemyBulletPTR = enemyBulletPTR->next;
    }
} 
void removeBulletIfOOB(struct Bullet * bullet)
{
    int xp = bullet->x_pos;
    int yp = bullet->y_pos;
    if(bullet->isPlayerBullet)
    {
        if((xp <= -BULLET_SIZE)||(xp>=LCD_WIDTH)||(yp <= -BULLET_SIZE)||(yp>=LCD_HEIGHT))
            removeBullet(bullet);
    }  
    else
    {
        if(yp >= LCD_HEIGHT)
            removeBullet(bullet);
    } 
}
void removeBulletIfOOB_ALL()
{
    int i;
    for(i = enemyBulletCount; i; i--)
    {
        enemyBulletPTR = enemyBulletPTR->next;
        removeBulletIfOOB(enemyBulletPTR);
    }
    for(i = playerBulletCount; i; i--)
    {
        playerBulletPTR = playerBulletPTR->next;
        removeBulletIfOOB(playerBulletPTR);
    }
}
void callMultiFuncBullet()
{
    bulletMovement_ALL();
    removeBulletIfOOB_ALL();
}