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
diff -r 99fa5a619081 -r 45493d1d0689 GameEngine/GameEngine.cpp
--- 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