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:
- 1:45493d1d0689
- Parent:
- 0:99fa5a619081
- Child:
- 2:b5c1bb7a39de
--- a/GameEngine/GameEngine.cpp Sat Apr 13 01:13:53 2019 +0000 +++ b/GameEngine/GameEngine.cpp Fri Apr 19 13:43:22 2019 +0000 @@ -113,7 +113,7 @@ }; -void GameEngine::init(int spacecraft_xpos,int spacecraft_ypos,int enemy_xpos, int enemy_ypos,int enemy2_xpos, int enemy2_ypos,int beam_size,int beam2_size, int speed) +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; @@ -124,6 +124,9 @@ _enemy2_xpos = enemy2_xpos; _enemy2_ypos = enemy2_ypos; + + _enemy3_xpos = enemy3_xpos; + _enemy3_ypos = enemy3_ypos; _beam_size = beam_size; @@ -139,11 +142,19 @@ _e2a = WIDTH-_enemy2_xpos; //12 _e21b = HEIGHT/2 +_enemy2_ypos; _e22b = HEIGHT/2 -_enemy2_ypos;//4 + + _e3a = WIDTH-_enemy3_xpos; //20 + _e3b = HEIGHT/2 -_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); @@ -196,6 +207,20 @@ } +void GameEngine::draw3(Gamepad &pad,N5110 &lcd) +{ + lcd.drawSprite(0,0,48,84,(int *)backgrounds); + lcd.drawSprite(6,4,3,3,(int *)x); + draw_spacecraft_health(pad); + draw_enemyboss_health(lcd); + // spacecraft + _p1.character(lcd); + _e3.enemyboss(lcd); + _beam.draw(lcd); + _enemybeam3.draw(lcd); + +} + void GameEngine::update(Gamepad &pad,N5110 &lcd) { check_goal(pad); @@ -238,9 +263,28 @@ } +void GameEngine::update3(Gamepad &pad,N5110 &lcd) +{ + check_goal(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); + spacecraft3_dead(lcd,pad); + enemy3_dead(lcd,pad); + check_mission_three(pad); + +} void GameEngine::check_enemy_collisions(Gamepad &pad) { - + Vector2D p1_pos = _p1.get_pos(); Vector2D beam_pos = _beam.get_pos(); // check e1 next Vector2D e1_pos = _e1.get_enemy_pos(); @@ -257,7 +301,7 @@ // beam_velocity.x = -beam_velocity.x; // audio feedback _e1.add_health(); - //_beam.init(_beam_size,p1_pos.x,p1_pos.y); + spacebeam = true; pad.tone(1000.0,0.1); } @@ -267,7 +311,7 @@ void GameEngine::check_enemy2_collisions(Gamepad &pad) { - + Vector2D p1_pos = _p1.get_pos(); Vector2D beam_pos = _beam.get_pos(); // check e1 next Vector2D e21_pos = _e21.get_enemy21_pos(); @@ -285,7 +329,7 @@ // beam_velocity.x = -beam_velocity.x; // audio feedback _e21.add_health(); - //_beam.init(_beam_size,p1_pos.x,p1_pos.y); + spacebeam = true; pad.tone(1000.0,0.1); } if ( @@ -299,7 +343,62 @@ // beam_velocity.x = -beam_velocity.x; // audio feedback _e22.add_health(); - //_beam.init(_beam_size,p1_pos.x,p1_pos.y); + 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(); + Vector2D beam_pos = _beam.get_pos(); + // check e1 next + + 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 + 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; + // audio feedback + _e3.add_health_boss(); + spacebeam = true; + pad.tone(1000.0,0.1); + } + 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; + // audio feedback + _e3.add_health_enemy1(); + spacebeam = true; + pad.tone(1000.0,0.1); + } + 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 + ) { + _e3.add_health_enemy2(); + spacebeam = true; + // audio feedback pad.tone(1000.0,0.1); } // write new attributes @@ -311,9 +410,9 @@ Vector2D p1_pos = _p1.get_pos(); Vector2D beam_pos = _beam.get_pos(); // P2 has scored - if (beam_pos.x + _beam_size > WIDTH) { if(_R == true){ - _beam.init(_beam_size,p1_pos.x,p1_pos.y); + if (beam_pos.x + _beam_size > WIDTH || (spacebeam == true)){ + _beam.init(_beam_size,p1_pos.x,p1_pos.y); } } } @@ -342,6 +441,24 @@ } } +void GameEngine::check_enemybeam3_collisions(Gamepad &pad) +{ + Vector2D enemyboss_pos = _e3.get_enemyboss_pos(); + Vector2D enemy1_pos = _e3.get_enemy1_pos(); + Vector2D enemy2_pos = _e3.get_enemy2_pos(); + + Vector2D enemybossbeam3_pos = _enemybeam3.get_pos_boss(); + Vector2D enemy1beam3_pos = _enemybeam3.get_pos_enemy1(); + Vector2D enemy2beam3_pos = _enemybeam3.get_pos_enemy2(); + // P2 has scored + if ((_ebeam3boss == true)||(_ebeam31 == true)||(_ebeam32 == true)||(enemybossbeam3_pos.x - _beam_size < 0)||(enemy1beam3_pos.x - _beam_size < 0)||(enemy2beam3_pos.x - _beam_size < 0)) { + _enemybeam3.init(_beam_size,enemyboss_pos.x,enemyboss_pos.y,enemy1_pos.x,enemy1_pos.y,enemy2_pos.x,enemy2_pos.y); + _ebeam3boss = false; + _ebeam31 = false; + _ebeam32 = false; + } +} + void GameEngine::check_spacecraft_collisions(Gamepad &pad) { Vector2D enemybeam_pos = _enemybeam.get_pos(); @@ -380,7 +497,7 @@ _ebeam21 = true; pad.tone(1000.0,0.1); } - if ( + else if ( (enemybeam22_pos.y >= p1_pos.y) && //top (enemybeam22_pos.y <= p1_pos.y + 11) && //bottom (enemybeam22_pos.x >= _p1x) && //left @@ -394,6 +511,53 @@ _enemybeam2.set_pos_22(enemybeam22_pos); } + +void GameEngine::check_spacecraft3_collisions(Gamepad &pad) +{ + Vector2D enemybossbeam_pos = _enemybeam3.get_pos_boss(); + Vector2D enemy1beam_pos = _enemybeam3.get_pos_enemy1(); + Vector2D enemy2beam_pos = _enemybeam3.get_pos_enemy2(); + + Vector2D p1_pos = _p1.get_pos(); + + // see if beam has hit the enemy by checking for overlaps + if ( + (enemybossbeam_pos.y >= p1_pos.y) && //top + (enemybossbeam_pos.y <= p1_pos.y + 11) && //bottom + (enemybossbeam_pos.x >= _p1x) && //left + (enemybossbeam_pos.x <= _p1x + 11) //right + ) { + _p1.add_health(); + _ebeam3boss = true; + pad.tone(1000.0,0.1); + } + else if ( + (enemy1beam_pos.y >= p1_pos.y) && //top + (enemy1beam_pos.y <= p1_pos.y + 11) && //bottom + (enemy1beam_pos.x >= _p1x) && //left + (enemy1beam_pos.x <= _p1x + 11) //right + ) { + _p1.add_health(); + _ebeam31 = true; + pad.tone(1000.0,0.1); + } + else if ( + (enemy2beam_pos.y >= p1_pos.y) && //top + (enemy2beam_pos.y <= p1_pos.y + 11) && //bottom + (enemy2beam_pos.x >= _p1x) && //left + (enemy2beam_pos.x <= _p1x + 11) //right + ) { + _p1.add_health(); + _ebeam32 = true; + pad.tone(1000.0,0.1); + } + + _enemybeam3.set_pos_boss(enemybossbeam_pos); + _enemybeam3.set_pos_enemy1(enemy1beam_pos); + _enemybeam3.set_pos_enemy2(enemy2beam_pos); + +} + void GameEngine::check_wall_collisions(Gamepad &pad) { // read current ball attributes @@ -429,6 +593,39 @@ _e21.set_enemy21_pos(enemy21_pos); _e22.set_enemy22_pos(enemy22_pos); } + +void GameEngine::check_wall2_collisions(Gamepad &pad) +{ + // read current ball attributes + Vector2D enemyboss_pos = _e3.get_enemyboss_pos(); + Vector2D enemyboss_movement = _e3.get_movement(); + + // check if hit top wall + if (enemyboss_pos.y <= 1) { // 1 due to 1 pixel boundary + enemyboss_pos.y = 1; // bounce off ceiling without going off screen + enemyboss_movement.y = -enemyboss_movement.y; + } + // check if hit bottom wall + else if (enemyboss_pos.y + 12 >= (HEIGHT-1) ) { // bottom pixel is 47 + // hit bottom + enemyboss_pos.y = (HEIGHT-1) - 12; // stops ball going off screen + enemyboss_movement.y = -enemyboss_movement.y; + // audio feedback + }else if (enemyboss_pos.x + 12 >= (WIDTH-1) ) { // bottom pixel is 47 + // hit bottom + enemyboss_pos.x = (WIDTH-1) - 12; // stops ball going off screen + enemyboss_movement.x = -enemyboss_movement.x; + // audio feedback + }else if (enemyboss_pos.x <= WIDTH/2) { // 1 due to 1 pixel boundary + enemyboss_pos.x = WIDTH/2; // bounce off ceiling without going halfway + enemyboss_movement.x = -enemyboss_movement.x; + } + + _e3.set_movement(enemyboss_movement); + _e3.set_enemyboss_pos(enemyboss_pos); + +} + void GameEngine::enemy_dead(N5110 &lcd, Gamepad &pad){ int e1_health = _e1.get_health(); Vector2D e1_pos = _e1.get_enemy_pos(); @@ -476,6 +673,39 @@ } } + +void GameEngine::enemy3_dead(N5110 &lcd, Gamepad &pad){ + + int e3boss_health = _e3.get_health_boss(); + int e31_health = _e3.get_health_enemy1(); + int e32_health = _e3.get_health_enemy2(); + + Vector2D e3boss_pos = _e3.get_enemyboss_pos(); + Vector2D e31_pos = _e3.get_enemy1_pos(); + Vector2D e32_pos = _e3.get_enemy2_pos(); + + if ((e3boss_health >= 10) && (e31_health >= 10) && (e32_health >= 10)){ + lcd.drawSprite(e3boss_pos.x-10,e3boss_pos.y-10,23,23,(int *)explosion); + lcd.drawSprite(e31_pos.x-10,e31_pos.y-10,23,23,(int *)explosion); + lcd.drawSprite(e32_pos.x-10,e32_pos.y-10,23,23,(int *)explosion); + pad.tone(1000.0,0.5); + pad.tone(800.0,0.5); + pad.tone(600.0,0.5); + pad.tone(400.0,0.5); + // lcd.refresh(); + wait(0.2); + lcd.drawSprite(e3boss_pos.x-10,e3boss_pos.y-10,23,23,(int *)explosion); + lcd.drawSprite(e31_pos.x-10,e31_pos.y-10,23,23,(int *)explosion); + lcd.drawSprite(e32_pos.x-10,e32_pos.y-10,23,23,(int *)explosion); + _stage = 6; + _e3.add_health_boss(); + _e3.add_health_enemy1(); + _e3.add_health_enemy2(); + lcd.refresh(); + } + +} + void GameEngine::spacecraft_dead(N5110 &lcd, Gamepad &pad) { @@ -527,6 +757,33 @@ } } + +void GameEngine::spacecraft3_dead(N5110 &lcd, Gamepad &pad) +{ + + int p1_health = _p1.get_health(); + Vector2D p1_pos = _p1.get_pos(); + + if (p1_health == 6){ + + lcd.drawSprite(p1_pos.x-5,p1_pos.y-7,23,23,(int *)explosion); + pad.tone(1000.0,0.5); + pad.tone(800.0,0.5); + pad.tone(600.0,0.5); + pad.tone(400.0,0.5); + wait(0.5); + lcd.refresh(); + wait(0.1); + lcd.drawSprite(p1_pos.x-5,p1_pos.y-7,23,23,(int *)explosion); + _p1.update_move(); + // wait(2.0); + _stage = 5; + _p1.add_health(); + lcd.refresh(); + } + +} + void GameEngine::check_mission_one(Gamepad &pad){ if (_stage == 1){ @@ -584,36 +841,43 @@ wait(0.5); } } -//void GameEngine::mission_one_complete(N5110 &lcd){ - - // if (_stage_two == true){ - // lcd.clear(); - // lcd.drawSprite(0,0,48,84,(int *)mission_one); - // lcd.refresh(); - // } - -//} -//void GameEngine::mission_one_fail(N5110 &lcd,Gamepad &pad) -//{ - // if (_stage_one == true){ - // lcd.clear(); - // lcd.drawSprite(6,5,42,73,(int *)mission_one_failure); - // lcd.refresh(); - // if (pad.check_event(Gamepad::B_PRESSED)){ - // lcd.init(); - // pad.init(); - // } - // } -//} +void GameEngine::check_mission_three(Gamepad &pad){ + + if (_stage == 5){ + pad.tone(233.0,0.5); + wait(0.5); + pad.tone(184.0,0.5); + wait(0.5); + pad.tone(174.0,2.0); + wait(1.0); + } else if (_stage == 6 ){ + + pad.leds_off(); + pad.tone(184.0,0.2); + wait(0.5); + pad.tone(233.0,0.2); + wait(0.5); + pad.tone(184.0,0.2); + wait(0.5); + pad.tone(233.0,0.2); + wait(0.5); + pad.tone(184.0,0.2); + wait(0.5); + pad.tone(233.0,0.2); + wait(0.5); + pad.tone(184.0,2.0); + wait(0.5); + } +} void GameEngine::draw_enemy_health(N5110 &lcd) { // get health of the enemy int e1_health = _e1.get_health(); - lcd.drawRect(56,40,20,4,FILL_TRANSPARENT); - lcd.drawRect(56,40,20-2*e1_health,4,FILL_BLACK); + lcd.drawRect(62,42,20,4,FILL_TRANSPARENT); + lcd.drawRect(62,42,20-2*e1_health,4,FILL_BLACK); @@ -625,11 +889,11 @@ int e21_health = _e21.get_health(); if (e21_health < 10){ - lcd.drawRect(60,22,20,4,FILL_TRANSPARENT); - lcd.drawRect(60,22,20-2*e21_health,4,FILL_BLACK); + lcd.drawRect(2,42,20,4,FILL_TRANSPARENT); + lcd.drawRect(2,42,20-2*e21_health,4,FILL_BLACK); } else { - lcd.drawRect(60,22,20,4,FILL_TRANSPARENT); + lcd.drawRect(2,42,20,4,FILL_TRANSPARENT); } } @@ -639,15 +903,45 @@ int e22_health = _e22.get_health(); if (e22_health < 10){ - lcd.drawRect(60,28,20,4,FILL_TRANSPARENT); - lcd.drawRect(60,28,20-2*e22_health,4,FILL_BLACK); + lcd.drawRect(62,42,20,4,FILL_TRANSPARENT); + lcd.drawRect(62,42,20-2*e22_health,4,FILL_BLACK); } else { - lcd.drawRect(60,28,20,4,FILL_TRANSPARENT); + lcd.drawRect(62,42,20,4,FILL_TRANSPARENT); } } +void GameEngine::draw_enemyboss_health(N5110 &lcd) +{ + // get health of the enemy + int e3boss_health = _e3.get_health_boss(); + int e3enemy1_health = _e3.get_health_enemy1(); + int e3enemy2_health = _e3.get_health_enemy2(); + + if (e3boss_health < 10){ + lcd.drawRect(62,42,20,4,FILL_TRANSPARENT); + lcd.drawRect(62,42,20-2*e3boss_health,4,FILL_BLACK); + } + else { + lcd.drawRect(62,42,20,4,FILL_TRANSPARENT); + } + if (e3enemy1_health < 10){ + lcd.drawRect(2,42,20,4,FILL_TRANSPARENT); + lcd.drawRect(2,42,20-2*e3enemy1_health,4,FILL_BLACK); + } + else { + lcd.drawRect(2,42,20,4,FILL_TRANSPARENT); + } + if (e3enemy2_health < 10){ + lcd.drawRect(62,2,20,4,FILL_TRANSPARENT); + lcd.drawRect(62,2,20-2*e3enemy2_health,4,FILL_BLACK); + } + else { + lcd.drawRect(62,2,20,4,FILL_TRANSPARENT); + } +} + void GameEngine::draw_spacecraft_health(Gamepad &pad) { //get the health of the spacecraft