gao dawei / Mbed 2 deprecated godv

Dependencies:   mbed

Committer:
godv
Date:
Wed Apr 29 04:56:07 2020 +0000
Revision:
2:fe4b9d530a8b
111

Who changed what in which revision?

UserRevisionLine numberNew contents of line
godv 2:fe4b9d530a8b 1 #include "EscapeEngine.h"
godv 2:fe4b9d530a8b 2
godv 2:fe4b9d530a8b 3 EscapeEngine::EscapeEngine()
godv 2:fe4b9d530a8b 4 {
godv 2:fe4b9d530a8b 5
godv 2:fe4b9d530a8b 6 }
godv 2:fe4b9d530a8b 7
godv 2:fe4b9d530a8b 8 EscapeEngine::~EscapeEngine()
godv 2:fe4b9d530a8b 9 {
godv 2:fe4b9d530a8b 10
godv 2:fe4b9d530a8b 11 }
godv 2:fe4b9d530a8b 12
godv 2:fe4b9d530a8b 13 void EscapeEngine::init(int redspider_width,int redspider_height,int robot_width, int robot_height, int missile_width, int missile_height, int allspark_size, int speed)
godv 2:fe4b9d530a8b 14 {
godv 2:fe4b9d530a8b 15 // initialise the game parameters
godv 2:fe4b9d530a8b 16 _redspider_width = redspider_width;
godv 2:fe4b9d530a8b 17 _redspider_height = redspider_height;
godv 2:fe4b9d530a8b 18 _robot_width = robot_width;
godv 2:fe4b9d530a8b 19 _robot_height = robot_height;
godv 2:fe4b9d530a8b 20 _missile_width = missile_width;
godv 2:fe4b9d530a8b 21 _missile_height = missile_height;
godv 2:fe4b9d530a8b 22 _allspark_size = allspark_size;
godv 2:fe4b9d530a8b 23 _speed = speed;
godv 2:fe4b9d530a8b 24
godv 2:fe4b9d530a8b 25 // x position on screen - WIDTH is defined in N5110.h
godv 2:fe4b9d530a8b 26 _redspiderx = GAP;
godv 2:fe4b9d530a8b 27
godv 2:fe4b9d530a8b 28 // Initializing Human,Zombie,Worm,Bat and Bullet
godv 2:fe4b9d530a8b 29 _redspider.init(_redspiderx,_redspider_height,_redspider_width);
godv 2:fe4b9d530a8b 30 _robot.init(_robot_height,_robot_width,_speed);
godv 2:fe4b9d530a8b 31 _missile.init(_missile_height,_missile_width,_speed);
godv 2:fe4b9d530a8b 32 _allspark.init(_allspark_size,_speed);
godv 2:fe4b9d530a8b 33 }
godv 2:fe4b9d530a8b 34
godv 2:fe4b9d530a8b 35 void EscapeEngine::read_input(Gamepad &pad)
godv 2:fe4b9d530a8b 36 {
godv 2:fe4b9d530a8b 37 _d = pad.get_direction();
godv 2:fe4b9d530a8b 38 _mag = pad.get_mag();
godv 2:fe4b9d530a8b 39 }
godv 2:fe4b9d530a8b 40
godv 2:fe4b9d530a8b 41
godv 2:fe4b9d530a8b 42
godv 2:fe4b9d530a8b 43 void EscapeEngine::draw(N5110 &lcd)
godv 2:fe4b9d530a8b 44 {
godv 2:fe4b9d530a8b 45 // draw the elements in the LCD buffer
godv 2:fe4b9d530a8b 46 lcd.drawRect(0,0,WIDTH,HEIGHT,FILL_TRANSPARENT);
godv 2:fe4b9d530a8b 47 lcd.drawLine(WIDTH/4,0,WIDTH/4,HEIGHT-1,2);
godv 2:fe4b9d530a8b 48 //score
godv 2:fe4b9d530a8b 49 print_scores(lcd);
godv 2:fe4b9d530a8b 50 // Human
godv 2:fe4b9d530a8b 51 _redspider.draw(lcd);
godv 2:fe4b9d530a8b 52 // Zombie
godv 2:fe4b9d530a8b 53 _robot.draw(lcd);
godv 2:fe4b9d530a8b 54 // Bullet
godv 2:fe4b9d530a8b 55 _missile.draw(lcd);
godv 2:fe4b9d530a8b 56 _allspark.draw(lcd);
godv 2:fe4b9d530a8b 57
godv 2:fe4b9d530a8b 58 }
godv 2:fe4b9d530a8b 59
godv 2:fe4b9d530a8b 60 void EscapeEngine::update(Gamepad &pad)
godv 2:fe4b9d530a8b 61 {
godv 2:fe4b9d530a8b 62 check_goal(pad);
godv 2:fe4b9d530a8b 63 _redspider.update(_d,_mag);
godv 2:fe4b9d530a8b 64 _robot.update();
godv 2:fe4b9d530a8b 65 _missile.update();
godv 2:fe4b9d530a8b 66 _allspark.update();
godv 2:fe4b9d530a8b 67 check_redspider_collisions(pad);
godv 2:fe4b9d530a8b 68 check_wall_collisions(pad);
godv 2:fe4b9d530a8b 69
godv 2:fe4b9d530a8b 70 }
godv 2:fe4b9d530a8b 71
godv 2:fe4b9d530a8b 72
godv 2:fe4b9d530a8b 73
godv 2:fe4b9d530a8b 74 void EscapeEngine::check_redspider_collisions(Gamepad &pad)
godv 2:fe4b9d530a8b 75 {
godv 2:fe4b9d530a8b 76 // read current Zombie attributes
godv 2:fe4b9d530a8b 77 Vector2D allspark_pos = _allspark.get_pos();
godv 2:fe4b9d530a8b 78 Vector2D allspark_velocity = _allspark.get_velocity();
godv 2:fe4b9d530a8b 79 Vector2D redspider_pos = _redspider.get_pos();
godv 2:fe4b9d530a8b 80 Vector2D redspider_velocity = _redspider.get_velocity();
godv 2:fe4b9d530a8b 81
godv 2:fe4b9d530a8b 82 // see if Zombie has hit the area of Human by checking for overlaps
godv 2:fe4b9d530a8b 83
godv 2:fe4b9d530a8b 84 if ((redspider_pos.x <= allspark_pos.x)&&
godv 2:fe4b9d530a8b 85 (redspider_pos.y >= allspark_pos.y )&&
godv 2:fe4b9d530a8b 86 (redspider_pos.y <= allspark_pos.y + 8 ))
godv 2:fe4b9d530a8b 87 {
godv 2:fe4b9d530a8b 88 _redspider.add_score();
godv 2:fe4b9d530a8b 89 _allspark.init(_allspark_size,_speed);
godv 2:fe4b9d530a8b 90 pad.tone(1500.0,0.5);
godv 2:fe4b9d530a8b 91 pad.leds_on();
godv 2:fe4b9d530a8b 92 wait(0.5);
godv 2:fe4b9d530a8b 93 pad.leds_off();
godv 2:fe4b9d530a8b 94 }
godv 2:fe4b9d530a8b 95
godv 2:fe4b9d530a8b 96
godv 2:fe4b9d530a8b 97
godv 2:fe4b9d530a8b 98
godv 2:fe4b9d530a8b 99
godv 2:fe4b9d530a8b 100
godv 2:fe4b9d530a8b 101
godv 2:fe4b9d530a8b 102 // write new attributes
godv 2:fe4b9d530a8b 103 _redspider.set_velocity(redspider_velocity);
godv 2:fe4b9d530a8b 104 _redspider.set_pos(redspider_pos);
godv 2:fe4b9d530a8b 105 }
godv 2:fe4b9d530a8b 106
godv 2:fe4b9d530a8b 107 void EscapeEngine::check_wall_collisions(Gamepad &pad)
godv 2:fe4b9d530a8b 108 {
godv 2:fe4b9d530a8b 109 // read current Bat attributes
godv 2:fe4b9d530a8b 110 Vector2D allspark_pos = _allspark.get_pos();
godv 2:fe4b9d530a8b 111 Vector2D allspark_velocity = _allspark.get_velocity();
godv 2:fe4b9d530a8b 112
godv 2:fe4b9d530a8b 113
godv 2:fe4b9d530a8b 114 // see if Bat has hit the area of Human by checking for overlaps
godv 2:fe4b9d530a8b 115 if (allspark_pos.y <= 1) { // 1 due to 1 pixel boundary
godv 2:fe4b9d530a8b 116 allspark_pos.y = 1; // bounce off ceiling without going off screen
godv 2:fe4b9d530a8b 117 allspark_velocity.y = -allspark_velocity.y;
godv 2:fe4b9d530a8b 118 // audio feedback
godv 2:fe4b9d530a8b 119 pad.tone(750.0,0.1);
godv 2:fe4b9d530a8b 120 }
godv 2:fe4b9d530a8b 121 // check if hit bottom wall
godv 2:fe4b9d530a8b 122 else if (allspark_pos.y + _allspark_size >= (HEIGHT-1) ) { // bottom pixel is 47
godv 2:fe4b9d530a8b 123 // hit bottom
godv 2:fe4b9d530a8b 124 allspark_pos.y = (HEIGHT-1) - _allspark_size; // stops ball going off screen
godv 2:fe4b9d530a8b 125 allspark_velocity.y = -allspark_velocity.y;
godv 2:fe4b9d530a8b 126 // audio feedback
godv 2:fe4b9d530a8b 127 pad.tone(750.0,0.1);
godv 2:fe4b9d530a8b 128 }
godv 2:fe4b9d530a8b 129 if (allspark_pos.x <= 1) { // 1 due to 1 pixel boundary
godv 2:fe4b9d530a8b 130 allspark_pos.x = 1; // bounce off ceiling without going off screen
godv 2:fe4b9d530a8b 131 allspark_velocity.x = -allspark_velocity.x;
godv 2:fe4b9d530a8b 132 // audio feedback
godv 2:fe4b9d530a8b 133 pad.tone(750.0,0.1);
godv 2:fe4b9d530a8b 134 }
godv 2:fe4b9d530a8b 135 // check if hit bottom wall
godv 2:fe4b9d530a8b 136 else if (allspark_pos.x + _allspark_size >= (WIDTH-1) ) { // bottom pixel is 47
godv 2:fe4b9d530a8b 137 // hit bottom
godv 2:fe4b9d530a8b 138 allspark_pos.x = (WIDTH-1) - _allspark_size; // stops ball going off screen
godv 2:fe4b9d530a8b 139 allspark_velocity.x = -allspark_velocity.x;
godv 2:fe4b9d530a8b 140 // audio feedback
godv 2:fe4b9d530a8b 141 pad.tone(750.0,0.1);
godv 2:fe4b9d530a8b 142 }
godv 2:fe4b9d530a8b 143 // update ball parameters
godv 2:fe4b9d530a8b 144 _allspark.set_velocity(allspark_velocity);
godv 2:fe4b9d530a8b 145 _allspark.set_pos(allspark_pos);
godv 2:fe4b9d530a8b 146 }
godv 2:fe4b9d530a8b 147
godv 2:fe4b9d530a8b 148
godv 2:fe4b9d530a8b 149
godv 2:fe4b9d530a8b 150 void EscapeEngine::check_goal(Gamepad &pad)
godv 2:fe4b9d530a8b 151 {
godv 2:fe4b9d530a8b 152 Vector2D robot_pos = _robot.get_pos();
godv 2:fe4b9d530a8b 153 Vector2D missile_pos = _missile.get_pos();
godv 2:fe4b9d530a8b 154 Vector2D redspider_pos = _redspider.get_pos();
godv 2:fe4b9d530a8b 155 Vector2D robot_velocity = _robot.get_velocity();
godv 2:fe4b9d530a8b 156 Vector2D missile_velocity = _missile.get_velocity();
godv 2:fe4b9d530a8b 157 Vector2D allspark_pos = _allspark.get_pos();
godv 2:fe4b9d530a8b 158
godv 2:fe4b9d530a8b 159
godv 2:fe4b9d530a8b 160 // Human has scored
godv 2:fe4b9d530a8b 161 if ((redspider_pos.x <= allspark_pos.x)&&
godv 2:fe4b9d530a8b 162 (redspider_pos.y >= allspark_pos.y )
godv 2:fe4b9d530a8b 163
godv 2:fe4b9d530a8b 164 ){
godv 2:fe4b9d530a8b 165 _redspider.add_score();
godv 2:fe4b9d530a8b 166 robot_pos.x = WIDTH ;
godv 2:fe4b9d530a8b 167 robot_pos.y = rand() % 32;
godv 2:fe4b9d530a8b 168 missile_pos.x = robot_pos.x + 20;
godv 2:fe4b9d530a8b 169 missile_pos.y = robot_pos.y + 4;
godv 2:fe4b9d530a8b 170 _allspark.init(_allspark_size,_speed);
godv 2:fe4b9d530a8b 171 pad.tone(1000.0,0.25);
godv 2:fe4b9d530a8b 172 wait(0.1);
godv 2:fe4b9d530a8b 173 }
godv 2:fe4b9d530a8b 174
godv 2:fe4b9d530a8b 175
godv 2:fe4b9d530a8b 176
godv 2:fe4b9d530a8b 177 else if((missile_pos.x > redspider_pos.x)
godv 2:fe4b9d530a8b 178 ){ missile_pos.x = redspider_pos.x + 20;
godv 2:fe4b9d530a8b 179 missile_pos.y = redspider_pos.y + 4;
godv 2:fe4b9d530a8b 180 }
godv 2:fe4b9d530a8b 181
godv 2:fe4b9d530a8b 182
godv 2:fe4b9d530a8b 183
godv 2:fe4b9d530a8b 184 _robot.set_velocity(robot_velocity);
godv 2:fe4b9d530a8b 185 _robot.set_pos(robot_pos);
godv 2:fe4b9d530a8b 186 _missile.set_velocity(missile_velocity);
godv 2:fe4b9d530a8b 187 _missile.set_pos(missile_pos);
godv 2:fe4b9d530a8b 188
godv 2:fe4b9d530a8b 189 }
godv 2:fe4b9d530a8b 190
godv 2:fe4b9d530a8b 191 void EscapeEngine::print_scores(N5110 &lcd)
godv 2:fe4b9d530a8b 192 {
godv 2:fe4b9d530a8b 193
godv 2:fe4b9d530a8b 194 int redspider_score = _redspider.get_score();
godv 2:fe4b9d530a8b 195
godv 2:fe4b9d530a8b 196
godv 2:fe4b9d530a8b 197 // print to LCD
godv 2:fe4b9d530a8b 198 char buffer1[14];
godv 2:fe4b9d530a8b 199 sprintf(buffer1,"%2d",redspider_score);
godv 2:fe4b9d530a8b 200 lcd.printString("SCORE",WIDTH/2 - 25,0);
godv 2:fe4b9d530a8b 201 lcd.printString(buffer1,WIDTH/2 - 20,1); // font is 8 wide, so leave 4 pixel gape from middle assuming two digits
godv 2:fe4b9d530a8b 202
godv 2:fe4b9d530a8b 203
godv 2:fe4b9d530a8b 204
godv 2:fe4b9d530a8b 205 }