ELEC2645 (2019/20) / Mbed 2 deprecated ELEC2645_Project_el19tb

Dependencies:   mbed

Committer:
el19tb
Date:
Sun May 17 23:20:23 2020 +0000
Revision:
37:65c9e5a65738
Parent:
35:db257b7bdefc
Child:
41:6267c66953ca
fadded global variables, changed construction of the engine, made the engine more structure

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 37:65c9e5a65738 67 runCurrentLevel();
el19tb 35:db257b7bdefc 68
el19tb 35:db257b7bdefc 69 graphics.showChicken();
el19tb 37:65c9e5a65738 70 process_input(); // user controls the frog object
el19tb 35:db257b7bdefc 71
el19tb 35:db257b7bdefc 72 // now when the chicken is above the safety
el19tb 35:db257b7bdefc 73 // lane we need to ensure that it only can go on logs
el19tb 37:65c9e5a65738 74
el19tb 35:db257b7bdefc 75
el19tb 35:db257b7bdefc 76 graphics.refresh();
el19tb 35:db257b7bdefc 77 wait_ms(70);
el19tb 35:db257b7bdefc 78 }
el19tb 35:db257b7bdefc 79 }
el19tb 35:db257b7bdefc 80
el19tb 37:65c9e5a65738 81 void checkIfFrogIsInWater()
el19tb 37:65c9e5a65738 82 {
el19tb 37:65c9e5a65738 83 if(chicken.y < screenH - grid*6){
el19tb 37:65c9e5a65738 84 frogDie = true; // frog can die if it is in water
el19tb 37:65c9e5a65738 85
el19tb 37:65c9e5a65738 86 //if it is not in a log
el19tb 37:65c9e5a65738 87 for(int x = 0; x < 2; x++){
el19tb 37:65c9e5a65738 88
el19tb 37:65c9e5a65738 89 if(attach){
el19tb 37:65c9e5a65738 90
el19tb 37:65c9e5a65738 91
el19tb 37:65c9e5a65738 92 }
el19tb 37:65c9e5a65738 93 }
el19tb 37:65c9e5a65738 94
el19tb 37:65c9e5a65738 95 if(!attach){
el19tb 37:65c9e5a65738 96 graphics.print();
el19tb 37:65c9e5a65738 97 }
el19tb 37:65c9e5a65738 98 }
el19tb 37:65c9e5a65738 99 }
el19tb 37:65c9e5a65738 100
el19tb 35:db257b7bdefc 101 // log intersects then frog.x = log[i].speed
el19tb 35:db257b7bdefc 102 // frog is attached function
el19tb 35:db257b7bdefc 103 // detach the frog when user goes up or down
el19tb 35:db257b7bdefc 104 // if the frog is back to the safe zone detatch also
el19tb 35:db257b7bdefc 105 // whenever the frog moves detach
el19tb 35:db257b7bdefc 106 //A moves right
el19tb 35:db257b7bdefc 107 //X moves upward
el19tb 35:db257b7bdefc 108 //B moves downward
el19tb 35:db257b7bdefc 109 //Y moves left
el19tb 37:65c9e5a65738 110 void Frogger::process_input() {
el19tb 35:db257b7bdefc 111 //determine the input
el19tb 35:db257b7bdefc 112 /* make this a switch statement */
el19tb 35:db257b7bdefc 113 if(gamepad.A_pressed()){
el19tb 35:db257b7bdefc 114 moveChicken(1,0);
el19tb 35:db257b7bdefc 115 attach = false;
el19tb 35:db257b7bdefc 116 } else if(gamepad.X_pressed()){
el19tb 35:db257b7bdefc 117 moveChicken(0,-1);
el19tb 35:db257b7bdefc 118 attach = false;
el19tb 35:db257b7bdefc 119 } else if(gamepad.B_pressed()){
el19tb 35:db257b7bdefc 120 moveChicken(0,1);
el19tb 35:db257b7bdefc 121 attach = false;
el19tb 35:db257b7bdefc 122 } else if(gamepad.Y_pressed()){
el19tb 35:db257b7bdefc 123 moveChicken(-1,0);
el19tb 35:db257b7bdefc 124 attach = false;
el19tb 35:db257b7bdefc 125 }
el19tb 35:db257b7bdefc 126 }
el19tb 35:db257b7bdefc 127
el19tb 37:65c9e5a65738 128 void Frogger::createMultipleSafetyLane()
el19tb 35:db257b7bdefc 129 {
el19tb 35:db257b7bdefc 130 int min = 0; // start from the top, and draw till 0
el19tb 35:db257b7bdefc 131 int max = grid_width; // draw 21 objects to the first lane
el19tb 35:db257b7bdefc 132 int row = 1;
el19tb 35:db257b7bdefc 133 int x_fac = 1;
el19tb 35:db257b7bdefc 134
el19tb 35:db257b7bdefc 135 for(int x = 0; x < 2; x++){
el19tb 35:db257b7bdefc 136 creatSafetyObject(min, max, row, x_fac);
el19tb 35:db257b7bdefc 137 row += 6; // increment the rows to the next lane
el19tb 35:db257b7bdefc 138 min += 22; // fill in the vector with 22 grid units
el19tb 35:db257b7bdefc 139 max += 22;
el19tb 35:db257b7bdefc 140 }
el19tb 35:db257b7bdefc 141 }
el19tb 35:db257b7bdefc 142
el19tb 37:65c9e5a65738 143 void Frogger::createSafetyObject(int min, int max, int row, int x_fac)
el19tb 35:db257b7bdefc 144 {
el19tb 35:db257b7bdefc 145 int state = 1;
el19tb 35:db257b7bdefc 146
el19tb 35:db257b7bdefc 147 for(int z = 0; z < 22; z++){
el19tb 35:db257b7bdefc 148 switch(state)
el19tb 35:db257b7bdefc 149 {
el19tb 35:db257b7bdefc 150 case 1:
el19tb 35:db257b7bdefc 151 safety_lane.push_back(z/x_fac, row, 'K'); // safety lane so row 0
el19tb 35:db257b7bdefc 152 state++;
el19tb 35:db257b7bdefc 153 break;
el19tb 35:db257b7bdefc 154 case 2:
el19tb 35:db257b7bdefc 155 safety_lane.push_back(z/x_fac, row, 'P'); // safety lane so row 0
el19tb 35:db257b7bdefc 156 state--; // back to inital state
el19tb 35:db257b7bdefc 157 break;
el19tb 35:db257b7bdefc 158 }
el19tb 35:db257b7bdefc 159 }
el19tb 35:db257b7bdefc 160 }
el19tb 35:db257b7bdefc 161
el19tb 37:65c9e5a65738 162 void Frogger::drawSafety()
el19tb 35:db257b7bdefc 163 {
el19tb 35:db257b7bdefc 164 graphics.drawSafetyLanes(safety_lane);
el19tb 35:db257b7bdefc 165 }
el19tb 35:db257b7bdefc 166
el19tb 35:db257b7bdefc 167
el19tb 37:65c9e5a65738 168 void Frogger::createMultipleRoadLane()
el19tb 35:db257b7bdefc 169 {
el19tb 35:db257b7bdefc 170 int min = 0; // start from the top, and draw till 0
el19tb 35:db257b7bdefc 171 int max = grid_width; // draw 21 objects to the first lane
el19tb 35:db257b7bdefc 172 int row = 1;
el19tb 35:db257b7bdefc 173
el19tb 35:db257b7bdefc 174 for(int x = 0; x < 4; x++){
el19tb 35:db257b7bdefc 175 createRoadLane(min, max, row);
el19tb 35:db257b7bdefc 176 row++; // increment the rows to the next lane
el19tb 35:db257b7bdefc 177 min += 22; // fill in the vector with 22 grid units
el19tb 35:db257b7bdefc 178 max += 22;
el19tb 35:db257b7bdefc 179 }
el19tb 35:db257b7bdefc 180 }
el19tb 35:db257b7bdefc 181
el19tb 35:db257b7bdefc 182 // every level is going to have the same amount of blocks
el19tb 37:65c9e5a65738 183 void Frogger::createRoadLane(int min, int max, int row)
el19tb 35:db257b7bdefc 184 {
el19tb 35:db257b7bdefc 185 std::vector<Background>::size_type it;
el19tb 35:db257b7bdefc 186
el19tb 35:db257b7bdefc 187 // fill the road objects
el19tb 35:db257b7bdefc 188 for(int it = min; it != max; it++){
el19tb 35:db257b7bdefc 189 roads.push_back(it/row, row); // it is the x pos of the obj, row is the y pos
el19tb 35:db257b7bdefc 190 }
el19tb 35:db257b7bdefc 191 }
el19tb 35:db257b7bdefc 192
el19tb 37:65c9e5a65738 193 void Frogger::drawRoadObjects()
el19tb 35:db257b7bdefc 194 {
el19tb 35:db257b7bdefc 195 graphics.getRoadObjects(roads);
el19tb 35:db257b7bdefc 196 }
el19tb 35:db257b7bdefc 197
el19tb 37:65c9e5a65738 198 void Frogger::createMultipleLanesWater()
el19tb 35:db257b7bdefc 199 {
el19tb 35:db257b7bdefc 200 int min = 0; // start from the top, and draw till 0
el19tb 35:db257b7bdefc 201 int max = grid_width; // draw 21 objects to the first lane
el19tb 35:db257b7bdefc 202 int row = 7;
el19tb 35:db257b7bdefc 203 int x_fac = 1;
el19tb 35:db257b7bdefc 204
el19tb 35:db257b7bdefc 205 for(int x = 0; x < 3; x++){
el19tb 35:db257b7bdefc 206 if(x == 1){
el19tb 35:db257b7bdefc 207 createWaterLane(min, max, row, -0.6); // second row goes left
el19tb 35:db257b7bdefc 208 } else {
el19tb 35:db257b7bdefc 209 createWaterLane(min, max, row, 0.4); // rest of the rows go right
el19tb 35:db257b7bdefc 210 }
el19tb 35:db257b7bdefc 211
el19tb 35:db257b7bdefc 212 row++; // increment the rows to the next lane
el19tb 35:db257b7bdefc 213 min += grid_width; // fill in the vector with 22 grid units
el19tb 35:db257b7bdefc 214 max += grid_width;
el19tb 35:db257b7bdefc 215 }
el19tb 35:db257b7bdefc 216 }
el19tb 35:db257b7bdefc 217
el19tb 37:65c9e5a65738 218 void Frogger::createWaterLane(int min, int max, int row, float speed, int x_fac){
el19tb 35:db257b7bdefc 219 int state = 1;
el19tb 35:db257b7bdefc 220 for(it = min; it < max; it++)
el19tb 35:db257b7bdefc 221 {
el19tb 35:db257b7bdefc 222 switch(state)
el19tb 35:db257b7bdefc 223 {
el19tb 35:db257b7bdefc 224 case 1: // initial state
el19tb 35:db257b7bdefc 225 water[it].push_back(it/x_fac, row, speed, 'F'); // first type of water
el19tb 35:db257b7bdefc 226 state++; // transition to next state
el19tb 35:db257b7bdefc 227 break;
el19tb 35:db257b7bdefc 228 case 2:
el19tb 35:db257b7bdefc 229 water[it].push_back(it/x_fac, row, speed, 'S'); // first type of water
el19tb 35:db257b7bdefc 230 state++; // transition to state 3
el19tb 35:db257b7bdefc 231 break;
el19tb 35:db257b7bdefc 232 case 3:
el19tb 35:db257b7bdefc 233 water[it].push_back(it/x_fac, row, speed, 'T'); // first type of water
el19tb 35:db257b7bdefc 234 state = 1; // back to start state
el19tb 35:db257b7bdefc 235 break;
el19tb 35:db257b7bdefc 236 }
el19tb 35:db257b7bdefc 237 }
el19tb 35:db257b7bdefc 238 }
el19tb 35:db257b7bdefc 239
el19tb 35:db257b7bdefc 240 // moves the water based on the velocity
el19tb 37:65c9e5a65738 241 void Frogger::moveWater(std::vector<Water>& water_lanes)
el19tb 35:db257b7bdefc 242 {
el19tb 35:db257b7bdefc 243 for(unsigned int i = 0; i < water_lanes.size(); i++)
el19tb 35:db257b7bdefc 244 {
el19tb 35:db257b7bdefc 245 if(water_lanes(i).speed > 0){
el19tb 35:db257b7bdefc 246 water_lanes(i).x += speed;
el19tb 35:db257b7bdefc 247 } else {
el19tb 35:db257b7bdefc 248 water_lanes(i).x -= speed;
el19tb 35:db257b7bdefc 249 }
el19tb 35:db257b7bdefc 250 }
el19tb 35:db257b7bdefc 251
el19tb 35:db257b7bdefc 252 loopWater(water_lanes);
el19tb 35:db257b7bdefc 253 }
el19tb 35:db257b7bdefc 254
el19tb 35:db257b7bdefc 255
el19tb 37:65c9e5a65738 256 void Frogger::loopWater(std::vector<Water>& water_lanes)
el19tb 35:db257b7bdefc 257 {
el19tb 35:db257b7bdefc 258 for(unsigned int i = 0; i < water_lanes.size(); i++)
el19tb 35:db257b7bdefc 259 {
el19tb 35:db257b7bdefc 260 if(water_lanes(i).x > 84+grid){
el19tb 35:db257b7bdefc 261 water_lanes(i).x = -4;
el19tb 35:db257b7bdefc 262 } else if(water_lanes[i].x < -4){
el19tb 35:db257b7bdefc 263 water_lanes(i).x = 84 + grid;
el19tb 35:db257b7bdefc 264 }
el19tb 35:db257b7bdefc 265 }
el19tb 35:db257b7bdefc 266 }
el19tb 35:db257b7bdefc 267
el19tb 37:65c9e5a65738 268 void Frogger::drawWater()
el19tb 35:db257b7bdefc 269 {
el19tb 35:db257b7bdefc 270 graphics.drawWater(water);
el19tb 35:db257b7bdefc 271 }
el19tb 35:db257b7bdefc 272
el19tb 37:65c9e5a65738 273 void Frogger::drawEndPost()
el19tb 35:db257b7bdefc 274 {
el19tb 35:db257b7bdefc 275 graphics.drawGoal(84/2)-grid/2, 48-grid*11);
el19tb 35:db257b7bdefc 276 }
el19tb 35:db257b7bdefc 277
el19tb 35:db257b7bdefc 278 // make the frog move same speed as log
el19tb 35:db257b7bdefc 279 // if the frog moves then detach
el19tb 37:65c9e5a65738 280 void Frogger::frogOnLog(Car *log) {
el19tb 35:db257b7bdefc 281 if(log->seperation != 0){
el19tb 35:db257b7bdefc 282 chicken.x += 1.0;
el19tb 35:db257b7bdefc 283 }
el19tb 35:db257b7bdefc 284 }
el19tb 35:db257b7bdefc 285
el19tb 35:db257b7bdefc 286 //moves the chicken around the grid
el19tb 37:65c9e5a65738 287 void Frogger::moveChicken(int xWay, int yWay){
el19tb 35:db257b7bdefc 288 //increment the left side of the chicken by a value of the grid size
el19tb 35:db257b7bdefc 289 chicken.x += xWay * 4;
el19tb 35:db257b7bdefc 290
el19tb 35:db257b7bdefc 291 //increment the top side by a value of grid sizw
el19tb 35:db257b7bdefc 292 chicken.y += yWay * 4;
el19tb 35:db257b7bdefc 293
el19tb 35:db257b7bdefc 294 chicken.left_side = chicken.x;
el19tb 35:db257b7bdefc 295 chicken.right_side = grid + chicken.x;
el19tb 35:db257b7bdefc 296 chicken.up = chicken.y;
el19tb 35:db257b7bdefc 297 chicken.down = grid + chicken.y;
el19tb 35:db257b7bdefc 298
el19tb 35:db257b7bdefc 299 //display the new state of the chicken
el19tb 35:db257b7bdefc 300 //graphics.showChicken();
el19tb 35:db257b7bdefc 301
el19tb 35:db257b7bdefc 302 //wait_ms(30);
el19tb 35:db257b7bdefc 303 }
el19tb 35:db257b7bdefc 304
el19tb 37:65c9e5a65738 305 void Frogger::moveCar(Car *car, int dir, int x) {
el19tb 35:db257b7bdefc 306 car->speedMedium(dir, x);
el19tb 35:db257b7bdefc 307
el19tb 35:db257b7bdefc 308 // check if car goes out of bounds
el19tb 35:db257b7bdefc 309 if(car->vehicle.x > 84+grid){
el19tb 35:db257b7bdefc 310 car->vehicle.x = -4;
el19tb 35:db257b7bdefc 311
el19tb 35:db257b7bdefc 312 } else if(car->vehicle.x < -4){
el19tb 35:db257b7bdefc 313 car->vehicle.x = 84 + grid;
el19tb 35:db257b7bdefc 314 }
el19tb 35:db257b7bdefc 315 }
el19tb 35:db257b7bdefc 316
el19tb 35:db257b7bdefc 317 // debug
el19tb 37:65c9e5a65738 318 void Frogger::setCollision(Car *car){
el19tb 35:db257b7bdefc 319
el19tb 35:db257b7bdefc 320 float other_bottom = car->vehicle.height + car->vehicle.y;
el19tb 35:db257b7bdefc 321
el19tb 35:db257b7bdefc 322
el19tb 35:db257b7bdefc 323 if(!(chicken.up >= other_bottom ||
el19tb 35:db257b7bdefc 324 (chicken.right_side <= car->vehicle.x) ||
el19tb 35:db257b7bdefc 325 (chicken.down <= car->vehicle.y) ||
el19tb 35:db257b7bdefc 326 chicken.left_side >= (car->vehicle.width + car->vehicle.x))){
el19tb 35:db257b7bdefc 327 graphics.printTest();
el19tb 35:db257b7bdefc 328
el19tb 35:db257b7bdefc 329 if(chicken.y < screenH - grid*6){
el19tb 35:db257b7bdefc 330 attach = true;
el19tb 35:db257b7bdefc 331 } else {
el19tb 35:db257b7bdefc 332 attach = false;
el19tb 35:db257b7bdefc 333 }
el19tb 35:db257b7bdefc 334 }
el19tb 35:db257b7bdefc 335 }
el19tb 35:db257b7bdefc 336
el19tb 37:65c9e5a65738 337 bool Frogger::returnCollision(Car* log){
el19tb 35:db257b7bdefc 338
el19tb 35:db257b7bdefc 339 float ob = log->vehicle.height + log->vehicle.y;
el19tb 35:db257b7bdefc 340
el19tb 35:db257b7bdefc 341 if(!(chicken.up >= ob||
el19tb 35:db257b7bdefc 342 (chicken.right_side <= log->vehicle.x) ||
el19tb 35:db257b7bdefc 343 (chicken.down <= log->vehicle.y) ||
el19tb 35:db257b7bdefc 344 chicken.left_side >= (log->vehicle.width + log->vehicle.x))){
el19tb 35:db257b7bdefc 345 return true;
el19tb 35:db257b7bdefc 346 }
el19tb 35:db257b7bdefc 347 }