ELEC2645 (2019/20) / Mbed 2 deprecated ELEC2645_Project_el19tb

Dependencies:   mbed

Committer:
el19tb
Date:
Tue May 12 22:04:05 2020 +0000
Revision:
9:d210eede4a1b
Parent:
8:52794de935b2
Child:
11:cc5861abfca5
fixed bugs regarding frog jumping on log

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