Ben Evans University Second Year Project. Game Called Defender.
Hello, soldier, you have been specially selected as the defender of planet earth.
Your mission, if you choose to accept it. Fly around the planet and pulverise invading alien ships for as long as you can. Stop the aliens abducting the innocent people on the ground. Be warned if an alien ship manages to abduct a person and take them to top of the screen, they will no longer move randomly and will begin to hunt you down. This sounds like a challenge you were trained for.
But don’t worry soldier you’re not going into battle empty-handed. Your ship is equipped with a state of the art laser beam that has unlimited ammo and four smart bombs that will destroy anything on the screen. The ship also has three lives so use them wisely.
As time goes on more alien ships will arrive on planet earth increasing the difficulty of your mission. And remember the landscape bellow loops around so if you continually fly in the same direction you go to your original position. Good luck soldier.
Revision 24:479da6ca0e7e, committed 2020-05-12
- Comitter:
- evanso
- Date:
- Tue May 12 15:08:56 2020 +0000
- Parent:
- 23:cc44e26c08fa
- Child:
- 25:70b55f5bfc87
- Commit message:
- Alien moves randomly and loops with the map when the spaceship get to the edge of the map. Alien also cant move off the map and can move towards the spaceship.
Changed in this revision
--- a/Alien/Alien.cpp Wed May 06 12:15:16 2020 +0000 +++ b/Alien/Alien.cpp Tue May 12 15:08:56 2020 +0000 @@ -17,26 +17,93 @@ } -void Alien::init() { +void Alien::init(Gamepad &pad) { position_x_alien_ = 10; position_y_alien_ = 22; alien_move_counter = 0; + srand(pad.read_adc()*64000); + random_move_counter_ = 0; + random_direction_ = 0; + alien_general_direction = rand()%2; } - -void Alien::draw_alien(N5110 &lcd,Vector2D spaceship_pos,Direction d_) { + +void Alien::draw_alien(N5110 &lcd,Vector2D spaceship_pos,Direction d_, int map_length_, int position_x_map_) { //moves alien spaceship movemen position_x_alien_ += calc_alien_movement(d_); - //Alien moves on its own but at 3rd speed of spaceship - if (alien_move_counter%3 == 0) { - move_alien(spaceship_pos); + //Alien moves on its own but at half speed of spaceship + if (alien_move_counter%2 == 0) { + if (random_move_counter_ == 0){ + set_random_move(); + } + move_direction(); + off_screen_x_y_checker(map_length_, position_x_map_); + random_move_counter_ --; + + //printf("random_move_counter_ = %d\n", random_move_counter__); } alien_move_counter++; lcd.drawSprite(position_x_alien_, position_y_alien_, 6, 7, (int*)k_alien_sprite); } -void Alien::move_alien(Vector2D spaceship_pos){ +void Alien::set_random_move(){ + // alien only moves in one general direction + if(alien_general_direction){ + random_direction_ = rand() % 3; + }else{ + random_direction_ = rand() % 3 + 3; + printf("\random_direction_ = %d\n", random_direction_); + } + random_move_counter_ = rand() % 10 + 20; +} + +void Alien::off_screen_x_y_checker(int map_length_, int position_x_map_){ + // checks y postion of alien and then alters moement direction if at edge of map + if (position_y_alien_ < 0) { + // sets alien direction to one that increces y value + if(alien_general_direction){ + random_direction_ = 1; + }else{ + random_direction_ = 4; + } + }else if (position_y_alien_ > 40) { + // sets alien direction to one that decreces y value + if(alien_general_direction){ + random_direction_ = 2; + }else{ + random_direction_ = 5; + } + } + + // loops the alien round if it reaches the end of the map + if(position_x_alien_ <= (84 - map_length_)){ + position_x_alien_ += map_length_; + }else if (position_x_alien_ >= map_length_){ + position_x_alien_ -= map_length_ + 10; + } + + // Debug and check variables when defined + #ifdef CALCULATE_ALIEN_MOVEMENT_DEBUG + printf("\nposition_x_map_ = %d\n", position_x_map_); + printf("map_length_ = %d\n", map_length_ ); + printf("map_length_ + position_x_map_ = %d\n", map_length_ + position_x_map_); + printf("alien x pos = %d\n",position_x_alien_); + #endif +} + +void Alien::move_direction(){ + switch (random_direction_) { + case 0: set_alien_direction(1, 0); break; + case 1: set_alien_direction(1, 1); break; + case 2: set_alien_direction(1, -1); break; + case 3: set_alien_direction(-1, 0); break; + case 4: set_alien_direction(-1, 1); break; + case 5: set_alien_direction(-1, -1); break; + } +} + +void Alien::move_hunt_mode(Vector2D spaceship_pos){ if(spaceship_pos.x <= position_x_alien_){ position_x_alien_ --; }else{ @@ -47,6 +114,7 @@ bool Alien::check_collision(Weapons bullet) { bool collision = false; //printf ("Collision 1 = %d\n", collision); + // checks collision if bullet is going in east direction if(bullet.get_direction()){ Vector2D bullet_pos_two = bullet.get_pos_two(); @@ -54,14 +122,16 @@ //int bullet_pos_twoy = bullet_pos_two.y; //printf ("alien x = %d, bullet x = %d\n", position_x_alien_,bullet_pos_twox ); //printf ("alien y = %d, bullet y = %d\n", position_y_alien_,bullet_pos_twoy ); - if(bullet_pos_two.x >= position_x_alien_ && bullet_pos_two.x <= position_x_alien_ + 6 && position_y_alien_ <= bullet_pos_two.y <= position_y_alien_ + 7){ + + if(bullet_pos_two.x >= position_x_alien_ && position_y_alien_ <= bullet_pos_two.y && bullet_pos_two.y <= (position_y_alien_ + 7)){ collision = true; } - //printf ("Collision 2 = %d\n", collision); + //printf ("Collision 2 = %d\n", collision); + // checks collision if bullet is going in west direction }else if(!bullet.get_direction()){ Vector2D bullet_pos_one = bullet.get_pos_one(); - if(bullet_pos_one.x >= position_x_alien_ && bullet_pos_one.x <= position_x_alien_ + 6 && position_y_alien_ <= bullet_pos_one.y <= position_y_alien_ + 7){ + if(bullet_pos_one.x <= position_x_alien_ + 6 && position_y_alien_ <= bullet_pos_one.y && bullet_pos_one.y <= (position_y_alien_ + 7)){ collision = true; } //printf ("Collision 3 = %d\n", collision); @@ -84,4 +154,9 @@ Vector2D Alien::get_pos(){ Vector2D pos = {position_x_alien_,position_y_alien_}; return pos; +} + +void Alien::set_alien_direction(int x_change,int y_change){ + position_x_alien_ += x_change; + position_y_alien_ += y_change; } \ No newline at end of file
--- a/Alien/Alien.h Wed May 06 12:15:16 2020 +0000 +++ b/Alien/Alien.h Tue May 12 15:08:56 2020 +0000 @@ -22,12 +22,12 @@ ~Alien(); /** Initalises Alien */ - void init(); + void init(Gamepad &pad); /** Draws the alien * @param lcd @details : N5110 object */ - void draw_alien(N5110 &lcd,Vector2D spaceship_pos,Direction d_); + void draw_alien(N5110 &lcd,Vector2D spaceship_pos,Direction d_, int map_length_, int position_x_map_); /** Checks if bullet collides with a alien * @param lcd @details : N5110 object @@ -47,7 +47,7 @@ /** Moves the alien towards the spaceship and around the map * @param spaceship_pos @details : Position of the spaceship */ - void move_alien(Vector2D spaceship_pos); + void move_hunt_mode(Vector2D spaceship_pos); /** Calulates the aliens movement depeding on spaceship positions and joystick input * @param d_ @details : Direction object of joystick @@ -55,6 +55,24 @@ */ int calc_alien_movement(Direction d_); + /** Generates the random move dirction and length for the alien*/ + void set_random_move(); + + /** Gets the movement direction of the alien */ + void move_direction(); + + /** Changes the x and y positions of the alien depeding on the movement direction + * @param x_change @details : number to change alien x position by + * @param y_change @detials : number to change alien y position by + */ + void set_alien_direction(int x_change,int y_change); + + /** Stops the alien from moving off the edge of the map and moves alien if the map loops + * @param map_length_@details : length of the map + * @param position_x_map_ @detials : the drawing start posisiton of the map + */ + void off_screen_x_y_checker(int map_length_, int position_x_map_); + // Variables --------------------------------------------------------------- //Aliens x position on lcd @@ -64,8 +82,16 @@ int position_y_alien_; // Alien movement counter - int alien_move_counter; + int alien_move_counter; + + // Alien randome move counter + int random_move_counter_; + // Random direction variable + int random_direction_; + + // Aliens genreal movement direction, 1 = East , 0 = West + int alien_general_direction; }; #endif \ No newline at end of file
--- a/GameEngine/GameEngine.cpp Wed May 06 12:15:16 2020 +0000 +++ b/GameEngine/GameEngine.cpp Tue May 12 15:08:56 2020 +0000 @@ -56,7 +56,7 @@ // Alien object Alien new_alien; - new_alien.init(); + new_alien.init(pad); // Stores alien object in vector alien_vector.push_back(new_alien); @@ -78,7 +78,7 @@ void GameEngine::draw_aliens(){ // interates over alien vector and get each new_alien object to draw its self for (int i = 0; i < alien_vector.size(); i++){ - alien_vector[i].draw_alien(lcd,spaceship.get_pos(),d_); + alien_vector[i].draw_alien(lcd,spaceship.get_pos(),d_, map.get_length_map(), map.get_position_x_map()); // Deletes bullet and alien if collision detected if (alien_vector[i].check_collision(bullet_vector[i])){
--- a/Map/Map.cpp Wed May 06 12:15:16 2020 +0000 +++ b/Map/Map.cpp Tue May 12 15:08:56 2020 +0000 @@ -19,6 +19,7 @@ // Initialises random arrays to make random map fill_random_arrays(pad); + } void Map::fill_random_arrays(Gamepad &pad){ @@ -53,11 +54,11 @@ } void Map::draw_map(N5110 &lcd, Direction d_){ - //usb.printf("position_x_map_ = %d\n", position_x_map_); + //printf("position_x_map_ map = %d\n", position_x_map_); //usb.printf("move map = %d\n", move_map); - + reset_position_x_map_to_origonal_ = position_x_map_; - int map_length_ = 0; + map_length_ = 0; //prints main part of map for(int i = 0; i < 11; i++){ @@ -127,7 +128,7 @@ return 0; } - // Debug and check variables when function is called + // Debug and check variables when defined #ifdef CALCULATE_MAP_MOVEMENT_DEBUG printf("move map = %d\n", move_map_); printf("direction = %d\n", d_); @@ -138,3 +139,7 @@ int Map::get_position_x_map(){ return position_x_map_; } + +int Map::get_length_map(){ + return map_length_; +}
--- a/Map/Map.h Wed May 06 12:15:16 2020 +0000 +++ b/Map/Map.h Tue May 12 15:08:56 2020 +0000 @@ -36,7 +36,9 @@ /** Gets x postion of the map for testing * @return maps x postion */ - int get_position_x_map(); + int get_position_x_map(); + + int get_length_map(); private: // Functions prototypes ------------------------------------------------ @@ -74,9 +76,6 @@ int calc_map_movement(Direction d_); // Variables ----------------------------------------------------------- - - // Map x postion on lcd - int position_x_map_; // Map y postion on lcd int position_y_map_; @@ -84,9 +83,6 @@ // Float to store random seed for random function float rand_seed_; - // Map length - int map_length_; - // Arrays to hold random heights of triangles and lengths of lines int rand_heights_[12]; int rand_lengths_[12]; @@ -96,6 +92,12 @@ //Required to reset the map to it's origonal postion at end of each frame, as draw line and triangle functions change position_x_map_ int reset_position_x_map_to_origonal_; + + // Map length + int map_length_; + + // Map x postion on lcd + int position_x_map_; }; #endif \ No newline at end of file
--- a/Spaceship/Spaceship.cpp Wed May 06 12:15:16 2020 +0000 +++ b/Spaceship/Spaceship.cpp Tue May 12 15:08:56 2020 +0000 @@ -44,7 +44,7 @@ } void Spaceship::off_screen_x_y_checker(){ - // checks y postion spand alters y position + // checks y postion of spaceship and then alters y position if off map if (position_y_spaceship_ < 0) { position_y_spaceship_ = 0; }else if (position_y_spaceship_ > 44) {