ELEC2645 (2019/20) / Mbed 2 deprecated ELEC2645_Project_el19tb

Dependencies:   mbed

Committer:
el19tb
Date:
Wed May 13 22:05:17 2020 +0000
Revision:
15:b15bf9357cd9
Parent:
13:cd6d2f999057
Child:
16:8a65cccd9685
created road background, and 4 lanes of roads so vehicles can use

Who changed what in which revision?

UserRevisionLine numberNew contents of line
el19tb 2:86cef2afa648 1 #include "CrossyChicken.h"
el19tb 2:86cef2afa648 2 #include "Menu.h"
el19tb 3:648c9d5001be 3 #include "GraphicEngine.h"
el19tb 3:648c9d5001be 4 #include <vector>
el19tb 3:648c9d5001be 5 #include <stdio.h>
el19tb 3:648c9d5001be 6 #include <cstddef>
el19tb 13:cd6d2f999057 7 #include "Vehicle.h"
el19tb 2:86cef2afa648 8
el19tb 5:6e3afee7eac3 9 // start from the top (height)
el19tb 2:86cef2afa648 10 Gamepad gamepad;
el19tb 2:86cef2afa648 11
el19tb 3:648c9d5001be 12 //create three class: CAR LANE, SAFETY LANE, OBSTACLE LANE(water)
el19tb 3:648c9d5001be 13 //random
el19tb 3:648c9d5001be 14 //algoritmic way of generating lanes
el19tb 3:648c9d5001be 15
el19tb 2:86cef2afa648 16 //size of each each tile in the game
el19tb 4:aae7f8d4ab78 17 int grid = 4;
el19tb 2:86cef2afa648 18
el19tb 3:648c9d5001be 19 //make one object of chicken
el19tb 3:648c9d5001be 20 //use this to move around the lcd
el19tb 6:e285eaf8bdcd 21 Chicken chicken((84/2)-grid/2, 48-grid, grid);
el19tb 3:648c9d5001be 22 Chicken *chickenptr= &chicken;
el19tb 3:648c9d5001be 23
el19tb 3:648c9d5001be 24 //there will be multiple cars
el19tb 5:6e3afee7eac3 25 Car firstLane[2];
el19tb 5:6e3afee7eac3 26 Car secondLane[2];
el19tb 5:6e3afee7eac3 27 Car thirdLane[3];
el19tb 7:1dce07fd0867 28 Car fourthLane[3];
el19tb 7:1dce07fd0867 29 Car log1Lane[2];
el19tb 7:1dce07fd0867 30 Car lo[2];
el19tb 7:1dce07fd0867 31 Car logger[2];
el19tb 9:d210eede4a1b 32 Car vop[2];
el19tb 3:648c9d5001be 33
el19tb 8:52794de935b2 34 int screenW = 84;
el19tb 8:52794de935b2 35 int screenH = 48;
el19tb 8:52794de935b2 36
el19tb 3:648c9d5001be 37 //class that whill show objects
el19tb 3:648c9d5001be 38 GraphicEngine graphics(chickenptr);
el19tb 2:86cef2afa648 39
el19tb 8:52794de935b2 40 bool frogLog = false;
el19tb 8:52794de935b2 41 bool frogDie = false; // whenever the frog is above safety lane in the middle
el19tb 8:52794de935b2 42 bool attach = false;
el19tb 8:52794de935b2 43
el19tb 11:cc5861abfca5 44 CrossyChicken::CrossyChicken(Level *level)
el19tb 11:cc5861abfca5 45 {
el19tb 11:cc5861abfca5 46 this->local_level = level;
el19tb 11:cc5861abfca5 47 }
el19tb 11:cc5861abfca5 48
el19tb 2:86cef2afa648 49 //main function that starts the game
el19tb 3:648c9d5001be 50 void CrossyChicken::start(){
el19tb 2:86cef2afa648 51 //game setup
el19tb 3:648c9d5001be 52 graphics.init();
el19tb 3:648c9d5001be 53 graphics.contrast();
el19tb 3:648c9d5001be 54 graphics.backLightOn();
el19tb 2:86cef2afa648 55 gamepad.init();
el19tb 15:b15bf9357cd9 56 row_number = 1;
el19tb 15:b15bf9357cd9 57
el19tb 4:aae7f8d4ab78 58
el19tb 5:6e3afee7eac3 59 //first lane of left racers
el19tb 5:6e3afee7eac3 60 firstLane[0].setSeperation(0);
el19tb 7:1dce07fd0867 61 firstLane[1].setSeperation(20);
el19tb 5:6e3afee7eac3 62 firstLane[0].setRow(2);
el19tb 5:6e3afee7eac3 63 firstLane[1].setRow(2);
el19tb 4:aae7f8d4ab78 64
el19tb 5:6e3afee7eac3 65 secondLane[0].setSeperation(0);
el19tb 7:1dce07fd0867 66 secondLane[1].setSeperation(20);
el19tb 5:6e3afee7eac3 67 secondLane[0].setRow(3);
el19tb 5:6e3afee7eac3 68 secondLane[1].setRow(3);
el19tb 5:6e3afee7eac3 69
el19tb 7:1dce07fd0867 70 thirdLane[0].setSeperation(0);
el19tb 7:1dce07fd0867 71 thirdLane[1].setSeperation(20);
el19tb 7:1dce07fd0867 72 thirdLane[2].setSeperation(40);
el19tb 5:6e3afee7eac3 73 thirdLane[0].setRow(4);
el19tb 5:6e3afee7eac3 74 thirdLane[1].setRow(4);
el19tb 5:6e3afee7eac3 75 thirdLane[2].setRow(4);
el19tb 7:1dce07fd0867 76
el19tb 7:1dce07fd0867 77 fourthLane[0].setSeperation(10);
el19tb 7:1dce07fd0867 78 fourthLane[1].setSeperation(30);
el19tb 7:1dce07fd0867 79 fourthLane[2].setSeperation(50);
el19tb 7:1dce07fd0867 80 fourthLane[0].setRow(5);
el19tb 7:1dce07fd0867 81 fourthLane[1].setRow(5);
el19tb 7:1dce07fd0867 82 fourthLane[2].setRow(5);
el19tb 7:1dce07fd0867 83
el19tb 7:1dce07fd0867 84 // log lane 1
el19tb 7:1dce07fd0867 85 log1Lane[0].setSeperation(0);
el19tb 7:1dce07fd0867 86 log1Lane[1].setSeperation(20);
el19tb 7:1dce07fd0867 87 log1Lane[0].setRow(7);
el19tb 7:1dce07fd0867 88 log1Lane[1].setRow(7);
el19tb 7:1dce07fd0867 89
el19tb 7:1dce07fd0867 90 // log lane 2
el19tb 7:1dce07fd0867 91 lo[0].setSeperation(10);
el19tb 7:1dce07fd0867 92 lo[1].setSeperation(30);
el19tb 7:1dce07fd0867 93 lo[0].setRow(8);
el19tb 7:1dce07fd0867 94 lo[1].setRow(8);
el19tb 7:1dce07fd0867 95
el19tb 7:1dce07fd0867 96 // log lane 3
el19tb 7:1dce07fd0867 97 logger[0].setSeperation(0);
el19tb 7:1dce07fd0867 98 logger[1].setSeperation(20);
el19tb 7:1dce07fd0867 99 logger[0].setRow(9);
el19tb 7:1dce07fd0867 100 logger[1].setRow(9);
el19tb 9:d210eede4a1b 101
el19tb 9:d210eede4a1b 102 // log lane 3
el19tb 9:d210eede4a1b 103 vop[0].setSeperation(0);
el19tb 9:d210eede4a1b 104 vop[1].setSeperation(20);
el19tb 9:d210eede4a1b 105 vop[0].setRow(10);
el19tb 9:d210eede4a1b 106 vop[1].setRow(10);
el19tb 5:6e3afee7eac3 107
el19tb 2:86cef2afa648 108 //keep reading and processing user input
el19tb 3:648c9d5001be 109 while(1) {
el19tb 3:648c9d5001be 110 graphics.clear();
el19tb 8:52794de935b2 111
el19tb 8:52794de935b2 112 for(int i = 0; i < 2; i++){
el19tb 5:6e3afee7eac3 113 moveCar(&firstLane[i], 2, (-2)); // change x position (moving)
el19tb 5:6e3afee7eac3 114 }
el19tb 5:6e3afee7eac3 115
el19tb 5:6e3afee7eac3 116 for(int x = 0; x < 2; x++){
el19tb 5:6e3afee7eac3 117 moveCar(&secondLane[x], 1, 1);
el19tb 5:6e3afee7eac3 118 }
el19tb 5:6e3afee7eac3 119
el19tb 5:6e3afee7eac3 120 for(int t = 0; t < 3; t++){
el19tb 5:6e3afee7eac3 121 moveCar(&thirdLane[t], 2, 1);
el19tb 7:1dce07fd0867 122 }
el19tb 7:1dce07fd0867 123
el19tb 7:1dce07fd0867 124 for(int c = 0; c < 3; c++){
el19tb 7:1dce07fd0867 125 moveCar(&fourthLane[c], 2, 1);
el19tb 7:1dce07fd0867 126 }
el19tb 7:1dce07fd0867 127
el19tb 7:1dce07fd0867 128 for(int v = 0; v < 2; v++){
el19tb 8:52794de935b2 129 moveCar(&log1Lane[v], 1, 1);
el19tb 7:1dce07fd0867 130 }
el19tb 7:1dce07fd0867 131
el19tb 7:1dce07fd0867 132 for(int b = 0; b < 2; b++){
el19tb 7:1dce07fd0867 133 moveCar(&lo[b], 2, 1);
el19tb 9:d210eede4a1b 134 // moveCar(&logger[b], 2, 2);
el19tb 9:d210eede4a1b 135 moveCar(&vop[b], 1, 2);
el19tb 5:6e3afee7eac3 136
el19tb 5:6e3afee7eac3 137 }
el19tb 5:6e3afee7eac3 138
el19tb 5:6e3afee7eac3 139 graphics.showCar(firstLane);
el19tb 5:6e3afee7eac3 140 graphics.showCar(secondLane);
el19tb 5:6e3afee7eac3 141 graphics.showCar(thirdLane);
el19tb 7:1dce07fd0867 142 graphics.showCar(fourthLane);
el19tb 7:1dce07fd0867 143 graphics.showCar(log1Lane);
el19tb 7:1dce07fd0867 144 graphics.showCar(lo);
el19tb 9:d210eede4a1b 145 graphics.showCar(logger);
el19tb 9:d210eede4a1b 146 graphics.showCar(vop);
el19tb 9:d210eede4a1b 147
el19tb 8:52794de935b2 148 graphics.showChicken();
el19tb 8:52794de935b2 149 process_input();
el19tb 8:52794de935b2 150
el19tb 8:52794de935b2 151 // now when the chicken is above the safety
el19tb 8:52794de935b2 152 // lane we need to ensure that it only can go on logs
el19tb 8:52794de935b2 153 if(chicken.y < screenH - grid*6){
el19tb 8:52794de935b2 154 frogDie = true; // frog can die if it is in water
el19tb 7:1dce07fd0867 155
el19tb 8:52794de935b2 156 //if it is not in a log
el19tb 8:52794de935b2 157 for(int x = 0; x < 2; x++){
el19tb 8:52794de935b2 158 setCollision(&log1Lane[x]);
el19tb 9:d210eede4a1b 159 setCollision(&lo[x]);
el19tb 9:d210eede4a1b 160 setCollision(&logger[x]);
el19tb 9:d210eede4a1b 161 setCollision(&vop[x]);
el19tb 9:d210eede4a1b 162
el19tb 8:52794de935b2 163 if(attach){
el19tb 8:52794de935b2 164 frogOnLog(&log1Lane[x]);
el19tb 9:d210eede4a1b 165 frogOnLog(&lo[x]);
el19tb 9:d210eede4a1b 166 frogOnLog(&logger[x]);
el19tb 9:d210eede4a1b 167 frogOnLog(&vop[x]);
el19tb 9:d210eede4a1b 168
el19tb 8:52794de935b2 169 }
el19tb 8:52794de935b2 170 }
el19tb 8:52794de935b2 171
el19tb 8:52794de935b2 172 if(!attach){
el19tb 8:52794de935b2 173 graphics.print();
el19tb 9:d210eede4a1b 174 }
el19tb 6:e285eaf8bdcd 175 }
el19tb 9:d210eede4a1b 176
el19tb 3:648c9d5001be 177 graphics.refresh();
el19tb 9:d210eede4a1b 178 wait_ms(70);
el19tb 2:86cef2afa648 179 }
el19tb 2:86cef2afa648 180 }
el19tb 2:86cef2afa648 181
el19tb 7:1dce07fd0867 182 // log intersects then frog.x = log[i].speed
el19tb 7:1dce07fd0867 183 // frog is attached function
el19tb 7:1dce07fd0867 184 // detach the frog when user goes up or down
el19tb 7:1dce07fd0867 185 // if the frog is back to the safe zone detatch also
el19tb 7:1dce07fd0867 186 // whenever the frog moves detach
el19tb 2:86cef2afa648 187 //A moves right
el19tb 2:86cef2afa648 188 //X moves upward
el19tb 2:86cef2afa648 189 //B moves downward
el19tb 2:86cef2afa648 190 //Y moves left
el19tb 2:86cef2afa648 191 void CrossyChicken::process_input() {
el19tb 3:648c9d5001be 192 //determine the input
el19tb 8:52794de935b2 193 /* make this a switch statement */
el19tb 3:648c9d5001be 194 if(gamepad.A_pressed()){
el19tb 3:648c9d5001be 195 moveChicken(1,0);
el19tb 8:52794de935b2 196 attach = false;
el19tb 3:648c9d5001be 197 } else if(gamepad.X_pressed()){
el19tb 3:648c9d5001be 198 moveChicken(0,-1);
el19tb 8:52794de935b2 199 attach = false;
el19tb 3:648c9d5001be 200 } else if(gamepad.B_pressed()){
el19tb 3:648c9d5001be 201 moveChicken(0,1);
el19tb 8:52794de935b2 202 attach = false;
el19tb 3:648c9d5001be 203 } else if(gamepad.Y_pressed()){
el19tb 3:648c9d5001be 204 moveChicken(-1,0);
el19tb 8:52794de935b2 205 attach = false;
el19tb 8:52794de935b2 206 }
el19tb 8:52794de935b2 207 }
el19tb 8:52794de935b2 208
el19tb 15:b15bf9357cd9 209 // every level is going to have the same
el19tb 15:b15bf9357cd9 210 // 4 lanes of roads
el19tb 15:b15bf9357cd9 211 void CrossyChicken::drawRoadBackground()
el19tb 15:b15bf9357cd9 212 {
el19tb 15:b15bf9357cd9 213 RoadObjects temp;
el19tb 15:b15bf9357cd9 214 int grid_screen_width = 22; // number of visible widths on width screen
el19tb 15:b15bf9357cd9 215
el19tb 15:b15bf9357cd9 216 for(int i = 0; i < 4; i++){
el19tb 15:b15bf9357cd9 217 graphics.drawRoads(row_number);
el19tb 15:b15bf9357cd9 218
el19tb 15:b15bf9357cd9 219 }
el19tb 15:b15bf9357cd9 220 row_number++;
el19tb 15:b15bf9357cd9 221 }
el19tb 15:b15bf9357cd9 222
el19tb 8:52794de935b2 223 // make the frog move same speed as log
el19tb 8:52794de935b2 224 // if the frog moves then detach
el19tb 8:52794de935b2 225 void CrossyChicken::frogOnLog(Car *log) {
el19tb 9:d210eede4a1b 226 if(log->seperation != 0){
el19tb 9:d210eede4a1b 227 chicken.x += 1.0;
el19tb 9:d210eede4a1b 228 }
el19tb 2:86cef2afa648 229 }
el19tb 2:86cef2afa648 230
el19tb 3:648c9d5001be 231 //moves the chicken around the grid
el19tb 3:648c9d5001be 232 void CrossyChicken::moveChicken(int xWay, int yWay){
el19tb 3:648c9d5001be 233 //increment the left side of the chicken by a value of the grid size
el19tb 4:aae7f8d4ab78 234 chicken.x += xWay * 4;
el19tb 3:648c9d5001be 235
el19tb 3:648c9d5001be 236 //increment the top side by a value of grid sizw
el19tb 4:aae7f8d4ab78 237 chicken.y += yWay * 4;
el19tb 3:648c9d5001be 238
el19tb 6:e285eaf8bdcd 239 chicken.left_side = chicken.x;
el19tb 6:e285eaf8bdcd 240 chicken.right_side = grid + chicken.x;
el19tb 6:e285eaf8bdcd 241 chicken.up = chicken.y;
el19tb 6:e285eaf8bdcd 242 chicken.down = grid + chicken.y;
el19tb 8:52794de935b2 243
el19tb 3:648c9d5001be 244 //display the new state of the chicken
el19tb 9:d210eede4a1b 245 //graphics.showChicken();
el19tb 3:648c9d5001be 246
el19tb 8:52794de935b2 247 //wait_ms(30);
el19tb 2:86cef2afa648 248 }
el19tb 2:86cef2afa648 249
el19tb 5:6e3afee7eac3 250 void CrossyChicken::moveCar(Car *car, int dir, int x) {
el19tb 5:6e3afee7eac3 251 car->speedMedium(dir, x);
el19tb 4:aae7f8d4ab78 252
el19tb 8:52794de935b2 253 // check if car goes out of bounds
el19tb 5:6e3afee7eac3 254 if(car->vehicle.x > 84+grid){
el19tb 5:6e3afee7eac3 255 car->vehicle.x = -4;
el19tb 3:648c9d5001be 256
el19tb 5:6e3afee7eac3 257 } else if(car->vehicle.x < -4){
el19tb 5:6e3afee7eac3 258 car->vehicle.x = 84 + grid;
el19tb 5:6e3afee7eac3 259 }
el19tb 5:6e3afee7eac3 260 }
el19tb 5:6e3afee7eac3 261
el19tb 5:6e3afee7eac3 262 // debug
el19tb 8:52794de935b2 263 void CrossyChicken::setCollision(Car *car){
el19tb 4:aae7f8d4ab78 264
el19tb 5:6e3afee7eac3 265 float other_bottom = car->vehicle.height + car->vehicle.y;
el19tb 6:e285eaf8bdcd 266
el19tb 6:e285eaf8bdcd 267
el19tb 5:6e3afee7eac3 268 if(!(chicken.up >= other_bottom ||
el19tb 5:6e3afee7eac3 269 (chicken.right_side <= car->vehicle.x) ||
el19tb 5:6e3afee7eac3 270 (chicken.down <= car->vehicle.y) ||
el19tb 5:6e3afee7eac3 271 chicken.left_side >= (car->vehicle.width + car->vehicle.x))){
el19tb 5:6e3afee7eac3 272 graphics.printTest();
el19tb 8:52794de935b2 273
el19tb 8:52794de935b2 274 if(chicken.y < screenH - grid*6){
el19tb 8:52794de935b2 275 attach = true;
el19tb 8:52794de935b2 276 } else {
el19tb 8:52794de935b2 277 attach = false;
el19tb 8:52794de935b2 278 }
el19tb 8:52794de935b2 279 }
el19tb 8:52794de935b2 280 }
el19tb 8:52794de935b2 281
el19tb 8:52794de935b2 282 bool CrossyChicken::returnCollision(Car* log){
el19tb 8:52794de935b2 283
el19tb 8:52794de935b2 284 float ob= log->vehicle.height + log->vehicle.y;
el19tb 8:52794de935b2 285
el19tb 8:52794de935b2 286 if(!(chicken.up >= ob||
el19tb 8:52794de935b2 287 (chicken.right_side <= log->vehicle.x) ||
el19tb 8:52794de935b2 288 (chicken.down <= log->vehicle.y) ||
el19tb 8:52794de935b2 289 chicken.left_side >= (log->vehicle.width + log->vehicle.x))){
el19tb 8:52794de935b2 290 return true;
el19tb 5:6e3afee7eac3 291 }
el19tb 5:6e3afee7eac3 292 }