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.
EscapeEngine/EscapeEngine.cpp@2:fe4b9d530a8b, 2020-04-29 (annotated)
- Committer:
- godv
- Date:
- Wed Apr 29 04:56:07 2020 +0000
- Revision:
- 2:fe4b9d530a8b
111
Who changed what in which revision?
User | Revision | Line number | New 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 | } |