ELEC2645 (2018/19) / Mbed 2 deprecated 2645_Project_SiutingWong201186503

Dependencies:   mbed

Committer:
davidwst421
Date:
Thu May 09 04:26:16 2019 +0000
Revision:
12:660458c41c8e
Parent:
9:f88f3f50bbee
Child:
13:c3c58d50a571
Add easter egg

Who changed what in which revision?

UserRevisionLine numberNew contents of line
davidwst421 0:fd8eda608206 1 #include "Engine.h"
davidwst421 0:fd8eda608206 2
davidwst421 0:fd8eda608206 3 Engine::Engine()
davidwst421 0:fd8eda608206 4 {
davidwst421 0:fd8eda608206 5
davidwst421 0:fd8eda608206 6 }
davidwst421 0:fd8eda608206 7
davidwst421 0:fd8eda608206 8 Engine::~Engine()
davidwst421 0:fd8eda608206 9 {
davidwst421 0:fd8eda608206 10
davidwst421 0:fd8eda608206 11 }
davidwst421 0:fd8eda608206 12
davidwst421 7:193c0fd7afdd 13 void Engine::init(int wall_width,int wall_gap,int stone_size,int speed) {
davidwst421 0:fd8eda608206 14
davidwst421 0:fd8eda608206 15 // initialise the game parameters
davidwst421 0:fd8eda608206 16 _wall_width = wall_width;
davidwst421 0:fd8eda608206 17 _wall_gap = wall_gap;
davidwst421 0:fd8eda608206 18 _stone_size = stone_size;
davidwst421 0:fd8eda608206 19 _speed = speed;
davidwst421 0:fd8eda608206 20
davidwst421 0:fd8eda608206 21 // x position on screen - WIDTH is defined in N5110.h
davidwst421 0:fd8eda608206 22 _w0x = WIDTH;
davidwst421 7:193c0fd7afdd 23 _w1x = WIDTH + 30;
davidwst421 7:193c0fd7afdd 24 _w2x = WIDTH + 60;
davidwst421 7:193c0fd7afdd 25 _w3x = WIDTH + 90;
davidwst421 7:193c0fd7afdd 26 _w4x = WIDTH + 120;
davidwst421 0:fd8eda608206 27 _avengerx = 10;
davidwst421 7:193c0fd7afdd 28 _stonex = WIDTH + 105;
davidwst421 0:fd8eda608206 29
davidwst421 0:fd8eda608206 30 // puts paddles and ball in middle
davidwst421 0:fd8eda608206 31 _w0.init(_w0x,_wall_gap,_wall_width,_speed);
davidwst421 0:fd8eda608206 32 _w1.init(_w1x,_wall_gap,_wall_width,_speed);
davidwst421 0:fd8eda608206 33 _w2.init(_w2x,_wall_gap,_wall_width,_speed);
davidwst421 0:fd8eda608206 34 _w3.init(_w3x,_wall_gap,_wall_width,_speed);
davidwst421 0:fd8eda608206 35 _w4.init(_w4x,_wall_gap,_wall_width,_speed);
davidwst421 7:193c0fd7afdd 36 _avenger.init(_avengerx);
davidwst421 0:fd8eda608206 37 _stone.init(_stonex,_stone_size,_speed);
davidwst421 0:fd8eda608206 38 }
davidwst421 0:fd8eda608206 39
davidwst421 0:fd8eda608206 40 void Engine::read_input(Gamepad &pad) {
davidwst421 0:fd8eda608206 41
davidwst421 0:fd8eda608206 42 _d = pad.get_direction();
davidwst421 0:fd8eda608206 43 _mag = pad.get_mag();
davidwst421 6:a0f3dbbc8d33 44 _mapped_coord = pad.get_mapped_coord();
davidwst421 0:fd8eda608206 45 }
davidwst421 0:fd8eda608206 46
davidwst421 0:fd8eda608206 47 void Engine::draw(N5110 &lcd) {
davidwst421 0:fd8eda608206 48 // draw the elements in the LCD buffer
davidwst421 0:fd8eda608206 49 // pitch
davidwst421 0:fd8eda608206 50 lcd.drawRect(0,0,WIDTH,HEIGHT,FILL_TRANSPARENT);
davidwst421 0:fd8eda608206 51 //score
davidwst421 0:fd8eda608206 52 print_score(lcd);
davidwst421 0:fd8eda608206 53 // wall
davidwst421 0:fd8eda608206 54 _w0.draw1(lcd);
davidwst421 0:fd8eda608206 55 _w0.draw2(lcd);
davidwst421 0:fd8eda608206 56 _w1.draw1(lcd);
davidwst421 0:fd8eda608206 57 _w1.draw2(lcd);
davidwst421 0:fd8eda608206 58 _w2.draw1(lcd);
davidwst421 0:fd8eda608206 59 _w2.draw2(lcd);
davidwst421 0:fd8eda608206 60 _w3.draw1(lcd);
davidwst421 0:fd8eda608206 61 _w3.draw2(lcd);
davidwst421 0:fd8eda608206 62 _w4.draw1(lcd);
davidwst421 0:fd8eda608206 63 _w4.draw2(lcd);
davidwst421 0:fd8eda608206 64 // avenger
davidwst421 0:fd8eda608206 65 _avenger.draw(lcd);
davidwst421 0:fd8eda608206 66 // stone
davidwst421 0:fd8eda608206 67 _stone.draw(lcd);
davidwst421 0:fd8eda608206 68 }
davidwst421 0:fd8eda608206 69
davidwst421 0:fd8eda608206 70
davidwst421 0:fd8eda608206 71 void Engine::update(Gamepad &pad) {
davidwst421 0:fd8eda608206 72
davidwst421 0:fd8eda608206 73 // important to update paddles and ball before checking collisions so can
davidwst421 0:fd8eda608206 74 // correct for it before updating the display
davidwst421 0:fd8eda608206 75 _w0.update();
davidwst421 0:fd8eda608206 76 _w1.update();
davidwst421 0:fd8eda608206 77 _w2.update();
davidwst421 0:fd8eda608206 78 _w3.update();
davidwst421 0:fd8eda608206 79 _w4.update();
davidwst421 6:a0f3dbbc8d33 80 _avenger.update(_d,_mag,_mapped_coord);
davidwst421 0:fd8eda608206 81 _stone.update();
davidwst421 0:fd8eda608206 82 check_wall_collision(pad);
davidwst421 0:fd8eda608206 83 check_score(pad);
davidwst421 0:fd8eda608206 84 }
davidwst421 0:fd8eda608206 85
davidwst421 0:fd8eda608206 86 void Engine::check_wall_collision(Gamepad &pad) {
davidwst421 0:fd8eda608206 87
davidwst421 0:fd8eda608206 88 // read the current avenger's position
davidwst421 0:fd8eda608206 89 Vector2D avenger_pos = _avenger.get_pos();
davidwst421 0:fd8eda608206 90
davidwst421 0:fd8eda608206 91 //read the first wall position
davidwst421 1:f09ff0ed98fd 92 int w0_x = _w0.get_x();
davidwst421 1:f09ff0ed98fd 93 int w1_x = _w1.get_x();
davidwst421 1:f09ff0ed98fd 94 int w2_x = _w2.get_x();
davidwst421 1:f09ff0ed98fd 95 int w3_x = _w3.get_x();
davidwst421 1:f09ff0ed98fd 96 int w4_x = _w4.get_x();
davidwst421 0:fd8eda608206 97
davidwst421 1:f09ff0ed98fd 98 if (w0_x <= 1) { // 1 due to 1 pixel boundary
davidwst421 1:f09ff0ed98fd 99 _w0.reset(); // bounce off ceiling without going off screen
davidwst421 1:f09ff0ed98fd 100 }
davidwst421 1:f09ff0ed98fd 101 if (w1_x <= 1) { // 1 due to 1 pixel boundary
davidwst421 2:00a3edbe39b0 102 _w1.reset(); // bounce off ceiling without going off screen
davidwst421 1:f09ff0ed98fd 103 }
davidwst421 1:f09ff0ed98fd 104 if (w2_x <= 1) { // 1 due to 1 pixel boundary
davidwst421 2:00a3edbe39b0 105 _w2.reset(); // bounce off ceiling without going off screen
davidwst421 1:f09ff0ed98fd 106 }
davidwst421 1:f09ff0ed98fd 107 if (w3_x <= 1) { // 1 due to 1 pixel boundary
davidwst421 2:00a3edbe39b0 108 _w3.reset(); // bounce off ceiling without going off screen
davidwst421 1:f09ff0ed98fd 109 }
davidwst421 1:f09ff0ed98fd 110 if (w4_x <= 1) { // 1 due to 1 pixel boundary
davidwst421 2:00a3edbe39b0 111 _w4.reset(); // bounce off ceiling without going off screen
davidwst421 0:fd8eda608206 112 }
davidwst421 0:fd8eda608206 113
davidwst421 1:f09ff0ed98fd 114 int w0_height = _w0.get_height();
davidwst421 1:f09ff0ed98fd 115 int w1_height = _w1.get_height();
davidwst421 1:f09ff0ed98fd 116 int w2_height = _w2.get_height();
davidwst421 1:f09ff0ed98fd 117 int w3_height = _w3.get_height();
davidwst421 1:f09ff0ed98fd 118 int w4_height = _w4.get_height();
davidwst421 0:fd8eda608206 119
davidwst421 1:f09ff0ed98fd 120 if ((
davidwst421 12:660458c41c8e 121 (avenger_pos.y + 5 >= 0) && (avenger_pos.y + 1 <= w0_height) && //bottom
davidwst421 8:97576c8761a8 122 (avenger_pos.x + 10 >= _w0.get_x()) && (avenger_pos.x + 10 <= _w0.get_x() + 1)
davidwst421 1:f09ff0ed98fd 123 ) || (
davidwst421 12:660458c41c8e 124 (avenger_pos.y + 5 >= 0) && (avenger_pos.y + 1 <= w1_height) && //bottom
davidwst421 8:97576c8761a8 125 (avenger_pos.x + 10 >= _w1.get_x()) && (avenger_pos.x + 10 <= _w1.get_x() + 1)
davidwst421 1:f09ff0ed98fd 126 ) || (
davidwst421 12:660458c41c8e 127 (avenger_pos.y + 5 >= 0) && (avenger_pos.y + 1 <= w2_height) && //bottom
davidwst421 8:97576c8761a8 128 (avenger_pos.x + 10 >= _w2.get_x()) && (avenger_pos.x + 10 <= _w2.get_x() + 1)
davidwst421 1:f09ff0ed98fd 129 ) || (
davidwst421 12:660458c41c8e 130 (avenger_pos.y + 5 >= 0) && (avenger_pos.y + 1 <= w3_height) && //bottom
davidwst421 8:97576c8761a8 131 (avenger_pos.x + 10 >= _w3.get_x()) && (avenger_pos.x + 10 <= _w3.get_x() + 1)
davidwst421 1:f09ff0ed98fd 132 ) || (
davidwst421 12:660458c41c8e 133 (avenger_pos.y + 5 >= 0) && (avenger_pos.y + 1 <= w4_height) && //bottom
davidwst421 8:97576c8761a8 134 (avenger_pos.x + 10 >= _w4.get_x()) && (avenger_pos.x + 10 <= _w4.get_x() + 1)
davidwst421 1:f09ff0ed98fd 135 )
davidwst421 1:f09ff0ed98fd 136 ) {
davidwst421 0:fd8eda608206 137 _avenger.lose_score();
davidwst421 1:f09ff0ed98fd 138 pad.tone(100.0,0.1);
davidwst421 1:f09ff0ed98fd 139 wait(0.1);
davidwst421 1:f09ff0ed98fd 140 pad.tone(200.0,0.1);
davidwst421 1:f09ff0ed98fd 141 wait(0.1);
davidwst421 1:f09ff0ed98fd 142 pad.tone(300.0,0.1);
davidwst421 1:f09ff0ed98fd 143 wait(0.1);
davidwst421 1:f09ff0ed98fd 144 pad.tone(400.0,0.1);
davidwst421 1:f09ff0ed98fd 145 wait(0.1);
davidwst421 1:f09ff0ed98fd 146 pad.tone(500.0,0.1);
davidwst421 1:f09ff0ed98fd 147 wait(0.1);
davidwst421 0:fd8eda608206 148 }
davidwst421 0:fd8eda608206 149
davidwst421 1:f09ff0ed98fd 150 if ((
davidwst421 12:660458c41c8e 151 (avenger_pos.y + 5 >= _wall_gap + w0_height) && (avenger_pos.y + 1 <= HEIGHT) && //bottom
davidwst421 8:97576c8761a8 152 (avenger_pos.x + 10 >= _w0.get_x()) && (avenger_pos.x + 10 <= _w0.get_x() + 1)
davidwst421 1:f09ff0ed98fd 153 ) || (
davidwst421 12:660458c41c8e 154 (avenger_pos.y + 5 >= _wall_gap + w1_height) && (avenger_pos.y + 1 <= HEIGHT) && //bottom
davidwst421 8:97576c8761a8 155 (avenger_pos.x + 10 >= _w1.get_x()) && (avenger_pos.x + 10 <= _w1.get_x() + 1)
davidwst421 1:f09ff0ed98fd 156 ) || (
davidwst421 12:660458c41c8e 157 (avenger_pos.y + 5 >= _wall_gap + w2_height) && (avenger_pos.y + 1 <= HEIGHT) && //bottom
davidwst421 8:97576c8761a8 158 (avenger_pos.x + 10 >= _w2.get_x()) && (avenger_pos.x + 10 <= _w2.get_x() + 1)
davidwst421 1:f09ff0ed98fd 159 ) || (
davidwst421 12:660458c41c8e 160 (avenger_pos.y + 5 >= _wall_gap + w3_height) && (avenger_pos.y + 1 <= HEIGHT) && //bottom
davidwst421 8:97576c8761a8 161 (avenger_pos.x + 10 >= _w3.get_x()) && (avenger_pos.x + 10 <= _w3.get_x() + 1)
davidwst421 1:f09ff0ed98fd 162 ) || (
davidwst421 12:660458c41c8e 163 (avenger_pos.y + 5 >= _wall_gap + w4_height) && (avenger_pos.y + 1 <= HEIGHT) && //bottom
davidwst421 8:97576c8761a8 164 (avenger_pos.x + 10 >= _w4.get_x()) && (avenger_pos.x + 10 <= _w4.get_x() + 1)
davidwst421 1:f09ff0ed98fd 165 )
davidwst421 1:f09ff0ed98fd 166 ) {
davidwst421 0:fd8eda608206 167 _avenger.lose_score();
davidwst421 1:f09ff0ed98fd 168 pad.tone(100.0,0.1);
davidwst421 1:f09ff0ed98fd 169 wait(0.1);
davidwst421 1:f09ff0ed98fd 170 pad.tone(200.0,0.1);
davidwst421 1:f09ff0ed98fd 171 wait(0.1);
davidwst421 1:f09ff0ed98fd 172 pad.tone(300.0,0.1);
davidwst421 1:f09ff0ed98fd 173 wait(0.1);
davidwst421 1:f09ff0ed98fd 174 pad.tone(400.0,0.1);
davidwst421 1:f09ff0ed98fd 175 wait(0.1);
davidwst421 1:f09ff0ed98fd 176 pad.tone(500.0,0.1);
davidwst421 1:f09ff0ed98fd 177 wait(0.1);
davidwst421 0:fd8eda608206 178 }
davidwst421 0:fd8eda608206 179 }
davidwst421 0:fd8eda608206 180
davidwst421 0:fd8eda608206 181 void Engine::check_score(Gamepad &pad) {
davidwst421 0:fd8eda608206 182
davidwst421 0:fd8eda608206 183 int avenger_score = _avenger.get_score();
davidwst421 0:fd8eda608206 184
davidwst421 0:fd8eda608206 185 if (avenger_score == 0) {
davidwst421 0:fd8eda608206 186 pad.leds_off();
davidwst421 0:fd8eda608206 187 }
davidwst421 0:fd8eda608206 188 if (avenger_score == 1) {
davidwst421 0:fd8eda608206 189 pad.led(1,1.0f);
davidwst421 0:fd8eda608206 190 pad.led(2,0.0f);
davidwst421 0:fd8eda608206 191 pad.led(2,0.0f);
davidwst421 0:fd8eda608206 192 pad.led(2,0.0f);
davidwst421 0:fd8eda608206 193 pad.led(2,0.0f);
davidwst421 0:fd8eda608206 194 pad.led(2,0.0f);
davidwst421 0:fd8eda608206 195 }
davidwst421 0:fd8eda608206 196 if (avenger_score == 2) {
davidwst421 0:fd8eda608206 197 pad.led(1,1.0f);
davidwst421 0:fd8eda608206 198 pad.led(2,1.0f);
davidwst421 0:fd8eda608206 199 pad.led(3,0.0f);
davidwst421 0:fd8eda608206 200 pad.led(4,0.0f);
davidwst421 0:fd8eda608206 201 pad.led(5,0.0f);
davidwst421 0:fd8eda608206 202 pad.led(6,0.0f);
davidwst421 0:fd8eda608206 203 }
davidwst421 0:fd8eda608206 204 if (avenger_score == 3) {
davidwst421 0:fd8eda608206 205 pad.led(1,1.0f);
davidwst421 0:fd8eda608206 206 pad.led(2,1.0f);
davidwst421 0:fd8eda608206 207 pad.led(3,1.0f);
davidwst421 0:fd8eda608206 208 pad.led(4,0.0f);
davidwst421 0:fd8eda608206 209 pad.led(5,0.0f);
davidwst421 0:fd8eda608206 210 pad.led(6,0.0f);
davidwst421 0:fd8eda608206 211 }
davidwst421 0:fd8eda608206 212 if (avenger_score == 4) {
davidwst421 0:fd8eda608206 213 pad.led(1,1.0f);
davidwst421 0:fd8eda608206 214 pad.led(2,1.0f);
davidwst421 0:fd8eda608206 215 pad.led(3,1.0f);
davidwst421 0:fd8eda608206 216 pad.led(4,1.0f);
davidwst421 0:fd8eda608206 217 pad.led(5,0.0f);
davidwst421 0:fd8eda608206 218 pad.led(6,0.0f);
davidwst421 0:fd8eda608206 219 }
davidwst421 0:fd8eda608206 220 if (avenger_score == 5) {
davidwst421 0:fd8eda608206 221 pad.led(1,1.0f);
davidwst421 0:fd8eda608206 222 pad.led(2,1.0f);
davidwst421 0:fd8eda608206 223 pad.led(3,1.0f);
davidwst421 0:fd8eda608206 224 pad.led(4,1.0f);
davidwst421 0:fd8eda608206 225 pad.led(5,1.0f);
davidwst421 0:fd8eda608206 226 pad.led(6,0.0f);
davidwst421 0:fd8eda608206 227 }
davidwst421 0:fd8eda608206 228 if (avenger_score == 6) {
davidwst421 0:fd8eda608206 229 pad.led(1,1.0f);
davidwst421 0:fd8eda608206 230 pad.led(2,1.0f);
davidwst421 0:fd8eda608206 231 pad.led(3,1.0f);
davidwst421 0:fd8eda608206 232 pad.led(4,1.0f);
davidwst421 0:fd8eda608206 233 pad.led(5,1.0f);
davidwst421 0:fd8eda608206 234 pad.led(6,1.0f);
davidwst421 0:fd8eda608206 235 }
davidwst421 0:fd8eda608206 236
davidwst421 0:fd8eda608206 237 // check p1 first
davidwst421 0:fd8eda608206 238 Vector2D avenger_pos = _avenger.get_pos();
davidwst421 0:fd8eda608206 239 // read current ball attributes
davidwst421 0:fd8eda608206 240 Vector2D stone_pos = _stone.get_pos();
davidwst421 0:fd8eda608206 241
davidwst421 0:fd8eda608206 242 if (stone_pos.x <= 1) { // 1 due to 1 pixel boundary
davidwst421 0:fd8eda608206 243 _stone.reset(); // bounce off ceiling without going off screen
davidwst421 0:fd8eda608206 244 }
davidwst421 0:fd8eda608206 245
davidwst421 0:fd8eda608206 246 // see if ball has hit the paddle by checking for overlaps
davidwst421 0:fd8eda608206 247 if (
davidwst421 12:660458c41c8e 248 (avenger_pos.y + 4 >= stone_pos.y - _stone_size) && (avenger_pos.y + 2 <= stone_pos.y + _stone_size)
davidwst421 0:fd8eda608206 249 && //bottom
davidwst421 8:97576c8761a8 250 (avenger_pos.x + 10 >= stone_pos.x) && (avenger_pos.x + 10 <= stone_pos.x + 2) //right
davidwst421 0:fd8eda608206 251 ) {
davidwst421 0:fd8eda608206 252 // if it has, fix position and reflect x velocity
davidwst421 0:fd8eda608206 253 _avenger.add_score();
davidwst421 0:fd8eda608206 254 pad.tone(500.0,0.25);
davidwst421 0:fd8eda608206 255 wait(0.25);
davidwst421 0:fd8eda608206 256 pad.tone(1000.0,0.25);
davidwst421 0:fd8eda608206 257 wait(0.25);
davidwst421 0:fd8eda608206 258 }
davidwst421 0:fd8eda608206 259 }
davidwst421 0:fd8eda608206 260
davidwst421 0:fd8eda608206 261 void Engine::print_score(N5110 &lcd) {
davidwst421 0:fd8eda608206 262
davidwst421 0:fd8eda608206 263 // get scores from paddles
davidwst421 0:fd8eda608206 264 int avenger_score = _avenger.get_score();
davidwst421 0:fd8eda608206 265
davidwst421 0:fd8eda608206 266 // print to LCD i
davidwst421 0:fd8eda608206 267 char buffer1[14];
davidwst421 0:fd8eda608206 268 sprintf(buffer1,"%2d",avenger_score);
davidwst421 12:660458c41c8e 269 lcd.printString(buffer1,1,0); // font is 8 wide, so leave 4 pixel gape from middle assuming two digits
davidwst421 4:fcd80b40f257 270 }
davidwst421 4:fcd80b40f257 271
davidwst421 4:fcd80b40f257 272 int Engine::get_score() {
davidwst421 4:fcd80b40f257 273 return _avenger.get_score();
davidwst421 0:fd8eda608206 274 }