Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed Gamepad N5110 mbed-rtos
Diff: GameEngine/GameEngine.cpp
- Revision:
- 2:b5c1bb7a39de
- Parent:
- 1:45493d1d0689
- Child:
- 3:bf9624e5b0c3
--- a/GameEngine/GameEngine.cpp Fri Apr 19 13:43:22 2019 +0000 +++ b/GameEngine/GameEngine.cpp Sat Apr 20 00:08:00 2019 +0000 @@ -115,193 +115,206 @@ void GameEngine::init(int spacecraft_xpos,int spacecraft_ypos,int enemy_xpos, int enemy_ypos,int enemy2_xpos, int enemy2_ypos,int enemy3_xpos, int enemy3_ypos,int beam_size,int beam2_size, int speed) { - // initialise the game parameters - _spacecraft_xpos = spacecraft_xpos; - _spacecraft_ypos = spacecraft_ypos; + // initialise the game parameters + _spacecraft_xpos = spacecraft_xpos; + _spacecraft_ypos = spacecraft_ypos; - _enemy_xpos = enemy_xpos; - _enemy_ypos = enemy_ypos; + _enemy_xpos = enemy_xpos; + _enemy_ypos = enemy_ypos; - _enemy2_xpos = enemy2_xpos; - _enemy2_ypos = enemy2_ypos; + _enemy2_xpos = enemy2_xpos; + _enemy2_ypos = enemy2_ypos; - _enemy3_xpos = enemy3_xpos; - _enemy3_ypos = enemy3_ypos; + _enemy3_xpos = enemy3_xpos; + _enemy3_ypos = enemy3_ypos; - _beam_size = beam_size; - _beam2_size = beam2_size; - _speed = speed; + _beam_size = beam_size; // beam size for 1st and 3rd enemy + _beam2_size = beam2_size; // beam size for 2nd enemy + _speed = speed; // Speed of the enemy travelling - _p1x = GAP; + _p1x = GAP; // x position on screen - WIDTH is defined in N5110.h - _e1a = WIDTH-_enemy_xpos; //12 - _e1b = HEIGHT/2-_enemy_ypos;//4 + _e1a = WIDTH-_enemy_xpos; //enemy_xpos = 12 + // y position on screen - HEIGHT is defined in N5110.h + _e1b = HEIGHT/2-_enemy_ypos; //enemy_ypos = 4 - _e2a = WIDTH-_enemy2_xpos; //12 - _e21b = HEIGHT/2 +_enemy2_ypos; - _e22b = HEIGHT/2 -_enemy2_ypos;//4 + _e2a = WIDTH-_enemy2_xpos; //enemy2_xpos = 12 + _e21b = HEIGHT/2 +_enemy2_ypos; //enemy2_ypos = 10 + _e22b = HEIGHT/2 -_enemy2_ypos; - _e3a = WIDTH-_enemy3_xpos; //20 - _e3b = HEIGHT/2 -_enemy3_ypos;//7 + _e3a = WIDTH-_enemy3_xpos; //enemy3_xpos = 20 + _e3b = HEIGHT/2 -_enemy3_ypos; //enemy3_ypos = 7 _e3c = WIDTH-_enemy3_xpos - 12; _e3d = HEIGHT/2 + _enemy3_ypos;; _e3f = HEIGHT/2 - _enemy3_ypos;; - // puts spacecraft and enemy in middle - _p1.init(_spacecraft_xpos,_spacecraft_ypos); - _e1.init(_e1a,_e1b); - _e21.init(_e2a,_e21b,_speed); - _e22.init(_e2a,_e22b,_speed); - _e3.init(_e3a,_e3b,_e3c,_e3d,_e3c,_e3f,_speed); - _stage = 0; - //_enemybeam.init(_beam_size,_e1a,_e1b); + // Initialising the player's spacecraft and all enemy spacecrafts + _p1.init(_spacecraft_xpos,_spacecraft_ypos); + _e1.init(_e1a,_e1b); + _e21.init(_e2a,_e21b,_speed); + _e22.init(_e2a,_e22b,_speed); + _e3.init(_e3a,_e3b,_e3c,_e3d,_e3c,_e3f,_speed); + // Initialising the stage of the game + _stage = 0; } void GameEngine::read_input(Gamepad &pad) { - _d = pad.get_direction(); - _mag = pad.get_mag(); - _R = pad.check_event(Gamepad::R_PRESSED); + _d = pad.get_direction(); // Get the direction of the joystick + _mag = pad.get_mag(); // Get the magnitude value + _R = pad.check_event(Gamepad::R_PRESSED); // Check if the R button is being pressed + _L = pad.check_event(Gamepad::R_PRESSED); // Check if the L button is being pressed } -void GameEngine::draw(Gamepad &pad,N5110 &lcd) +void GameEngine::draw_mission_one(Gamepad &pad,N5110 &lcd) { // draw the background of the game lcd.drawSprite(0,0,48,84,(int *)backgrounds); + // draw the easter egg of the game lcd.drawSprite(6,4,3,13,(int *)r); //health draw_enemy_health(lcd); draw_spacecraft_health(pad); - // spacecraft + // player spacecraft _p1.character(lcd); - // enemy 1 + // first enemy _e1.enemy(lcd); - // spacecraft beam + // player spacecraft beam _beam.draw(lcd); - // enemy beam + // enemy spacecraft beam _enemybeam.draw(lcd); - // level one completion - // mission_one_complete(lcd); - // level one fail - // mission_one_fail(lcd,pad); - } -void GameEngine::draw2(Gamepad &pad,N5110 &lcd) +void GameEngine::draw_mission_two(Gamepad &pad,N5110 &lcd) { + // draw the background of the game lcd.drawSprite(0,0,48,84,(int *)backgrounds); + // draw the easter egg of the game lcd.drawSprite(6,4,3,3,(int *)e); + //health draw_spacecraft_health(pad); draw_enemy21_health(lcd); draw_enemy22_health(lcd); - // spacecraft + // player spacecraft _p1.character(lcd); + // second enemy _e21.enemy2(lcd); _e22.enemy2(lcd); + // player spacecraft beam _beam.draw(lcd); + // second enemy spacecraft beam _enemybeam2.draw(lcd); } -void GameEngine::draw3(Gamepad &pad,N5110 &lcd) +void GameEngine::draw_mission_three(Gamepad &pad,N5110 &lcd) { + // draw the background of the game lcd.drawSprite(0,0,48,84,(int *)backgrounds); - lcd.drawSprite(6,4,3,3,(int *)x); + // draw the easter egg of the game + lcd.drawSprite(6,4,3,19,(int *)x); + //health draw_spacecraft_health(pad); draw_enemyboss_health(lcd); - // spacecraft + // player spacecraft _p1.character(lcd); + // third and final enemy _e3.enemyboss(lcd); + // player spacecraft beam _beam.draw(lcd); + // third enemy spacecraft beam _enemybeam3.draw(lcd); } -void GameEngine::update(Gamepad &pad,N5110 &lcd) +void GameEngine::update_mission_one(Gamepad &pad,N5110 &lcd) { - check_goal(pad); - check_enemybeam_collisions(pad); - // check_beam_pressed(pad,lcd); - // important to update paddles and ball before checking collisions so can - // correct for it before updating the display - _p1.update(_d,_mag); - _beam.update(); - _enemybeam.update(); - check_enemy_collisions(pad); - check_spacecraft_collisions(pad); + check_playerbeam_collision(pad); // Check if L/R is being pressed to initiate the player beam + check_enemybeam_collisions(pad); // Check if first enemy's beam has passed the wall to initiate a new beam + // updating spacecraft and enemy before checking collisions so that + // it displays the right value + _p1.update(_d,_mag); // Player spacecraft movement update + _beam.update(); // Player spacecraft's beam update + + // The enemy spacecraft is stationery in mission one + _enemybeam.update(); // Enemy spacecraft's beam update + + check_enemy_collisions(pad); // Check if the player spacecraft beam collides with the enemy spacecraft + check_spacecraft_collisions(pad); // Check if the enemy spacecraft beam collides with the player spacecraft + + // Animations and sound effect for the both the player's and enemy' spacecraft when they are dead spacecraft_dead(lcd,pad); enemy_dead(lcd,pad); + // Check if mission one had been failed or pass to provide appropriate animation and sound effect check_mission_one(pad); - // if (_second_mission == true){ - // _p1.update(_d,_mag); - // _e21.update(); - // _e22.update(); + } -void GameEngine::update2(Gamepad &pad,N5110 &lcd) +void GameEngine::update_mission_two(Gamepad &pad,N5110 &lcd) { - check_goal(pad); - check_enemybeam2_collisions(pad); - // check_beam_pressed(pad,lcd); - // important to update paddles and ball before checking collisions so can - // correct for it before updating the display - _p1.update(_d,_mag); - _beam.update(); - _enemybeam2.update(); - _e21.update(); - _e22.update(); - check_enemy2_collisions(pad); - check_spacecraft2_collisions(pad); - check_wall_collisions(pad); + check_playerbeam_collision(pad); // Check if L/R is being pressed to initiate the player beam + check_enemybeam2_collisions(pad); // Check if first enemy's beam has passed the wall to initiate a new beam + // updating spacecraft and enemy before checking collisions so that + // it displays the right value + _p1.update(_d,_mag); // Player spacecraft movement update + _beam.update(); // Player spacecraft's beam update + + _enemybeam2.update(); // Enemy spacecraft's beam update + _e21.update(); // Second-one enemy spacecraft movement update + _e22.update(); // Second-two enemy spacecraft movement update + + check_enemy2_collisions(pad); // Check if the player spacecraft beam collides with the enemy spacecraft + check_spacecraft2_collisions(pad); // Check if the enemy spacecraft beam collides with the player spacecraft + check_wall_collisions(pad); // Check if enemy spacecraft hits the top and bottom wall to bounce off + + // Animations and sound effect for the both the player's and enemy' spacecraft when they are dead spacecraft2_dead(lcd,pad); enemy2_dead(lcd,pad); + // Check if mission two had been failed or pass to provide appropriate animation and sound effect check_mission_two(pad); } -void GameEngine::update3(Gamepad &pad,N5110 &lcd) +void GameEngine::update_mission_three(Gamepad &pad,N5110 &lcd) { - check_goal(pad); + check_playerbeam_collision(pad); check_enemybeam3_collisions(pad); - // check_beam_pressed(pad,lcd); - // important to update paddles and ball before checking collisions so can - // correct for it before updating the display - _p1.update(_d,_mag); - _beam.update(); - _enemybeam3.update(); - _e3.update(); - check_enemy3_collisions(pad); - check_spacecraft3_collisions(pad); - check_wall2_collisions(pad); + + _p1.update(_d,_mag); // Player spacecraft movement update + _beam.update(); // Player spacecraft beam update + _enemybeam3.update(); // Third enemy's spacecraft's beam update + _e3.update(); // Third enemy spacecraft movement update + check_enemy3_collisions(pad); // Check if the player spacecraft beam collides with the third enemy spacecraft + check_spacecraft3_collisions(pad); // Check if the third enemy spacecraft beam collides with the player spacecraft + check_wall2_collisions(pad); // Check if enemy spacecraft hits the top,bottom, wall to bounce off + // Animations and sound effect for the both the player's and enemy' spacecraft spacecraft3_dead(lcd,pad); enemy3_dead(lcd,pad); + // Check if mission three had been failed or pass to provide appropriate animation and sound effect check_mission_three(pad); } void GameEngine::check_enemy_collisions(Gamepad &pad) { - Vector2D p1_pos = _p1.get_pos(); + // read current enemy spacecraft's and player spacecraft's beam attributes Vector2D beam_pos = _beam.get_pos(); - // check e1 next Vector2D e1_pos = _e1.get_enemy_pos(); - // see if ball has hit the paddle by checking for overlaps + // see if player's spacecraft beam has hit the enemy's spacecraft by checking for overlaps if ( (beam_pos.y >= e1_pos.y) && //top (beam_pos.y <= e1_pos.y + 7) && //bottom (beam_pos.x + _beam_size >= _e1a) && //left (beam_pos.x + _beam_size <= _e1a + 8) //right ) { - // if it has, fix position and reflect x velocity - // beam_pos.x = _e1a - _beam_size; - // beam_velocity.x = -beam_velocity.x; - // audio feedback + // add first enemy health _e1.add_health(); spacebeam = true; + // audio feedback pad.tone(1000.0,0.1); } @@ -311,109 +324,115 @@ void GameEngine::check_enemy2_collisions(Gamepad &pad) { - Vector2D p1_pos = _p1.get_pos(); + // read curent player spacecraft's beam attributes Vector2D beam_pos = _beam.get_pos(); - // check e1 next + // check e21 first Vector2D e21_pos = _e21.get_enemy21_pos(); - Vector2D e22_pos = _e22.get_enemy22_pos(); - // see if ball has hit the paddle by checking for overlaps + // see if player's spacecraft beam has hit the enemy's spacecraft by checking for overlaps if ( (beam_pos.y >= e21_pos.y) && //top (beam_pos.y <= e21_pos.y + 7) && //bottom (beam_pos.x + _beam_size >= _e2a) && //left (beam_pos.x + _beam_size <= _e2a + 7) //right ) { - // if it has, fix position and reflect x velocity - // beam_pos.x = _e1a - _beam_size; - // beam_velocity.x = -beam_velocity.x; + // add health to first second level enemy + _e21.add_health(); + // set boolean spacebeam true + spacebeam = true; // audio feedback - _e21.add_health(); - spacebeam = true; pad.tone(1000.0,0.1); } + // check e22 next + Vector2D e22_pos = _e22.get_enemy22_pos(); + if ( (beam_pos.y >= e22_pos.y) && //top (beam_pos.y <= e22_pos.y + 7) && //bottom (beam_pos.x + _beam_size >= _e2a) && //left (beam_pos.x + _beam_size <= _e2a + 7) //right ) { - // if it has, fix position and reflect x velocity - // beam_pos.x = _e1a - _beam_size; - // beam_velocity.x = -beam_velocity.x; + // add health to second, second level enemy + _e22.add_health(); + // set boolean spacebeam true + spacebeam = true; // audio feedback - _e22.add_health(); - spacebeam = true; pad.tone(1000.0,0.1); } + // write new attributes - _beam.set_pos(beam_pos); } void GameEngine::check_enemy3_collisions(Gamepad &pad) { - Vector2D p1_pos = _p1.get_pos(); + // read curent player's spacecraft beam attributes Vector2D beam_pos = _beam.get_pos(); - // check e1 next + // check e3boss first Vector2D e3boss_pos = _e3.get_enemyboss_pos(); - Vector2D e3enemy1_pos = _e3.get_enemy1_pos(); - Vector2D e3enemy2_pos = _e3.get_enemy2_pos(); - // see if ball has hit the paddle by checking for overlaps + // see if player's spacecraft beam has hit the enemy's spacecraft by checking for overlaps if ( (beam_pos.y >= e3boss_pos.y) && //top (beam_pos.y <= e3boss_pos.y + 12) && //bottom (beam_pos.x + _beam_size >= _e3a) && //left (beam_pos.x + _beam_size <= _e3a + 12) //right ) { - // if it has, fix position and reflect x velocity - // beam_pos.x = _e1a - _beam_size; - // beam_velocity.x = -beam_velocity.x; + // add health to enemy boss + _e3.add_health_boss(); + // set boolean spacebeam true + spacebeam = true; // audio feedback - _e3.add_health_boss(); - spacebeam = true; pad.tone(1000.0,0.1); } + // check e3enemy1 next + Vector2D e3enemy1_pos = _e3.get_enemy1_pos(); + if ( (beam_pos.y >= e3enemy1_pos.y) && //top (beam_pos.y <= e3enemy1_pos.y + 6) && //bottom (beam_pos.x + _beam_size >= _e3c) && //left (beam_pos.x + _beam_size <= _e3c + 7) //right ) { - // if it has, fix position and reflect x velocity - // beam_pos.x = _e1a - _beam_size; - // beam_velocity.x = -beam_velocity.x; + // add health to first third level enemy + _e3.add_health_enemy1(); + // set boolean spacebeam true + spacebeam = true; // audio feedback - _e3.add_health_enemy1(); - spacebeam = true; pad.tone(1000.0,0.1); } + // check e3enemy2 next + Vector2D e3enemy2_pos = _e3.get_enemy2_pos(); + if ( (beam_pos.y >= e3enemy2_pos.y) && //top (beam_pos.y <= e3enemy2_pos.y + 6) && //bottom (beam_pos.x + _beam_size >= _e3c) && //left (beam_pos.x + _beam_size <= _e3c + 7) //right ) { + // add health to second third level enemy _e3.add_health_enemy2(); + // set boolean spacebeam true spacebeam = true; - // audio feedback + // audio feedback pad.tone(1000.0,0.1); } // write new attributes _beam.set_pos(beam_pos); } -void GameEngine::check_goal(Gamepad &pad) +void GameEngine::check_playerbeam_collision(Gamepad &pad) { - Vector2D p1_pos = _p1.get_pos(); - Vector2D beam_pos = _beam.get_pos(); - // P2 has scored - if(_R == true){ - if (beam_pos.x + _beam_size > WIDTH || (spacebeam == true)){ + Vector2D p1_pos = _p1.get_pos(); // Get player's spacecraft position + Vector2D beam_pos = _beam.get_pos(); // Get player's spacecraft beam position + + if((_R == true)|| (_L == true)){ // + // if (beam_pos.x + _beam_size > WIDTH || (spacebeam == true)){ _beam.init(_beam_size,p1_pos.x,p1_pos.y); - } + _R = false; + _L = false; + // } } }