ELEC2645 (2019/20) / Mbed 2 deprecated ELEC2645_Project_el19tb

Dependencies:   mbed

Committer:
el19tb
Date:
Mon May 18 03:12:30 2020 +0000
Revision:
41:6267c66953ca
Parent:
37:65c9e5a65738
Child:
42:04e326dcf09b
check for out of bound vehicles, and reset frog if it goes out of bound, worked on frog on log function a little

Who changed what in which revision?

UserRevisionLine numberNew contents of line
el19tb 37:65c9e5a65738 1 #include "Frogger.h"
el19tb 35:db257b7bdefc 2 #include "Menu.h"
el19tb 35:db257b7bdefc 3 #include "GraphicEngine.h"
el19tb 35:db257b7bdefc 4 #include <vector>
el19tb 35:db257b7bdefc 5 #include <stdio.h>
el19tb 35:db257b7bdefc 6 #include <cstddef>
el19tb 35:db257b7bdefc 7
el19tb 35:db257b7bdefc 8 bool frogLog = false;
el19tb 35:db257b7bdefc 9 bool frogDie = false; // whenever the frog is above safety lane in the middle
el19tb 35:db257b7bdefc 10 bool attach = false;
el19tb 35:db257b7bdefc 11
el19tb 37:65c9e5a65738 12 // level one initiailization has already been done
el19tb 37:65c9e5a65738 13 Frogger::Frogger(GraphicEngine *engine, Level *levelptr, Frog *frog, int grid, int w, int h)
el19tb 35:db257b7bdefc 14 {
el19tb 35:db257b7bdefc 15 this->graphics = engine; // get the renderer in place
el19tb 37:65c9e5a65738 16 this->level = levelptr; // one level object per engine
el19tb 35:db257b7bdefc 17 this->frog = frog; // one frog object per run
el19tb 35:db257b7bdefc 18
el19tb 37:65c9e5a65738 19 initializeParams(w, h, grid); // initialize the software parameters
el19tb 35:db257b7bdefc 20 initializeEmbeddedSystem(); // initialize the hardware paramaters
el19tb 35:db257b7bdefc 21 }
el19tb 35:db257b7bdefc 22
el19tb 37:65c9e5a65738 23 void Frogger::initializeParams(int w, int h, int grid)
el19tb 35:db257b7bdefc 24 {
el19tb 35:db257b7bdefc 25 // screen sizes
el19tb 37:65c9e5a65738 26 lcd_w = w; // width
el19tb 37:65c9e5a65738 27 lcd_h = h; // height
el19tb 35:db257b7bdefc 28
el19tb 35:db257b7bdefc 29 // grid values
el19tb 35:db257b7bdefc 30 grid = 4; // size of game grid system
el19tb 35:db257b7bdefc 31 grid_width = 22; // size of screen width in grid units
el19tb 35:db257b7bdefc 32 }
el19tb 35:db257b7bdefc 33
el19tb 37:65c9e5a65738 34 void Frogger::initializeLevelTwo()
el19tb 37:65c9e5a65738 35 {
el19tb 37:65c9e5a65738 36 level->setupLevelTwo();
el19tb 37:65c9e5a65738 37 }
el19tb 37:65c9e5a65738 38
el19tb 35:db257b7bdefc 39 void Frogger::initializeEmbeddedSystem()
el19tb 35:db257b7bdefc 40 {
el19tb 35:db257b7bdefc 41 //game setup
el19tb 35:db257b7bdefc 42 graphics.init(); // initialize the LCD object
el19tb 35:db257b7bdefc 43 graphics.contrast(); // set the contrast to 0.4
el19tb 35:db257b7bdefc 44 graphics.backLightOn(); // turn on the backlight
el19tb 35:db257b7bdefc 45 gamepad.init(); // initialize the actual game pad
el19tb 35:db257b7bdefc 46 }
el19tb 35:db257b7bdefc 47
el19tb 37:65c9e5a65738 48 void Frogger::runCurrentLevel()
el19tb 37:65c9e5a65738 49 {
el19tb 37:65c9e5a65738 50 switch (current_level)
el19tb 37:65c9e5a65738 51 {
el19tb 37:65c9e5a65738 52 case 1:
el19tb 37:65c9e5a65738 53 level->levelOne();
el19tb 37:65c9e5a65738 54 break;
el19tb 37:65c9e5a65738 55 case 2:
el19tb 37:65c9e5a65738 56 level->levelTwo();
el19tb 37:65c9e5a65738 57 break;
el19tb 37:65c9e5a65738 58 }
el19tb 37:65c9e5a65738 59 }
el19tb 37:65c9e5a65738 60
el19tb 35:db257b7bdefc 61 //main function that starts the game
el19tb 37:65c9e5a65738 62 void Frogger::start()
el19tb 37:65c9e5a65738 63 {
el19tb 35:db257b7bdefc 64 //keep reading and processing user input
el19tb 35:db257b7bdefc 65 while(1) {
el19tb 37:65c9e5a65738 66 graphics.clear(); // clear the lcd screen
el19tb 41:6267c66953ca 67 runCurrentLevel(); // add velocity to level vehicles and logs
el19tb 35:db257b7bdefc 68
el19tb 41:6267c66953ca 69 graphics.showFrog(); // display current position of frog
el19tb 41:6267c66953ca 70 process_input(); // user controls the frog object
el19tb 35:db257b7bdefc 71
el19tb 41:6267c66953ca 72 checkCurrentLevelCollision(); // check if the frog is alive
el19tb 41:6267c66953ca 73 checkFrogInWater(); // check if the frog is in the water level
el19tb 41:6267c66953ca 74
el19tb 41:6267c66953ca 75 graphics.refresh(); // refresh the lcd screen
el19tb 37:65c9e5a65738 76
el19tb 41:6267c66953ca 77 wait_ms(70); // fpms
el19tb 35:db257b7bdefc 78 }
el19tb 35:db257b7bdefc 79 }
el19tb 35:db257b7bdefc 80
el19tb 41:6267c66953ca 81 void Frogger::checkCurrentLevelCollision()
el19tb 41:6267c66953ca 82 {
el19tb 41:6267c66953ca 83 switch (current_level)
el19tb 41:6267c66953ca 84 {
el19tb 41:6267c66953ca 85 case 1:
el19tb 41:6267c66953ca 86 level->levelOneCollision();
el19tb 41:6267c66953ca 87 break;
el19tb 41:6267c66953ca 88 case 2:
el19tb 41:6267c66953ca 89 level->levelTwoCollision();
el19tb 41:6267c66953ca 90 break;
el19tb 41:6267c66953ca 91 }
el19tb 41:6267c66953ca 92 }
el19tb 41:6267c66953ca 93
el19tb 41:6267c66953ca 94 void Frogger::checkIfFrogIsInWater()
el19tb 37:65c9e5a65738 95 {
el19tb 37:65c9e5a65738 96 if(chicken.y < screenH - grid*6){
el19tb 37:65c9e5a65738 97 frogDie = true; // frog can die if it is in water
el19tb 37:65c9e5a65738 98
el19tb 37:65c9e5a65738 99 //if it is not in a log
el19tb 37:65c9e5a65738 100 for(int x = 0; x < 2; x++){
el19tb 37:65c9e5a65738 101
el19tb 37:65c9e5a65738 102 if(attach){
el19tb 37:65c9e5a65738 103
el19tb 37:65c9e5a65738 104
el19tb 37:65c9e5a65738 105 }
el19tb 37:65c9e5a65738 106 }
el19tb 37:65c9e5a65738 107
el19tb 37:65c9e5a65738 108 if(!attach){
el19tb 37:65c9e5a65738 109 graphics.print();
el19tb 37:65c9e5a65738 110 }
el19tb 37:65c9e5a65738 111 }
el19tb 37:65c9e5a65738 112 }
el19tb 37:65c9e5a65738 113
el19tb 35:db257b7bdefc 114 // log intersects then frog.x = log[i].speed
el19tb 35:db257b7bdefc 115 // frog is attached function
el19tb 35:db257b7bdefc 116 // detach the frog when user goes up or down
el19tb 35:db257b7bdefc 117 // if the frog is back to the safe zone detatch also
el19tb 35:db257b7bdefc 118 // whenever the frog moves detach
el19tb 35:db257b7bdefc 119 //A moves right
el19tb 35:db257b7bdefc 120 //X moves upward
el19tb 35:db257b7bdefc 121 //B moves downward
el19tb 35:db257b7bdefc 122 //Y moves left
el19tb 37:65c9e5a65738 123 void Frogger::process_input() {
el19tb 35:db257b7bdefc 124 //determine the input
el19tb 35:db257b7bdefc 125 /* make this a switch statement */
el19tb 35:db257b7bdefc 126 if(gamepad.A_pressed()){
el19tb 35:db257b7bdefc 127 moveChicken(1,0);
el19tb 41:6267c66953ca 128 level->frogOnLog = false;
el19tb 35:db257b7bdefc 129 } else if(gamepad.X_pressed()){
el19tb 35:db257b7bdefc 130 moveChicken(0,-1);
el19tb 41:6267c66953ca 131 level->frogOnLog = false;
el19tb 35:db257b7bdefc 132 } else if(gamepad.B_pressed()){
el19tb 35:db257b7bdefc 133 moveChicken(0,1);
el19tb 41:6267c66953ca 134 level->frogOnLog = false;
el19tb 35:db257b7bdefc 135 } else if(gamepad.Y_pressed()){
el19tb 35:db257b7bdefc 136 moveChicken(-1,0);
el19tb 41:6267c66953ca 137 level->frogOnLog = false;
el19tb 35:db257b7bdefc 138 }
el19tb 35:db257b7bdefc 139 }
el19tb 35:db257b7bdefc 140
el19tb 37:65c9e5a65738 141 void Frogger::createMultipleSafetyLane()
el19tb 35:db257b7bdefc 142 {
el19tb 35:db257b7bdefc 143 int min = 0; // start from the top, and draw till 0
el19tb 35:db257b7bdefc 144 int max = grid_width; // draw 21 objects to the first lane
el19tb 35:db257b7bdefc 145 int row = 1;
el19tb 35:db257b7bdefc 146 int x_fac = 1;
el19tb 35:db257b7bdefc 147
el19tb 35:db257b7bdefc 148 for(int x = 0; x < 2; x++){
el19tb 35:db257b7bdefc 149 creatSafetyObject(min, max, row, x_fac);
el19tb 35:db257b7bdefc 150 row += 6; // increment the rows to the next lane
el19tb 35:db257b7bdefc 151 min += 22; // fill in the vector with 22 grid units
el19tb 35:db257b7bdefc 152 max += 22;
el19tb 35:db257b7bdefc 153 }
el19tb 35:db257b7bdefc 154 }
el19tb 35:db257b7bdefc 155
el19tb 37:65c9e5a65738 156 void Frogger::createSafetyObject(int min, int max, int row, int x_fac)
el19tb 35:db257b7bdefc 157 {
el19tb 35:db257b7bdefc 158 int state = 1;
el19tb 35:db257b7bdefc 159
el19tb 35:db257b7bdefc 160 for(int z = 0; z < 22; z++){
el19tb 35:db257b7bdefc 161 switch(state)
el19tb 35:db257b7bdefc 162 {
el19tb 35:db257b7bdefc 163 case 1:
el19tb 35:db257b7bdefc 164 safety_lane.push_back(z/x_fac, row, 'K'); // safety lane so row 0
el19tb 35:db257b7bdefc 165 state++;
el19tb 35:db257b7bdefc 166 break;
el19tb 35:db257b7bdefc 167 case 2:
el19tb 35:db257b7bdefc 168 safety_lane.push_back(z/x_fac, row, 'P'); // safety lane so row 0
el19tb 35:db257b7bdefc 169 state--; // back to inital state
el19tb 35:db257b7bdefc 170 break;
el19tb 35:db257b7bdefc 171 }
el19tb 35:db257b7bdefc 172 }
el19tb 35:db257b7bdefc 173 }
el19tb 35:db257b7bdefc 174
el19tb 37:65c9e5a65738 175 void Frogger::drawSafety()
el19tb 35:db257b7bdefc 176 {
el19tb 35:db257b7bdefc 177 graphics.drawSafetyLanes(safety_lane);
el19tb 35:db257b7bdefc 178 }
el19tb 35:db257b7bdefc 179
el19tb 35:db257b7bdefc 180
el19tb 37:65c9e5a65738 181 void Frogger::createMultipleRoadLane()
el19tb 35:db257b7bdefc 182 {
el19tb 35:db257b7bdefc 183 int min = 0; // start from the top, and draw till 0
el19tb 35:db257b7bdefc 184 int max = grid_width; // draw 21 objects to the first lane
el19tb 35:db257b7bdefc 185 int row = 1;
el19tb 35:db257b7bdefc 186
el19tb 35:db257b7bdefc 187 for(int x = 0; x < 4; x++){
el19tb 35:db257b7bdefc 188 createRoadLane(min, max, row);
el19tb 35:db257b7bdefc 189 row++; // increment the rows to the next lane
el19tb 35:db257b7bdefc 190 min += 22; // fill in the vector with 22 grid units
el19tb 35:db257b7bdefc 191 max += 22;
el19tb 35:db257b7bdefc 192 }
el19tb 35:db257b7bdefc 193 }
el19tb 35:db257b7bdefc 194
el19tb 35:db257b7bdefc 195 // every level is going to have the same amount of blocks
el19tb 37:65c9e5a65738 196 void Frogger::createRoadLane(int min, int max, int row)
el19tb 35:db257b7bdefc 197 {
el19tb 35:db257b7bdefc 198 std::vector<Background>::size_type it;
el19tb 35:db257b7bdefc 199
el19tb 35:db257b7bdefc 200 // fill the road objects
el19tb 35:db257b7bdefc 201 for(int it = min; it != max; it++){
el19tb 35:db257b7bdefc 202 roads.push_back(it/row, row); // it is the x pos of the obj, row is the y pos
el19tb 35:db257b7bdefc 203 }
el19tb 35:db257b7bdefc 204 }
el19tb 35:db257b7bdefc 205
el19tb 37:65c9e5a65738 206 void Frogger::drawRoadObjects()
el19tb 35:db257b7bdefc 207 {
el19tb 35:db257b7bdefc 208 graphics.getRoadObjects(roads);
el19tb 35:db257b7bdefc 209 }
el19tb 35:db257b7bdefc 210
el19tb 37:65c9e5a65738 211 void Frogger::createMultipleLanesWater()
el19tb 35:db257b7bdefc 212 {
el19tb 35:db257b7bdefc 213 int min = 0; // start from the top, and draw till 0
el19tb 35:db257b7bdefc 214 int max = grid_width; // draw 21 objects to the first lane
el19tb 35:db257b7bdefc 215 int row = 7;
el19tb 35:db257b7bdefc 216 int x_fac = 1;
el19tb 35:db257b7bdefc 217
el19tb 35:db257b7bdefc 218 for(int x = 0; x < 3; x++){
el19tb 35:db257b7bdefc 219 if(x == 1){
el19tb 35:db257b7bdefc 220 createWaterLane(min, max, row, -0.6); // second row goes left
el19tb 35:db257b7bdefc 221 } else {
el19tb 35:db257b7bdefc 222 createWaterLane(min, max, row, 0.4); // rest of the rows go right
el19tb 35:db257b7bdefc 223 }
el19tb 35:db257b7bdefc 224
el19tb 35:db257b7bdefc 225 row++; // increment the rows to the next lane
el19tb 35:db257b7bdefc 226 min += grid_width; // fill in the vector with 22 grid units
el19tb 35:db257b7bdefc 227 max += grid_width;
el19tb 35:db257b7bdefc 228 }
el19tb 35:db257b7bdefc 229 }
el19tb 35:db257b7bdefc 230
el19tb 37:65c9e5a65738 231 void Frogger::createWaterLane(int min, int max, int row, float speed, int x_fac){
el19tb 35:db257b7bdefc 232 int state = 1;
el19tb 35:db257b7bdefc 233 for(it = min; it < max; it++)
el19tb 35:db257b7bdefc 234 {
el19tb 35:db257b7bdefc 235 switch(state)
el19tb 35:db257b7bdefc 236 {
el19tb 35:db257b7bdefc 237 case 1: // initial state
el19tb 35:db257b7bdefc 238 water[it].push_back(it/x_fac, row, speed, 'F'); // first type of water
el19tb 35:db257b7bdefc 239 state++; // transition to next state
el19tb 35:db257b7bdefc 240 break;
el19tb 35:db257b7bdefc 241 case 2:
el19tb 35:db257b7bdefc 242 water[it].push_back(it/x_fac, row, speed, 'S'); // first type of water
el19tb 35:db257b7bdefc 243 state++; // transition to state 3
el19tb 35:db257b7bdefc 244 break;
el19tb 35:db257b7bdefc 245 case 3:
el19tb 35:db257b7bdefc 246 water[it].push_back(it/x_fac, row, speed, 'T'); // first type of water
el19tb 35:db257b7bdefc 247 state = 1; // back to start state
el19tb 35:db257b7bdefc 248 break;
el19tb 35:db257b7bdefc 249 }
el19tb 35:db257b7bdefc 250 }
el19tb 35:db257b7bdefc 251 }
el19tb 35:db257b7bdefc 252
el19tb 35:db257b7bdefc 253 // moves the water based on the velocity
el19tb 37:65c9e5a65738 254 void Frogger::moveWater(std::vector<Water>& water_lanes)
el19tb 35:db257b7bdefc 255 {
el19tb 35:db257b7bdefc 256 for(unsigned int i = 0; i < water_lanes.size(); i++)
el19tb 35:db257b7bdefc 257 {
el19tb 35:db257b7bdefc 258 if(water_lanes(i).speed > 0){
el19tb 35:db257b7bdefc 259 water_lanes(i).x += speed;
el19tb 35:db257b7bdefc 260 } else {
el19tb 35:db257b7bdefc 261 water_lanes(i).x -= speed;
el19tb 35:db257b7bdefc 262 }
el19tb 35:db257b7bdefc 263 }
el19tb 35:db257b7bdefc 264
el19tb 35:db257b7bdefc 265 loopWater(water_lanes);
el19tb 35:db257b7bdefc 266 }
el19tb 35:db257b7bdefc 267
el19tb 35:db257b7bdefc 268
el19tb 37:65c9e5a65738 269 void Frogger::loopWater(std::vector<Water>& water_lanes)
el19tb 35:db257b7bdefc 270 {
el19tb 35:db257b7bdefc 271 for(unsigned int i = 0; i < water_lanes.size(); i++)
el19tb 35:db257b7bdefc 272 {
el19tb 35:db257b7bdefc 273 if(water_lanes(i).x > 84+grid){
el19tb 35:db257b7bdefc 274 water_lanes(i).x = -4;
el19tb 35:db257b7bdefc 275 } else if(water_lanes[i].x < -4){
el19tb 35:db257b7bdefc 276 water_lanes(i).x = 84 + grid;
el19tb 35:db257b7bdefc 277 }
el19tb 35:db257b7bdefc 278 }
el19tb 35:db257b7bdefc 279 }
el19tb 35:db257b7bdefc 280
el19tb 37:65c9e5a65738 281 void Frogger::drawWater()
el19tb 35:db257b7bdefc 282 {
el19tb 35:db257b7bdefc 283 graphics.drawWater(water);
el19tb 35:db257b7bdefc 284 }
el19tb 35:db257b7bdefc 285
el19tb 37:65c9e5a65738 286 void Frogger::drawEndPost()
el19tb 35:db257b7bdefc 287 {
el19tb 35:db257b7bdefc 288 graphics.drawGoal(84/2)-grid/2, 48-grid*11);
el19tb 35:db257b7bdefc 289 }
el19tb 35:db257b7bdefc 290
el19tb 35:db257b7bdefc 291 // make the frog move same speed as log
el19tb 35:db257b7bdefc 292 // if the frog moves then detach
el19tb 37:65c9e5a65738 293 void Frogger::frogOnLog(Car *log) {
el19tb 35:db257b7bdefc 294 if(log->seperation != 0){
el19tb 35:db257b7bdefc 295 chicken.x += 1.0;
el19tb 35:db257b7bdefc 296 }
el19tb 35:db257b7bdefc 297 }
el19tb 35:db257b7bdefc 298
el19tb 35:db257b7bdefc 299 //moves the chicken around the grid
el19tb 37:65c9e5a65738 300 void Frogger::moveChicken(int xWay, int yWay){
el19tb 35:db257b7bdefc 301 //increment the left side of the chicken by a value of the grid size
el19tb 35:db257b7bdefc 302 chicken.x += xWay * 4;
el19tb 35:db257b7bdefc 303
el19tb 35:db257b7bdefc 304 //increment the top side by a value of grid sizw
el19tb 35:db257b7bdefc 305 chicken.y += yWay * 4;
el19tb 35:db257b7bdefc 306
el19tb 35:db257b7bdefc 307 chicken.left_side = chicken.x;
el19tb 35:db257b7bdefc 308 chicken.right_side = grid + chicken.x;
el19tb 35:db257b7bdefc 309 chicken.up = chicken.y;
el19tb 35:db257b7bdefc 310 chicken.down = grid + chicken.y;
el19tb 41:6267c66953ca 311
el19tb 35:db257b7bdefc 312 }
el19tb 35:db257b7bdefc 313
el19tb 37:65c9e5a65738 314 void Frogger::moveCar(Car *car, int dir, int x) {
el19tb 35:db257b7bdefc 315 car->speedMedium(dir, x);
el19tb 35:db257b7bdefc 316
el19tb 35:db257b7bdefc 317 // check if car goes out of bounds
el19tb 35:db257b7bdefc 318 if(car->vehicle.x > 84+grid){
el19tb 35:db257b7bdefc 319 car->vehicle.x = -4;
el19tb 35:db257b7bdefc 320
el19tb 35:db257b7bdefc 321 } else if(car->vehicle.x < -4){
el19tb 35:db257b7bdefc 322 car->vehicle.x = 84 + grid;
el19tb 35:db257b7bdefc 323 }
el19tb 35:db257b7bdefc 324 }
el19tb 35:db257b7bdefc 325
el19tb 35:db257b7bdefc 326 // debug
el19tb 37:65c9e5a65738 327 void Frogger::setCollision(Car *car){
el19tb 35:db257b7bdefc 328
el19tb 35:db257b7bdefc 329 float other_bottom = car->vehicle.height + car->vehicle.y;
el19tb 41:6267c66953ca 330
el19tb 35:db257b7bdefc 331 if(!(chicken.up >= other_bottom ||
el19tb 35:db257b7bdefc 332 (chicken.right_side <= car->vehicle.x) ||
el19tb 35:db257b7bdefc 333 (chicken.down <= car->vehicle.y) ||
el19tb 35:db257b7bdefc 334 chicken.left_side >= (car->vehicle.width + car->vehicle.x))){
el19tb 35:db257b7bdefc 335 graphics.printTest();
el19tb 35:db257b7bdefc 336
el19tb 35:db257b7bdefc 337 if(chicken.y < screenH - grid*6){
el19tb 35:db257b7bdefc 338 attach = true;
el19tb 35:db257b7bdefc 339 } else {
el19tb 35:db257b7bdefc 340 attach = false;
el19tb 35:db257b7bdefc 341 }
el19tb 35:db257b7bdefc 342 }
el19tb 35:db257b7bdefc 343 }
el19tb 35:db257b7bdefc 344
el19tb 37:65c9e5a65738 345 bool Frogger::returnCollision(Car* log){
el19tb 35:db257b7bdefc 346
el19tb 35:db257b7bdefc 347 float ob = log->vehicle.height + log->vehicle.y;
el19tb 35:db257b7bdefc 348
el19tb 35:db257b7bdefc 349 if(!(chicken.up >= ob||
el19tb 35:db257b7bdefc 350 (chicken.right_side <= log->vehicle.x) ||
el19tb 35:db257b7bdefc 351 (chicken.down <= log->vehicle.y) ||
el19tb 35:db257b7bdefc 352 chicken.left_side >= (log->vehicle.width + log->vehicle.x))){
el19tb 35:db257b7bdefc 353 return true;
el19tb 35:db257b7bdefc 354 }
el19tb 35:db257b7bdefc 355 }