Rex Raj / Mbed 2 deprecated el17rrrs

Dependencies:   mbed Gamepad N5110 mbed-rtos

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