Game for 4180 Lab4

Dependencies:   4DGL-uLCD-SE 4180_lab4_tank_war_game Game_Synchronizer MMA8452 SDFileSystem mbed-rtos mbed wave_player

Dependents:   4180_lab4_tank_war_game

Bullet/bullet.cpp

Committer:
ychen644
Date:
2017-03-13
Revision:
0:ffed9a3bc797

File content as of revision 0:ffed9a3bc797:

#include "uLCD_4DGL.h"
#include "bullet.h"
#include "game_synchronizer.h"
#include "globals.h"
#include "math.h"
#include "playSound.h"

extern Serial pc;

extern Game_Synchronizer sync;

// Initialize the bullet. Don't have to do much here.
// Keep a pointer to this bullet's tank.
// Set the speed, and default the bullet to not in_flight.
Bullet::Bullet(Tank* t) {
    tank = t;
    speed = 30;
    powerups = 2;
    power = 0;
    in_flight = false;
}

// If in_flight, do nothing. Otherwise,
// set the in_flight flag, and initialize values needed for
// the trajectory calculations. (x0, y0), (vx0, vy0), time
// Hint: tank->barrel_end(...) is useful here.
void Bullet::shoot(void) {
    if (!in_flight) {
        in_flight = true;
        tank->barrel_end(&x0, &y0);
        x = x0;
        y = y0;
        vx0 = speed*cos(tank->barrel_theta);
        vy0 = speed*sin(tank->barrel_theta);
        vx = vx0;
        vy = vy0;
        bounce = 0;
        time = 0;
    }
}

void Bullet::changeSky(int SKY_COLOR2) {
    SKY_COLOR = SKY_COLOR2;
}

// power up increases explosion size
// you get 2 powerups per round
void Bullet::powerUp(void) {
    if (powerups > 0) {
        // play sound for powerup
        playSound("/sd/wavfiles/boing2.wav");
        powerups = powerups - 1;
        power = power + 1;
    }
}

// If the bullet is in flight, calculate its new position
// after a time delta dt.
void Bullet::update_position(float dt) {
    vx = vx;
    vy = vy - 9.81*dt;
    x = floor(x0 + vx*time);
    y = floor(y0 + vy*time - 0.5*9.81*time*time);
}

void boing(void const *argument) {
    playSound("/sd/wavfiles/boing2.wav");
}

int Bullet::time_step(float dt) {
    // If the bullet hasn't hit anything, 
    // redraw the bullet at its new location. 
    // If it has hit something (obstacle, tank, edge of the screen), 
    // set the in_flight flag back to false, explode the nearby area,
    // and return one of the following codes.
    //
    // return codes:
    //      BULLET_NO_COLLISION: no collision
    //      BULLET_OFF_SCREEN:   off the side of the screen
    //      Otherwise, return the color you've hit in 16bpp format.
    if (in_flight) {
        int x_old = x;
        int y_old = y;
        // old pixel
        sync.pixel(x_old, y_old, SKY_COLOR);
        sync.update();
        time = time + dt;
        update_position(dt);
        // new pixel
        int color = sync.read_pixel(x, y);
        if (x_old == x && y_old == y) {
            // no change
            sync.pixel(x, y, tank->tank_color);
            return BULLET_NO_COLLISION;
        } else if (x < 0 || x > 128 || y < 0 || y > 128) {
            // out of bounds
            in_flight = false;
            return BULLET_OFF_SCREEN;
        } else if (sync.pixel_eq(color, SKY_COLOR)) {
            // travelling in the sky
            sync.pixel(x, y, tank->tank_color);
            return BULLET_NO_COLLISION;
        } else if (!sync.pixel_eq(color, SKY_COLOR)) {
            // hit
            if (sync.pixel_eq(color, GND_COLOR)) {
                bounce = bounce + 1;
                // bounce
                if (bounce < 3) {
                    vy = vy/2.0;
                    sync.pixel(x, y, tank->tank_color);
                    return BULLET_NO_COLLISION;
                }
            }
            // hit
            in_flight = false;
            int i = 1;
            // powerup increases explosion size
            for(i = 1; i < 5 + (power * 3); i++) {
                sync.filled_rectangle(x-i, y-i, x+i, y+i, tank->tank_color);
                sync.update();
                wait(0.1);
            }
            power = 0;
            // make everything the sky afterwards
            sync.filled_rectangle(x-i-1, y-i-1, x+i-1, y+i-1, SKY_COLOR);
            sync.update();
            // play the sound
            playSound("/sd/wavfiles/splooge.wav");
            return color;
        }
    }
    return BULLET_NO_COLLISION;
}