
Joshua O'hara 201291390
Dependencies: mbed
Alien/Alien.cpp
- Committer:
- josh_ohara
- Date:
- 2020-05-26
- Revision:
- 44:3b904d25ee12
- Parent:
- 43:1ac200335a68
File content as of revision 44:3b904d25ee12:
#include "Alien.h" void Alien::init(int x, int y, int size, int level) { _alive = true; //alien life is true _shoot = false; //set shoot flag to false to be turned true by flag set function _powerup = true; //set powerup flag to true, will be turned to false when alien dies so alien can only drop 1 powerup _create_powerup = false; //create powerup flag false as no powerup has been created _x = x; //set starting position _y = y; _size = size; //set size (width) _speed = 1 + 0.3 * level; //set speed in x diretion, increases with level to make game get harder _alien_bullet_vector.init(); //initialise the alien's vector of bullets // printf(" speed = %2d ",Speed); } void Alien::render(N5110 &lcd) { if(_alive == true){ lcd.drawLine(_x,_y+1,_x+_size-1,_y+1,1); //draw alien (traingular pointing down) lcd.setPixel(_x,_y,true); lcd.setPixel(_x+_size-1,_y,true); lcd.setPixel(_x+_size/2,_y+2,true); _alien_bullet_vector.render(lcd); } if(_create_powerup == true){ //draw powerup if one has been created _powerup_vector[0].render(lcd); //we only need to check 0th powerup in vector as only one can be added to vector per alien //printf("powerup render"); } } Vector2D Alien::get_position() { Vector2D p = {_x,_y}; //returns a 2d vector of the alien's position return p; } void Alien::update(int step_x, int remainder_x, Gamepad &pad, int counter, int level) { _x+=_speed; //change xposition according to speed int counter_ = counter; //copy counter value to function variable int step_x_ = step_x; //copy step value to function variable int remainder_x_ = remainder_x; //copy remainder value to function variable if (_x < 1 + remainder_x_*step_x_) { //make alien change directions and move down screen if alien armada reaches edge of the screen _x = 1 + remainder_x_*step_x_; //using the remainder_x_ value (which shows this alien's position in the row, e.g 3 from left) _speed = -_speed; //and the distance between alien's, we can calculate at which point on the screen each alien _y = _y + 2; //should change directions } if (_x > WIDTH - _size - 1 - (4-remainder_x_)*step_x_) { //same process but for other side of screen _x = WIDTH - _size - 1 - (4-remainder_x_)*step_x_; _speed = -_speed; _y = _y + 2; } shoot_flag_set(counter_,level); //runs flag set function _alien_bullet_vector.update(_x,_y,_shoot); //updates the vector of alien bullets _shoot = false; //sets shoot flag to false in case alien shot on this loop if(_powerup == true){ //runs the powerup flag set to determine if the create powerup flag will be set to true upon alien death create_powerup_flag_set(); //powerup flag set function will not run if alien is still alive so create powerup flag cannot be set to true if(_create_powerup == true){ //powerup flag will be set to false after alien dies so this block of code is only run 1 time after death PowerUp new_powerup_; //creating a new powerup only oncre new_powerup_.init(_x,_y,3); //initialising powerup _powerup_vector.push_back(new_powerup_); //adding powerup to a vector for use outside of function //printf(" powerup created "); } } if(_create_powerup == true){ //updates powerup if one has been created _powerup_vector[0].update(); //we only need to check 0th powerup in vector as only one can be added to vector per alien //printf("powerup update"); } //printf(" speed = %2d ",Speed); } void Alien::set_life(bool x) { _alive = x; //sets the life of the alien } bool Alien::get_life() { //printf("A = %2d ",Alive); return _alive; //returns the life of the alien } void Alien::shoot_flag_set(int counter, int level) { int counter_ = counter; if(counter_%8 == 1){ //sets shoot to true every 8 main loop iterations (1 1/3 secs) and if a random number falls below a decided limit and the alien is alive int r_ = rand()%20; //test a random number so alien doesnt shoot every 8 loops if((r_ < level+1)&& //limit increases with level, so aliens will shoot more as game goes on (_alive == true)) { _shoot = true; } } } vector<AlienBullet> Alien::get_bullet_vector() { vector<AlienBullet> v = _alien_bullet_vector.get_vector(); return v; //return the vector of alien bullets } void Alien::set_bullet_hit(int i, bool hit) { _alien_bullet_vector.set_hit(i,hit); //sets the hit value of bullet i in this aliens bullet vector } void Alien::create_powerup_flag_set() { if(_alive == false){ //check to see if ship has died _powerup = false; //set powerup flag to false as we only want to create 1 powerup per alien when alien dies int rand_ = rand()%6; //test a random number to set create powerup flag, as we dont want every alien death to yield a powerup drop if(rand_ == 0){ _create_powerup = true; } } } Vector2D Alien::get_powerup_position() { Vector2D v; if(_create_powerup == true){ //returns powerup position if powerup has been created v = _powerup_vector[0].get_position(); //we only need to check 0th powerup in vector as only one can be added to vector per alien } return v; } void Alien::set_powerup_hit(bool x) { if(_create_powerup == true){ //sets powerup hit if powerup has been created _powerup_vector[0].set_hit(x); //we only need to check 0th powerup in vector as only one can be added to vector per alien } } bool Alien::get_powerup_hit() { bool x; if(_create_powerup == true){ //returns powerup hit value if powerup has been created x = _powerup_vector[0].get_hit(); //we only need to check 0th powerup in vector as only one can be added to vector per alien } return x; }