ELEC2645 (2017/18) / Mbed 2 deprecated el16a2t

Dependencies:   mbed

Committer:
el16a2t
Date:
Mon May 07 18:28:51 2018 +0000
Revision:
13:61aeeb4e4e47
Parent:
12:c36bc59d120e
made it so that randomly spawned car sprites can't overlap, by forcing one to change lanes before appearing on screen if overlap conditions fulfilled. Also introduced cars occasionally changing lanes when player reaches certain score(makes it harder)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
el16a2t 1:a3c9025e0dad 1 /*
el16a2t 1:a3c9025e0dad 2 ELEC2645 Embedded Systems Project
el16a2t 1:a3c9025e0dad 3 School of Electronic & Electrical Engineering
el16a2t 1:a3c9025e0dad 4 University of Leeds
el16a2t 1:a3c9025e0dad 5 Name: Adam Thompson
el16a2t 1:a3c9025e0dad 6 Username: el16a2t
el16a2t 1:a3c9025e0dad 7 Student ID Number: 201047832
el16a2t 1:a3c9025e0dad 8 Date: 17/4/18
el16a2t 1:a3c9025e0dad 9 */
el16a2t 1:a3c9025e0dad 10 #include "mbed.h"
el16a2t 1:a3c9025e0dad 11 #include "Gamepad.h"
el16a2t 1:a3c9025e0dad 12 #include "N5110.h"
el16a2t 1:a3c9025e0dad 13 #include "sprites.h"
el16a2t 1:a3c9025e0dad 14 #include "main.h"
el16a2t 1:a3c9025e0dad 15
el16a2t 1:a3c9025e0dad 16
el16a2t 1:a3c9025e0dad 17 N5110 lcd(PTC9, PTC0, PTC7, PTD2, PTD1, PTC11);
el16a2t 1:a3c9025e0dad 18 Gamepad pad;
el16a2t 1:a3c9025e0dad 19
el16a2t 2:a48df109588e 20 void init();
el16a2t 2:a48df109588e 21 void startUp();
el16a2t 2:a48df109588e 22 void newGame();
el16a2t 2:a48df109588e 23 void gameOver();
el16a2t 1:a3c9025e0dad 24
el16a2t 1:a3c9025e0dad 25
el16a2t 1:a3c9025e0dad 26 int main()
el16a2t 2:a48df109588e 27 {
el16a2t 1:a3c9025e0dad 28
el16a2t 2:a48df109588e 29 init();
el16a2t 2:a48df109588e 30 startUp();
el16a2t 7:d1a1f7c5eb0d 31 while (1) {
el16a2t 7:d1a1f7c5eb0d 32
el16a2t 7:d1a1f7c5eb0d 33 newGame();
el16a2t 7:d1a1f7c5eb0d 34 gameOver();
el16a2t 7:d1a1f7c5eb0d 35 }
el16a2t 2:a48df109588e 36 }
el16a2t 1:a3c9025e0dad 37
el16a2t 2:a48df109588e 38 void init()
el16a2t 1:a3c9025e0dad 39 {
el16a2t 1:a3c9025e0dad 40
el16a2t 1:a3c9025e0dad 41 // initialise the lcd and gamepad
el16a2t 1:a3c9025e0dad 42 lcd.init();
el16a2t 7:d1a1f7c5eb0d 43 lcd.setContrast(0.3);
el16a2t 1:a3c9025e0dad 44 pad.init ();
el16a2t 7:d1a1f7c5eb0d 45 //set initial number of lives to 1
el16a2t 7:d1a1f7c5eb0d 46 lives = 1;
el16a2t 7:d1a1f7c5eb0d 47 //set initial location conditions for the player and car(s) and score
el16a2t 7:d1a1f7c5eb0d 48 x_player = 24;
el16a2t 7:d1a1f7c5eb0d 49 y_player = 29;
el16a2t 11:4907e6e7e855 50
el16a2t 7:d1a1f7c5eb0d 51 x_car = 4;
el16a2t 7:d1a1f7c5eb0d 52 y_car = 0;
el16a2t 8:8d25574b14cd 53 x_car2 = 24;
el16a2t 13:61aeeb4e4e47 54 y_car2 = -40;
el16a2t 7:d1a1f7c5eb0d 55
el16a2t 7:d1a1f7c5eb0d 56 //(re)set score to 0
el16a2t 7:d1a1f7c5eb0d 57 score = 0;
el16a2t 13:61aeeb4e4e47 58
el16a2t 13:61aeeb4e4e47 59 srand(time(NULL));
el16a2t 2:a48df109588e 60 }
el16a2t 1:a3c9025e0dad 61
el16a2t 2:a48df109588e 62
el16a2t 2:a48df109588e 63 void startUp()
el16a2t 2:a48df109588e 64 {
el16a2t 2:a48df109588e 65 //print start screen
el16a2t 2:a48df109588e 66 while ( pad.check_event(Gamepad::START_PRESSED) == false) {
el16a2t 11:4907e6e7e855 67 lcd.drawSprite (1,1,20,70,(int*) titlescreen);
el16a2t 11:4907e6e7e855 68 lcd.printString ("PRESS START", 3,5);
el16a2t 11:4907e6e7e855 69 lcd.printString ("SPEED", 3,3);
el16a2t 11:4907e6e7e855 70 pot_value = pad.read_pot();
el16a2t 11:4907e6e7e855 71 sprintf (speed, "%.1f", (pot_value*10)); //convert an integer to pointer
el16a2t 11:4907e6e7e855 72 lcd.printString(speed,55,3);
el16a2t 13:61aeeb4e4e47 73
el16a2t 11:4907e6e7e855 74 lcd.refresh();
el16a2t 11:4907e6e7e855 75 wait(0.2);
el16a2t 2:a48df109588e 76 }
el16a2t 2:a48df109588e 77 }
el16a2t 2:a48df109588e 78
el16a2t 4:a6ca44e29e97 79
el16a2t 8:8d25574b14cd 80 void newGame()
el16a2t 8:8d25574b14cd 81 {
el16a2t 11:4907e6e7e855 82 printf("newgamereached\n"); //checking if new game function reached
el16a2t 1:a3c9025e0dad 83
el16a2t 11:4907e6e7e855 84 lcd.clear();
el16a2t 11:4907e6e7e855 85
el16a2t 11:4907e6e7e855 86 lcd.drawSprite(x_player,y_player,20,15,(int*) player); //print the player sprite
el16a2t 11:4907e6e7e855 87
el16a2t 11:4907e6e7e855 88 //if X pressed, move player left, if B pressed, move player right
el16a2t 11:4907e6e7e855 89 if ( pad.check_event(Gamepad::X_PRESSED) == true) {
el16a2t 11:4907e6e7e855 90
el16a2t 11:4907e6e7e855 91 x_player = x_player-20;
el16a2t 11:4907e6e7e855 92 }
el16a2t 11:4907e6e7e855 93 //car cannot go further left than the left lane etc
el16a2t 11:4907e6e7e855 94 if (x_player <4) {
el16a2t 11:4907e6e7e855 95 x_player = 4;
el16a2t 11:4907e6e7e855 96 }
el16a2t 11:4907e6e7e855 97 if ( pad.check_event(Gamepad::B_PRESSED) == true) {
el16a2t 1:a3c9025e0dad 98
el16a2t 11:4907e6e7e855 99 x_player = x_player+20;
el16a2t 11:4907e6e7e855 100 }
el16a2t 11:4907e6e7e855 101 if (x_player >44) {
el16a2t 11:4907e6e7e855 102 x_player = 44;
el16a2t 11:4907e6e7e855 103 }
el16a2t 11:4907e6e7e855 104
el16a2t 1:a3c9025e0dad 105
el16a2t 11:4907e6e7e855 106 //print road lines
el16a2t 11:4907e6e7e855 107 lcd.drawLine(1,1,1,1500,2);
el16a2t 1:a3c9025e0dad 108
el16a2t 11:4907e6e7e855 109 lcd.drawLine(21,1,21,1500,2);
el16a2t 11:4907e6e7e855 110
el16a2t 11:4907e6e7e855 111 lcd.drawLine(41,1,41,1500,2);
el16a2t 11:4907e6e7e855 112
el16a2t 11:4907e6e7e855 113 lcd.drawLine(61,1,61,1500,2);
el16a2t 2:a48df109588e 114
el16a2t 2:a48df109588e 115
el16a2t 2:a48df109588e 116
el16a2t 2:a48df109588e 117
el16a2t 13:61aeeb4e4e47 118 //cars move down the road:
el16a2t 10:e81aacef805b 119
el16a2t 11:4907e6e7e855 120 lcd.drawSprite(x_car,y_car,20,15,(int*) car);
el16a2t 11:4907e6e7e855 121 y_car++;
el16a2t 11:4907e6e7e855 122 lcd.drawSprite(x_car2,y_car2,20,15,(int*) car2);
el16a2t 11:4907e6e7e855 123 y_car2++;
el16a2t 7:d1a1f7c5eb0d 124
el16a2t 13:61aeeb4e4e47 125 // re-generate cars continously:
el16a2t 13:61aeeb4e4e47 126
el16a2t 13:61aeeb4e4e47 127 int Index = rand() % 3; //picks a random number between 1 and 3
el16a2t 13:61aeeb4e4e47 128 printf ("Index = %d\n", Index);
el16a2t 13:61aeeb4e4e47 129 int arr[3] = {4, 24, 44}; //array corresponding to the x values of the 3 lanes of traffic
el16a2t 13:61aeeb4e4e47 130 int random_number = arr[Index]; //pick number at Index value from array, assign to random_number
el16a2t 13:61aeeb4e4e47 131 printf ("random_number = %d\n", random_number);
el16a2t 13:61aeeb4e4e47 132
el16a2t 13:61aeeb4e4e47 133 int Index2 = rand() % 3;
el16a2t 13:61aeeb4e4e47 134 int arr2[3] = {4, 24, 44};
el16a2t 13:61aeeb4e4e47 135 int random_number2 = arr2[Index2];
el16a2t 7:d1a1f7c5eb0d 136
el16a2t 1:a3c9025e0dad 137
el16a2t 13:61aeeb4e4e47 138 int YIndex = rand() % 5;
el16a2t 13:61aeeb4e4e47 139 int array[5] = {-20, -24, -28, -32, -36};
el16a2t 11:4907e6e7e855 140 int nextCar = array[YIndex];
el16a2t 1:a3c9025e0dad 141
el16a2t 13:61aeeb4e4e47 142 if (y_car == 50) {
el16a2t 11:4907e6e7e855 143 x_car = random_number;
el16a2t 13:61aeeb4e4e47 144 y_car = nextCar;
el16a2t 7:d1a1f7c5eb0d 145
el16a2t 7:d1a1f7c5eb0d 146
el16a2t 11:4907e6e7e855 147 }
el16a2t 7:d1a1f7c5eb0d 148
el16a2t 13:61aeeb4e4e47 149 int YIndex2 = rand() % 5;
el16a2t 13:61aeeb4e4e47 150 int array2[5] = {-20, -24, -28, -32, -36};
el16a2t 11:4907e6e7e855 151 int nextCar2 = array2[YIndex2];
el16a2t 7:d1a1f7c5eb0d 152
el16a2t 13:61aeeb4e4e47 153 if (y_car2 == 50) {
el16a2t 11:4907e6e7e855 154 x_car2 = random_number2;
el16a2t 13:61aeeb4e4e47 155 y_car2 = nextCar2;
el16a2t 2:a48df109588e 156
el16a2t 7:d1a1f7c5eb0d 157
el16a2t 11:4907e6e7e855 158 }
el16a2t 2:a48df109588e 159
el16a2t 13:61aeeb4e4e47 160 if (y_car2>y_car-20 && y_car2<y_car+20 && x_car == x_car2) {
el16a2t 13:61aeeb4e4e47 161 x_car2 = random_number;
el16a2t 13:61aeeb4e4e47 162 }
el16a2t 13:61aeeb4e4e47 163
el16a2t 13:61aeeb4e4e47 164 // make it so that when the player reaches a certain score, occasionally
el16a2t 13:61aeeb4e4e47 165 //(when both oncoming cars in the same lane) one of them changes lane
el16a2t 13:61aeeb4e4e47 166 //this makes it harder for the player
el16a2t 13:61aeeb4e4e47 167 if (score > 500 && y_car>5 && x_car == x_car2) {
el16a2t 13:61aeeb4e4e47 168 x_car = random_number2;
el16a2t 13:61aeeb4e4e47 169 }
el16a2t 13:61aeeb4e4e47 170
el16a2t 13:61aeeb4e4e47 171
el16a2t 2:a48df109588e 172
el16a2t 2:a48df109588e 173
el16a2t 2:a48df109588e 174
el16a2t 11:4907e6e7e855 175 score++;//increase score
el16a2t 11:4907e6e7e855 176
el16a2t 11:4907e6e7e855 177 // difficulty = read_pot();
el16a2t 13:61aeeb4e4e47 178 sprintf (str, "%d", (score/10)); //convert an integer to pointer
el16a2t 11:4907e6e7e855 179 lcd.printString(str,64,1);
el16a2t 1:a3c9025e0dad 180
el16a2t 1:a3c9025e0dad 181
el16a2t 11:4907e6e7e855 182 //if there is a collision, display "game over" screen
el16a2t 11:4907e6e7e855 183 if (x_car == x_player && y_car > 12 && y_car < 50) {
el16a2t 13:61aeeb4e4e47 184 printf("collision1\n");// to tell with which sprite the collision was
el16a2t 11:4907e6e7e855 185 y_car = y_car;
el16a2t 11:4907e6e7e855 186 y_car2 = y_car2;
el16a2t 11:4907e6e7e855 187 score=score;
el16a2t 11:4907e6e7e855 188 lives--;
el16a2t 11:4907e6e7e855 189 printf("lives=%d\n", lives);
el16a2t 11:4907e6e7e855 190
el16a2t 11:4907e6e7e855 191 }
el16a2t 11:4907e6e7e855 192 if (x_car2 == x_player && y_car2 > 12 && y_car2 < 50) {
el16a2t 11:4907e6e7e855 193 printf("collision2\n");
el16a2t 11:4907e6e7e855 194 y_car2 = y_car2;
el16a2t 11:4907e6e7e855 195 y_car = y_car;
el16a2t 11:4907e6e7e855 196 score=score;
el16a2t 11:4907e6e7e855 197 lives--;
el16a2t 11:4907e6e7e855 198 printf("lives=%d\n", lives);
el16a2t 11:4907e6e7e855 199
el16a2t 11:4907e6e7e855 200 }
el16a2t 11:4907e6e7e855 201
el16a2t 11:4907e6e7e855 202 if ( pad.check_event(Gamepad::X_PRESSED) == true) {
el16a2t 11:4907e6e7e855 203
el16a2t 11:4907e6e7e855 204 x_player = x_player-20;
el16a2t 11:4907e6e7e855 205 }
el16a2t 11:4907e6e7e855 206 //car cannot go further left than the left lane etc
el16a2t 11:4907e6e7e855 207 if (x_player <4) {
el16a2t 11:4907e6e7e855 208 x_player = 4;
el16a2t 11:4907e6e7e855 209 }
el16a2t 11:4907e6e7e855 210 if ( pad.check_event(Gamepad::B_PRESSED) == true) {
el16a2t 11:4907e6e7e855 211
el16a2t 11:4907e6e7e855 212 x_player = x_player+20;
el16a2t 11:4907e6e7e855 213 }
el16a2t 11:4907e6e7e855 214 if (x_player >44) {
el16a2t 11:4907e6e7e855 215 x_player = 44;
el16a2t 11:4907e6e7e855 216 }
el16a2t 11:4907e6e7e855 217
el16a2t 11:4907e6e7e855 218 pot_value = pad.read_pot();
el16a2t 11:4907e6e7e855 219 printf("pot_value = %f\n", pot_value);
el16a2t 11:4907e6e7e855 220 float wait_time = pot_value/10;
el16a2t 11:4907e6e7e855 221
el16a2t 11:4907e6e7e855 222 lcd.refresh();
el16a2t 11:4907e6e7e855 223
el16a2t 11:4907e6e7e855 224 wait(0.1-wait_time);
el16a2t 1:a3c9025e0dad 225
el16a2t 1:a3c9025e0dad 226
el16a2t 1:a3c9025e0dad 227
el16a2t 1:a3c9025e0dad 228
el16a2t 1:a3c9025e0dad 229
el16a2t 1:a3c9025e0dad 230
el16a2t 1:a3c9025e0dad 231
el16a2t 11:4907e6e7e855 232
el16a2t 7:d1a1f7c5eb0d 233
el16a2t 7:d1a1f7c5eb0d 234
el16a2t 2:a48df109588e 235 }
el16a2t 1:a3c9025e0dad 236
el16a2t 7:d1a1f7c5eb0d 237 void gameOver()
el16a2t 7:d1a1f7c5eb0d 238 {
el16a2t 7:d1a1f7c5eb0d 239 printf("reached gameover\n");
el16a2t 11:4907e6e7e855 240 if (lives ==0) {
el16a2t 11:4907e6e7e855 241
el16a2t 7:d1a1f7c5eb0d 242
el16a2t 11:4907e6e7e855 243 while ( pad.check_event(Gamepad::START_PRESSED) == false) {
el16a2t 11:4907e6e7e855 244
el16a2t 11:4907e6e7e855 245 printf("gameoverlives=%d\n", lives);
el16a2t 11:4907e6e7e855 246 lcd.clear();
el16a2t 10:e81aacef805b 247
el16a2t 11:4907e6e7e855 248 lcd.printString(str,64,1);
el16a2t 11:4907e6e7e855 249 lcd.printString ("GAME OVER", 3,1);
el16a2t 11:4907e6e7e855 250 lcd.printString ("PRESS START", 3,3);
el16a2t 11:4907e6e7e855 251 lcd.refresh();
el16a2t 11:4907e6e7e855 252 wait(0.2);
el16a2t 11:4907e6e7e855 253 }
el16a2t 11:4907e6e7e855 254 init ();
el16a2t 7:d1a1f7c5eb0d 255 }
el16a2t 11:4907e6e7e855 256 }