ELEC2645 (2019/20) / Mbed 2 deprecated ELEC2645_Project_el19tb

Dependencies:   mbed

Committer:
el19tb
Date:
Wed May 13 03:59:27 2020 +0000
Revision:
13:cd6d2f999057
Parent:
12:a0e0939a498f
Child:
15:b15bf9357cd9
the sprites appear to the screen, updated GraphicEngine

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