Liu Liting 201199465

Dependencies:   mbed N5110

Committer:
Ting12138
Date:
Thu May 14 15:42:14 2020 +0000
Revision:
13:a57a48e5e256
Parent:
12:3b7811c3502c
the 2645 project

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Ting12138 12:3b7811c3502c 1 #include "Engine.h"
Ting12138 12:3b7811c3502c 2
Ting12138 12:3b7811c3502c 3 Engine::Engine()
Ting12138 12:3b7811c3502c 4 {
Ting12138 12:3b7811c3502c 5
Ting12138 12:3b7811c3502c 6 }
Ting12138 12:3b7811c3502c 7
Ting12138 12:3b7811c3502c 8 Engine::~Engine()
Ting12138 12:3b7811c3502c 9 {
Ting12138 12:3b7811c3502c 10
Ting12138 12:3b7811c3502c 11 }
Ting12138 12:3b7811c3502c 12
Ting12138 12:3b7811c3502c 13 void Engine::init(int wall_width,int wall_gap,int foods_bulk,int velocity) {
Ting12138 12:3b7811c3502c 14
Ting12138 13:a57a48e5e256 15 // initialise for the game parameters
Ting12138 12:3b7811c3502c 16 _wall_width = wall_width;
Ting12138 13:a57a48e5e256 17 _wall_gap = wall_gap; // the wall gap presents and the distance between the top wall and the bottom wall, which is licked to difficulty
Ting12138 12:3b7811c3502c 18 _foods_bulk = foods_bulk; // larger foods means it will have larger area to trigger it "_rocket.add_score();"
Ting12138 12:3b7811c3502c 19 _velocity = velocity;
Ting12138 12:3b7811c3502c 20
Ting12138 13:a57a48e5e256 21 // x locations on screen - WIDTH is defined in N5110.h
Ting12138 13:a57a48e5e256 22 _w0x = WIDTH; // there is total 5 types of wall in the game, all are placed in distributed locationss
Ting12138 12:3b7811c3502c 23 _w1x = WIDTH + 30;
Ting12138 12:3b7811c3502c 24 _w2x = WIDTH + 60;
Ting12138 12:3b7811c3502c 25 _w3x = WIDTH + 90;
Ting12138 12:3b7811c3502c 26 _w4x = WIDTH + 120;
Ting12138 12:3b7811c3502c 27 _rocketx = 8;
Ting12138 12:3b7811c3502c 28 _foodsx = WIDTH + 105;
Ting12138 12:3b7811c3502c 29
Ting12138 12:3b7811c3502c 30 _w0.init(_w0x,_wall_gap,_wall_width,_velocity); // initiate all walls with random holes
Ting12138 12:3b7811c3502c 31 _w1.init(_w1x,_wall_gap,_wall_width,_velocity);
Ting12138 12:3b7811c3502c 32 _w2.init(_w2x,_wall_gap,_wall_width,_velocity);
Ting12138 12:3b7811c3502c 33 _w3.init(_w3x,_wall_gap,_wall_width,_velocity);
Ting12138 12:3b7811c3502c 34 _w4.init(_w4x,_wall_gap,_wall_width,_velocity);
Ting12138 13:a57a48e5e256 35 _rocket.init(_rocketx); // seting the rocket in the middle location
Ting12138 13:a57a48e5e256 36 _foods.init(_foodsx,_foods_bulk,_velocity); // initiate foods bulk and a random locations of the y
Ting12138 12:3b7811c3502c 37 }
Ting12138 12:3b7811c3502c 38
Ting12138 13:a57a48e5e256 39 void Engine::read_input(Gamepad &pad) { // reading the joystick finction
Ting12138 12:3b7811c3502c 40
Ting12138 12:3b7811c3502c 41 _d = pad.get_direction();
Ting12138 12:3b7811c3502c 42 _mag = pad.get_mag();
Ting12138 12:3b7811c3502c 43 _mapped_coord = pad.get_mapped_coord();
Ting12138 12:3b7811c3502c 44 }
Ting12138 12:3b7811c3502c 45
Ting12138 12:3b7811c3502c 46 void Engine::draw(N5110 &lcd) {
Ting12138 13:a57a48e5e256 47 // draw all elements on the LCD buffer
Ting12138 13:a57a48e5e256 48 // the pitch
Ting12138 12:3b7811c3502c 49 lcd.drawRect(0,0,WIDTH,HEIGHT,FILL_TRANSPARENT);
Ting12138 13:a57a48e5e256 50 // all walls
Ting12138 12:3b7811c3502c 51 _w0.draw1(lcd);
Ting12138 12:3b7811c3502c 52 _w0.draw2(lcd);
Ting12138 12:3b7811c3502c 53 _w1.draw1(lcd);
Ting12138 12:3b7811c3502c 54 _w1.draw2(lcd);
Ting12138 12:3b7811c3502c 55 _w2.draw1(lcd);
Ting12138 12:3b7811c3502c 56 _w2.draw2(lcd);
Ting12138 12:3b7811c3502c 57 _w3.draw1(lcd);
Ting12138 12:3b7811c3502c 58 _w3.draw2(lcd);
Ting12138 12:3b7811c3502c 59 _w4.draw1(lcd);
Ting12138 12:3b7811c3502c 60 _w4.draw2(lcd);
Ting12138 12:3b7811c3502c 61 // the rocket
Ting12138 12:3b7811c3502c 62 _rocket.draw(lcd);
Ting12138 13:a57a48e5e256 63 // all foods
Ting12138 12:3b7811c3502c 64 _foods.draw(lcd);
Ting12138 12:3b7811c3502c 65 }
Ting12138 12:3b7811c3502c 66
Ting12138 13:a57a48e5e256 67 void Engine::check_score(Gamepad &pad) { //checking the score to trigger and how many leds should be turned on
Ting12138 12:3b7811c3502c 68
Ting12138 13:a57a48e5e256 69 int rocket_score = _rocket.get_final_score(); // get the final score
Ting12138 12:3b7811c3502c 70
Ting12138 13:a57a48e5e256 71 if (rocket_score == 0) { // 7 if statements to the represents 7 conditions
Ting12138 12:3b7811c3502c 72 pad.leds_off();
Ting12138 12:3b7811c3502c 73 }
Ting12138 13:a57a48e5e256 74 if (rocket_score == 1) { // when getting one food,you can turn on 1 led
Ting12138 12:3b7811c3502c 75 pad.led(1,1.0f);
Ting12138 12:3b7811c3502c 76 pad.led(2,0.0f);
Ting12138 12:3b7811c3502c 77 pad.led(2,0.0f);
Ting12138 12:3b7811c3502c 78 pad.led(2,0.0f);
Ting12138 12:3b7811c3502c 79 pad.led(2,0.0f);
Ting12138 12:3b7811c3502c 80 pad.led(2,0.0f);
Ting12138 12:3b7811c3502c 81 }
Ting12138 13:a57a48e5e256 82 if (rocket_score == 2) { // when you get two foods, you will light lcd1 and lcd6
Ting12138 12:3b7811c3502c 83 pad.led(1,1.0f);
Ting12138 12:3b7811c3502c 84 pad.led(2,0.0f);
Ting12138 12:3b7811c3502c 85 pad.led(3,0.0f);
Ting12138 12:3b7811c3502c 86 pad.led(4,0.0f);
Ting12138 12:3b7811c3502c 87 pad.led(5,0.0f);
Ting12138 12:3b7811c3502c 88 pad.led(6,1.0f);
Ting12138 12:3b7811c3502c 89 }
Ting12138 13:a57a48e5e256 90 if (rocket_score == 3) {// when you get two foods, you will light lcd1, lcd6 and lcd2
Ting12138 12:3b7811c3502c 91 pad.led(1,1.0f);
Ting12138 12:3b7811c3502c 92 pad.led(2,1.0f);
Ting12138 12:3b7811c3502c 93 pad.led(3,0.0f);
Ting12138 12:3b7811c3502c 94 pad.led(4,0.0f);
Ting12138 12:3b7811c3502c 95 pad.led(5,0.0f);
Ting12138 12:3b7811c3502c 96 pad.led(6,1.0f);
Ting12138 12:3b7811c3502c 97 }
Ting12138 13:a57a48e5e256 98 if (rocket_score == 4) {// when you get two foods, you will light led1, led6,led5 and led2
Ting12138 12:3b7811c3502c 99 pad.led(1,1.0f);
Ting12138 12:3b7811c3502c 100 pad.led(2,1.0f);
Ting12138 12:3b7811c3502c 101 pad.led(3,0.0f);
Ting12138 12:3b7811c3502c 102 pad.led(4,0.0f);
Ting12138 12:3b7811c3502c 103 pad.led(5,1.0f);
Ting12138 12:3b7811c3502c 104 pad.led(6,1.0f);
Ting12138 12:3b7811c3502c 105 }
Ting12138 13:a57a48e5e256 106 if (rocket_score == 5) {// when you get two foods, you will light leds except led4
Ting12138 12:3b7811c3502c 107 pad.led(1,1.0f);
Ting12138 12:3b7811c3502c 108 pad.led(2,1.0f);
Ting12138 12:3b7811c3502c 109 pad.led(3,1.0f);
Ting12138 12:3b7811c3502c 110 pad.led(4,0.0f);
Ting12138 12:3b7811c3502c 111 pad.led(5,1.0f);
Ting12138 12:3b7811c3502c 112 pad.led(6,1.0f);
Ting12138 12:3b7811c3502c 113 }
Ting12138 13:a57a48e5e256 114 if (rocket_score == 6) {// when you get two foods, you will light all led
Ting12138 12:3b7811c3502c 115 pad.led(1,1.0f);
Ting12138 12:3b7811c3502c 116 pad.led(2,1.0f);
Ting12138 12:3b7811c3502c 117 pad.led(3,1.0f);
Ting12138 12:3b7811c3502c 118 pad.led(4,1.0f);
Ting12138 12:3b7811c3502c 119 pad.led(5,1.0f);
Ting12138 12:3b7811c3502c 120 pad.led(6,1.0f);
Ting12138 12:3b7811c3502c 121 }
Ting12138 12:3b7811c3502c 122
Ting12138 13:a57a48e5e256 123 Vector2D rocket_pos = _rocket.get_locations(); // the goal of this section is checking the contact between the rocket and the food, where the current locations of the rocket and the food is obtained
Ting12138 12:3b7811c3502c 124
Ting12138 13:a57a48e5e256 125 Vector2D foods_pos = _foods.get_locations();
Ting12138 12:3b7811c3502c 126
Ting12138 12:3b7811c3502c 127 if (foods_pos.x <= 1) { // if the food leaves the left side of the screen, replace it to the right side for the next foods retrieval
Ting12138 12:3b7811c3502c 128 _foods.replace();
Ting12138 12:3b7811c3502c 129 }
Ting12138 12:3b7811c3502c 130
Ting12138 12:3b7811c3502c 131 if (
Ting12138 12:3b7811c3502c 132 (rocket_pos.y + 4 >= foods_pos.y - _foods_bulk) && (rocket_pos.y + 2 <= foods_pos.y + _foods_bulk) // check if rrocket and the foods are overlap
Ting12138 13:a57a48e5e256 133 && //aat the bottom
Ting12138 12:3b7811c3502c 134 (rocket_pos.x + 10 >= foods_pos.x) && (rocket_pos.x + 10 <= foods_pos.x + 1) //right
Ting12138 12:3b7811c3502c 135 ) {
Ting12138 13:a57a48e5e256 136 // if it happen this situation , fixing locations and reflecting x velocity
Ting12138 12:3b7811c3502c 137 _rocket.add_score();
Ting12138 12:3b7811c3502c 138 pad.tone(550.0,0.25);
Ting12138 12:3b7811c3502c 139 wait(0.25);
Ting12138 12:3b7811c3502c 140 pad.tone(1500.0,0.25);
Ting12138 12:3b7811c3502c 141 wait(0.25);
Ting12138 12:3b7811c3502c 142 }
Ting12138 12:3b7811c3502c 143 }
Ting12138 12:3b7811c3502c 144
Ting12138 12:3b7811c3502c 145
Ting12138 12:3b7811c3502c 146 void Engine::update(Gamepad &pad) {
Ting12138 12:3b7811c3502c 147
Ting12138 12:3b7811c3502c 148 //It's important to check that the walls, rockets, and food are updated before the collision, so that it can be fixed before the new food is updated
Ting12138 12:3b7811c3502c 149 _w0.update();
Ting12138 12:3b7811c3502c 150 _w1.update();
Ting12138 12:3b7811c3502c 151 _w2.update();
Ting12138 12:3b7811c3502c 152 _w3.update();
Ting12138 12:3b7811c3502c 153 _w4.update();
Ting12138 12:3b7811c3502c 154 _rocket.replace(_d,_mag,_mapped_coord);
Ting12138 12:3b7811c3502c 155 _foods.update();
Ting12138 12:3b7811c3502c 156 collision(pad);
Ting12138 12:3b7811c3502c 157 check_score(pad);
Ting12138 12:3b7811c3502c 158 }
Ting12138 12:3b7811c3502c 159
Ting12138 12:3b7811c3502c 160 void Engine::collision(Gamepad &pad) {
Ting12138 12:3b7811c3502c 161
Ting12138 13:a57a48e5e256 162 // reading the right locations of rocket
Ting12138 13:a57a48e5e256 163 Vector2D rocket_pos = _rocket.get_locations();
Ting12138 12:3b7811c3502c 164
Ting12138 13:a57a48e5e256 165 //read all of these locationss of the FIVE wall
Ting12138 12:3b7811c3502c 166 int w0_x = _w0.get_x();
Ting12138 12:3b7811c3502c 167 int w1_x = _w1.get_x();
Ting12138 12:3b7811c3502c 168 int w2_x = _w2.get_x();
Ting12138 12:3b7811c3502c 169 int w3_x = _w3.get_x();
Ting12138 12:3b7811c3502c 170 int w4_x = _w4.get_x();
Ting12138 12:3b7811c3502c 171
Ting12138 13:a57a48e5e256 172 if (w0_x <= 1) { // When the rocket passes behind the wall, it will reset to its original locations to continue the game
Ting12138 12:3b7811c3502c 173 _w0.reset();
Ting12138 12:3b7811c3502c 174 }
Ting12138 12:3b7811c3502c 175 if (w1_x <= 1) {
Ting12138 12:3b7811c3502c 176 _w1.reset();
Ting12138 12:3b7811c3502c 177 }
Ting12138 12:3b7811c3502c 178 if (w2_x <= 1) {
Ting12138 12:3b7811c3502c 179 _w2.reset();
Ting12138 12:3b7811c3502c 180 }
Ting12138 12:3b7811c3502c 181 if (w3_x <= 1) {
Ting12138 12:3b7811c3502c 182 _w3.reset();
Ting12138 12:3b7811c3502c 183 }
Ting12138 12:3b7811c3502c 184 if (w4_x <= 1) {
Ting12138 12:3b7811c3502c 185 _w4.reset();
Ting12138 12:3b7811c3502c 186 }
Ting12138 12:3b7811c3502c 187
Ting12138 12:3b7811c3502c 188 int w0_height = _w0.get_height(); // get the specific, random height for each of the walls
Ting12138 12:3b7811c3502c 189 int w1_height = _w1.get_height();
Ting12138 12:3b7811c3502c 190 int w2_height = _w2.get_height();
Ting12138 12:3b7811c3502c 191 int w3_height = _w3.get_height();
Ting12138 12:3b7811c3502c 192 int w4_height = _w4.get_height();
Ting12138 12:3b7811c3502c 193
Ting12138 12:3b7811c3502c 194 if ((
Ting12138 12:3b7811c3502c 195 (rocket_pos.y + 5 >= 0) && (rocket_pos.y + 1 <= w0_height) && // check all the top wall corner collision and the bottom for all the walls
Ting12138 12:3b7811c3502c 196 (rocket_pos.x + 10 >= _w0.get_x()) && (rocket_pos.x + 10 <= _w0.get_x() + 1) // left and right collisions
Ting12138 12:3b7811c3502c 197 ) || (
Ting12138 12:3b7811c3502c 198 (rocket_pos.y + 5 >= 0) && (rocket_pos.y + 1 <= w1_height) &&
Ting12138 12:3b7811c3502c 199 (rocket_pos.x + 10 >= _w1.get_x()) && (rocket_pos.x + 10 <= _w1.get_x() + 1)
Ting12138 12:3b7811c3502c 200 ) || (
Ting12138 12:3b7811c3502c 201 (rocket_pos.y + 5 >= 0) && (rocket_pos.x + 1 <= w2_height) &&
Ting12138 12:3b7811c3502c 202 (rocket_pos.x + 10 >= _w2.get_x()) && (rocket_pos.x + 10 <= _w2.get_x() + 1)
Ting12138 12:3b7811c3502c 203 ) || (
Ting12138 12:3b7811c3502c 204 (rocket_pos.y + 5 >= 0) && (rocket_pos.y + 1 <= w3_height) &&
Ting12138 12:3b7811c3502c 205 (rocket_pos.x + 10 >= _w3.get_x()) && (rocket_pos.x + 10 <= _w3.get_x() + 1)
Ting12138 12:3b7811c3502c 206 ) || (
Ting12138 12:3b7811c3502c 207 (rocket_pos.y + 5 >= 0) && (rocket_pos.y + 1 <= w4_height) &&
Ting12138 12:3b7811c3502c 208 (rocket_pos.x + 10 >= _w4.get_x()) && (rocket_pos.x + 10 <= _w4.get_x() + 1)
Ting12138 12:3b7811c3502c 209 )
Ting12138 12:3b7811c3502c 210 ) {
Ting12138 12:3b7811c3502c 211 _rocket.lose_score(); // if collision does happen, foods are lost because of the unnecessary time of interference
Ting12138 12:3b7811c3502c 212
Ting12138 12:3b7811c3502c 213 pad.tone(130.0,0.1); // sad sound playing
Ting12138 12:3b7811c3502c 214 wait(0.1);
Ting12138 12:3b7811c3502c 215 pad.tone(230.0,0.1);
Ting12138 12:3b7811c3502c 216 wait(0.1);
Ting12138 12:3b7811c3502c 217 pad.tone(330.0,0.1);
Ting12138 12:3b7811c3502c 218 wait(0.1);
Ting12138 12:3b7811c3502c 219 pad.tone(430.0,0.1);
Ting12138 12:3b7811c3502c 220 wait(0.1);
Ting12138 12:3b7811c3502c 221 pad.tone(530.0,0.1);
Ting12138 12:3b7811c3502c 222 wait(0.1);
Ting12138 12:3b7811c3502c 223 }
Ting12138 12:3b7811c3502c 224
Ting12138 12:3b7811c3502c 225 if ((
Ting12138 12:3b7811c3502c 226 (rocket_pos.y + 5 >= _wall_gap + w0_height) && (rocket_pos.y + 1 <= HEIGHT) && // check collisions for the bottom wall
Ting12138 12:3b7811c3502c 227 (rocket_pos.x + 10 >= _w0.get_x()) && (rocket_pos.x + 10 <= _w0.get_x() + 1) // left and right side
Ting12138 12:3b7811c3502c 228 ) || (
Ting12138 12:3b7811c3502c 229 (rocket_pos.y + 5 >= _wall_gap + w1_height) && (rocket_pos.y + 1 <= HEIGHT) &&
Ting12138 12:3b7811c3502c 230 (rocket_pos.x + 10 >= _w1.get_x()) && (rocket_pos.x + 10 <= _w1.get_x() + 1)
Ting12138 12:3b7811c3502c 231 ) || (
Ting12138 12:3b7811c3502c 232 (rocket_pos.y + 5 >= _wall_gap + w2_height) && (rocket_pos.y + 1 <= HEIGHT) &&
Ting12138 12:3b7811c3502c 233 (rocket_pos.x + 10 >= _w2.get_x()) && (rocket_pos.x + 10 <= _w2.get_x() + 1)
Ting12138 12:3b7811c3502c 234 ) || (
Ting12138 12:3b7811c3502c 235 (rocket_pos.y + 5 >= _wall_gap + w3_height) && (rocket_pos.y + 1 <= HEIGHT) &&
Ting12138 12:3b7811c3502c 236 (rocket_pos.x + 10 >= _w3.get_x()) && (rocket_pos.x + 10 <= _w3.get_x() + 1)
Ting12138 12:3b7811c3502c 237 ) || (
Ting12138 12:3b7811c3502c 238 (rocket_pos.y + 5 >= _wall_gap + w4_height) && (rocket_pos.y + 1 <= HEIGHT) &&
Ting12138 12:3b7811c3502c 239 (rocket_pos.x + 10 >= _w4.get_x()) && (rocket_pos.x + 10 <= _w4.get_x() + 1)
Ting12138 12:3b7811c3502c 240 )
Ting12138 12:3b7811c3502c 241 ) {
Ting12138 12:3b7811c3502c 242 _rocket.lose_score(); // score lost
Ting12138 12:3b7811c3502c 243
Ting12138 12:3b7811c3502c 244 pad.tone(100.0,0.1); // sad sound
Ting12138 12:3b7811c3502c 245 wait(0.1);
Ting12138 12:3b7811c3502c 246 pad.tone(200.0,0.1);
Ting12138 12:3b7811c3502c 247 wait(0.1);
Ting12138 12:3b7811c3502c 248 pad.tone(300.0,0.1);
Ting12138 12:3b7811c3502c 249 wait(0.1);
Ting12138 12:3b7811c3502c 250 pad.tone(400.0,0.1);
Ting12138 12:3b7811c3502c 251 wait(0.1);
Ting12138 12:3b7811c3502c 252 pad.tone(500.0,0.1);
Ting12138 12:3b7811c3502c 253 wait(0.1);
Ting12138 12:3b7811c3502c 254 }
Ting12138 12:3b7811c3502c 255 }
Ting12138 12:3b7811c3502c 256
Ting12138 12:3b7811c3502c 257
Ting12138 12:3b7811c3502c 258
Ting12138 13:a57a48e5e256 259 int Engine::get_final_score() { // get thefinal score for the main function to determine the ending
Ting12138 12:3b7811c3502c 260 return _rocket.get_final_score();
Ting12138 12:3b7811c3502c 261 }