ELEC2645 (2017/18) / Mbed 2 deprecated el16a2t

Dependencies:   mbed

Committer:
el16a2t
Date:
Mon May 07 21:40:16 2018 +0000
Revision:
14:ce231137d2f2
Parent:
engine/main.cpp@13:61aeeb4e4e47
Child:
15:2b98d03e7ab6
added in comments explaining the difficulty adjustment and the function which stops sprites overlapping

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 14:ce231137d2f2 160 //following if statement stops the car sprites overlapping
el16a2t 14:ce231137d2f2 161 if (y_car2>y_car-20 && y_car2<y_car+20 && x_car == x_car2 && y_car2>49) {
el16a2t 13:61aeeb4e4e47 162 x_car2 = random_number;
el16a2t 13:61aeeb4e4e47 163 }
el16a2t 13:61aeeb4e4e47 164
el16a2t 14:ce231137d2f2 165 // make it so that after the player reaches a certain score, occasionally
el16a2t 14:ce231137d2f2 166 //(when both oncoming cars in the same lane) one car changes lane
el16a2t 14:ce231137d2f2 167 //this makes it harder for the player:
el16a2t 13:61aeeb4e4e47 168 if (score > 500 && y_car>5 && x_car == x_car2) {
el16a2t 13:61aeeb4e4e47 169 x_car = random_number2;
el16a2t 13:61aeeb4e4e47 170 }
el16a2t 13:61aeeb4e4e47 171
el16a2t 13:61aeeb4e4e47 172
el16a2t 2:a48df109588e 173
el16a2t 2:a48df109588e 174
el16a2t 2:a48df109588e 175
el16a2t 11:4907e6e7e855 176 score++;//increase score
el16a2t 11:4907e6e7e855 177
el16a2t 11:4907e6e7e855 178 // difficulty = read_pot();
el16a2t 13:61aeeb4e4e47 179 sprintf (str, "%d", (score/10)); //convert an integer to pointer
el16a2t 11:4907e6e7e855 180 lcd.printString(str,64,1);
el16a2t 1:a3c9025e0dad 181
el16a2t 1:a3c9025e0dad 182
el16a2t 11:4907e6e7e855 183 //if there is a collision, display "game over" screen
el16a2t 11:4907e6e7e855 184 if (x_car == x_player && y_car > 12 && y_car < 50) {
el16a2t 13:61aeeb4e4e47 185 printf("collision1\n");// to tell with which sprite the collision was
el16a2t 11:4907e6e7e855 186 y_car = y_car;
el16a2t 11:4907e6e7e855 187 y_car2 = y_car2;
el16a2t 11:4907e6e7e855 188 score=score;
el16a2t 11:4907e6e7e855 189 lives--;
el16a2t 11:4907e6e7e855 190 printf("lives=%d\n", lives);
el16a2t 11:4907e6e7e855 191
el16a2t 11:4907e6e7e855 192 }
el16a2t 11:4907e6e7e855 193 if (x_car2 == x_player && y_car2 > 12 && y_car2 < 50) {
el16a2t 11:4907e6e7e855 194 printf("collision2\n");
el16a2t 11:4907e6e7e855 195 y_car2 = y_car2;
el16a2t 11:4907e6e7e855 196 y_car = y_car;
el16a2t 11:4907e6e7e855 197 score=score;
el16a2t 11:4907e6e7e855 198 lives--;
el16a2t 11:4907e6e7e855 199 printf("lives=%d\n", lives);
el16a2t 11:4907e6e7e855 200
el16a2t 11:4907e6e7e855 201 }
el16a2t 11:4907e6e7e855 202
el16a2t 11:4907e6e7e855 203 if ( pad.check_event(Gamepad::X_PRESSED) == true) {
el16a2t 11:4907e6e7e855 204
el16a2t 11:4907e6e7e855 205 x_player = x_player-20;
el16a2t 11:4907e6e7e855 206 }
el16a2t 11:4907e6e7e855 207 //car cannot go further left than the left lane etc
el16a2t 11:4907e6e7e855 208 if (x_player <4) {
el16a2t 11:4907e6e7e855 209 x_player = 4;
el16a2t 11:4907e6e7e855 210 }
el16a2t 11:4907e6e7e855 211 if ( pad.check_event(Gamepad::B_PRESSED) == true) {
el16a2t 11:4907e6e7e855 212
el16a2t 11:4907e6e7e855 213 x_player = x_player+20;
el16a2t 11:4907e6e7e855 214 }
el16a2t 11:4907e6e7e855 215 if (x_player >44) {
el16a2t 11:4907e6e7e855 216 x_player = 44;
el16a2t 11:4907e6e7e855 217 }
el16a2t 11:4907e6e7e855 218
el16a2t 11:4907e6e7e855 219 pot_value = pad.read_pot();
el16a2t 11:4907e6e7e855 220 printf("pot_value = %f\n", pot_value);
el16a2t 11:4907e6e7e855 221 float wait_time = pot_value/10;
el16a2t 11:4907e6e7e855 222
el16a2t 11:4907e6e7e855 223 lcd.refresh();
el16a2t 11:4907e6e7e855 224
el16a2t 11:4907e6e7e855 225 wait(0.1-wait_time);
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 1:a3c9025e0dad 232
el16a2t 11:4907e6e7e855 233
el16a2t 7:d1a1f7c5eb0d 234
el16a2t 7:d1a1f7c5eb0d 235
el16a2t 2:a48df109588e 236 }
el16a2t 1:a3c9025e0dad 237
el16a2t 7:d1a1f7c5eb0d 238 void gameOver()
el16a2t 7:d1a1f7c5eb0d 239 {
el16a2t 7:d1a1f7c5eb0d 240 printf("reached gameover\n");
el16a2t 11:4907e6e7e855 241 if (lives ==0) {
el16a2t 11:4907e6e7e855 242
el16a2t 7:d1a1f7c5eb0d 243
el16a2t 11:4907e6e7e855 244 while ( pad.check_event(Gamepad::START_PRESSED) == false) {
el16a2t 11:4907e6e7e855 245
el16a2t 11:4907e6e7e855 246 printf("gameoverlives=%d\n", lives);
el16a2t 11:4907e6e7e855 247 lcd.clear();
el16a2t 10:e81aacef805b 248
el16a2t 11:4907e6e7e855 249 lcd.printString(str,64,1);
el16a2t 11:4907e6e7e855 250 lcd.printString ("GAME OVER", 3,1);
el16a2t 11:4907e6e7e855 251 lcd.printString ("PRESS START", 3,3);
el16a2t 11:4907e6e7e855 252 lcd.refresh();
el16a2t 11:4907e6e7e855 253 wait(0.2);
el16a2t 11:4907e6e7e855 254 }
el16a2t 11:4907e6e7e855 255 init ();
el16a2t 7:d1a1f7c5eb0d 256 }
el16a2t 11:4907e6e7e855 257 }