ELEC2645 (2017/18) / Mbed 2 deprecated el16a2t

Dependencies:   mbed

Committer:
el16a2t
Date:
Sun May 06 20:18:10 2018 +0000
Revision:
9:514c6f98ca5a
Parent:
8:8d25574b14cd
Child:
10:e81aacef805b
changes to titlescreen sprite and titlescreen text;

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 8:8d25574b14cd 50
el16a2t 7:d1a1f7c5eb0d 51
el16a2t 8:8d25574b14cd 52
el16a2t 7:d1a1f7c5eb0d 53 x_car = 4;
el16a2t 7:d1a1f7c5eb0d 54 y_car = 0;
el16a2t 8:8d25574b14cd 55 x_car2 = 24;
el16a2t 7:d1a1f7c5eb0d 56 y_car2 = -40;
el16a2t 7:d1a1f7c5eb0d 57
el16a2t 7:d1a1f7c5eb0d 58
el16a2t 7:d1a1f7c5eb0d 59 //(re)set score to 0
el16a2t 7:d1a1f7c5eb0d 60 score = 0;
el16a2t 2:a48df109588e 61 }
el16a2t 1:a3c9025e0dad 62
el16a2t 2:a48df109588e 63
el16a2t 2:a48df109588e 64 void startUp()
el16a2t 2:a48df109588e 65 {
el16a2t 2:a48df109588e 66 //print start screen
el16a2t 9:514c6f98ca5a 67 lcd.drawSprite (1,1,20,70,(int*) titlescreen);
el16a2t 9:514c6f98ca5a 68 lcd.printString ("PRESS START", 3,4);
el16a2t 2:a48df109588e 69 lcd.refresh();
el16a2t 2:a48df109588e 70 while ( pad.check_event(Gamepad::START_PRESSED) == false) {
el16a2t 2:a48df109588e 71
el16a2t 2:a48df109588e 72 }
el16a2t 2:a48df109588e 73 }
el16a2t 2:a48df109588e 74
el16a2t 4:a6ca44e29e97 75
el16a2t 2:a48df109588e 76
el16a2t 8:8d25574b14cd 77 void newGame()
el16a2t 8:8d25574b14cd 78 {
el16a2t 8:8d25574b14cd 79 printf("newgamereached\n"); //checking if new game function reached
el16a2t 2:a48df109588e 80
el16a2t 8:8d25574b14cd 81 int Index = rand() % 3; //picks a random number between 1 and 3
el16a2t 8:8d25574b14cd 82 printf ("Index = %d\n", Index);
el16a2t 8:8d25574b14cd 83 int arr[3] = {4, 24, 44}; //array corresponding to the x values of the 3 lanes of traffic
el16a2t 8:8d25574b14cd 84 int random_number = arr[Index]; //pick number at Index value from array, assign to random_number
el16a2t 8:8d25574b14cd 85 printf ("random_number = %d\n", random_number);
el16a2t 1:a3c9025e0dad 86
el16a2t 1:a3c9025e0dad 87 lcd.clear();
el16a2t 1:a3c9025e0dad 88
el16a2t 8:8d25574b14cd 89 lcd.drawSprite(x_player,y_player,20,15,(int*) player); //print the player sprite
el16a2t 8:8d25574b14cd 90
el16a2t 7:d1a1f7c5eb0d 91 //if X pressed, move player left, if B pressed, move player right
el16a2t 2:a48df109588e 92 if ( pad.check_event(Gamepad::X_PRESSED) == true) {
el16a2t 1:a3c9025e0dad 93
el16a2t 1:a3c9025e0dad 94 x_player = x_player-20;
el16a2t 1:a3c9025e0dad 95 }
el16a2t 7:d1a1f7c5eb0d 96 //car cannot go further left than the left lane etc
el16a2t 1:a3c9025e0dad 97 if (x_player <4) {
el16a2t 1:a3c9025e0dad 98 x_player = 4;
el16a2t 1:a3c9025e0dad 99 }
el16a2t 2:a48df109588e 100 if ( pad.check_event(Gamepad::B_PRESSED) == true) {
el16a2t 1:a3c9025e0dad 101
el16a2t 1:a3c9025e0dad 102 x_player = x_player+20;
el16a2t 1:a3c9025e0dad 103 }
el16a2t 1:a3c9025e0dad 104 if (x_player >44) {
el16a2t 1:a3c9025e0dad 105 x_player = 44;
el16a2t 1:a3c9025e0dad 106 }
el16a2t 1:a3c9025e0dad 107
el16a2t 7:d1a1f7c5eb0d 108
el16a2t 8:8d25574b14cd 109 //print road lines
el16a2t 7:d1a1f7c5eb0d 110 lcd.drawLine(1,1,1,1500,2);
el16a2t 1:a3c9025e0dad 111
el16a2t 7:d1a1f7c5eb0d 112 lcd.drawLine(21,1,21,1500,2);
el16a2t 1:a3c9025e0dad 113
el16a2t 7:d1a1f7c5eb0d 114 lcd.drawLine(41,1,41,1500,2);
el16a2t 1:a3c9025e0dad 115
el16a2t 7:d1a1f7c5eb0d 116 lcd.drawLine(61,1,61,1500,2);
el16a2t 2:a48df109588e 117
el16a2t 2:a48df109588e 118
el16a2t 2:a48df109588e 119
el16a2t 2:a48df109588e 120
el16a2t 8:8d25574b14cd 121 //cars move down the road
el16a2t 2:a48df109588e 122
el16a2t 2:a48df109588e 123 lcd.drawSprite(x_car,y_car,20,15,(int*) car);
el16a2t 2:a48df109588e 124 y_car++;
el16a2t 4:a6ca44e29e97 125 lcd.drawSprite(x_car2,y_car2,20,15,(int*) car2);
el16a2t 4:a6ca44e29e97 126 y_car2++;
el16a2t 7:d1a1f7c5eb0d 127
el16a2t 8:8d25574b14cd 128 // re-generate cars continously
el16a2t 7:d1a1f7c5eb0d 129
el16a2t 7:d1a1f7c5eb0d 130 if (y_car2 == 50) {
el16a2t 8:8d25574b14cd 131 x_car2 = random_number;
el16a2t 7:d1a1f7c5eb0d 132 y_car2 = -24;
el16a2t 7:d1a1f7c5eb0d 133
el16a2t 7:d1a1f7c5eb0d 134
el16a2t 7:d1a1f7c5eb0d 135 }
el16a2t 7:d1a1f7c5eb0d 136 if (y_car == 50) {
el16a2t 8:8d25574b14cd 137 x_car = random_number;
el16a2t 7:d1a1f7c5eb0d 138 y_car = -24;
el16a2t 7:d1a1f7c5eb0d 139
el16a2t 7:d1a1f7c5eb0d 140
el16a2t 7:d1a1f7c5eb0d 141 }
el16a2t 7:d1a1f7c5eb0d 142
el16a2t 7:d1a1f7c5eb0d 143
el16a2t 1:a3c9025e0dad 144
el16a2t 8:8d25574b14cd 145
el16a2t 8:8d25574b14cd 146 score++;//increase score
el16a2t 1:a3c9025e0dad 147
el16a2t 2:a48df109588e 148 // difficulty = read_pot();
el16a2t 8:8d25574b14cd 149 sprintf (str, "%d", score); //convert an integer to pointer
el16a2t 2:a48df109588e 150 lcd.printString(str,64,1);
el16a2t 7:d1a1f7c5eb0d 151
el16a2t 7:d1a1f7c5eb0d 152
el16a2t 8:8d25574b14cd 153 //if there is a collision, display "game over" screen
el16a2t 8:8d25574b14cd 154 if (x_car == x_player && y_car > 12 && y_car < 50) {
el16a2t 8:8d25574b14cd 155 printf("collision1\n");// so i can tell which car sprite the collision was with
el16a2t 7:d1a1f7c5eb0d 156 y_car = y_car;
el16a2t 6:933bb2b03b38 157 y_car2 = y_car2;
el16a2t 6:933bb2b03b38 158 score=score;
el16a2t 7:d1a1f7c5eb0d 159 lives--;
el16a2t 7:d1a1f7c5eb0d 160 printf("lives=%d\n", lives);
el16a2t 7:d1a1f7c5eb0d 161
el16a2t 7:d1a1f7c5eb0d 162 }
el16a2t 8:8d25574b14cd 163 if (x_car2 == x_player && y_car2 > 12 && y_car2 < 50) {
el16a2t 7:d1a1f7c5eb0d 164 printf("collision2\n");
el16a2t 7:d1a1f7c5eb0d 165 y_car2 = y_car2;
el16a2t 6:933bb2b03b38 166 y_car = y_car;
el16a2t 4:a6ca44e29e97 167 score=score;
el16a2t 7:d1a1f7c5eb0d 168 lives--;
el16a2t 7:d1a1f7c5eb0d 169 printf("lives=%d\n", lives);
el16a2t 7:d1a1f7c5eb0d 170
el16a2t 7:d1a1f7c5eb0d 171 }
el16a2t 7:d1a1f7c5eb0d 172
el16a2t 7:d1a1f7c5eb0d 173 if ( pad.check_event(Gamepad::X_PRESSED) == true) {
el16a2t 2:a48df109588e 174
el16a2t 7:d1a1f7c5eb0d 175 x_player = x_player-20;
el16a2t 7:d1a1f7c5eb0d 176 }
el16a2t 7:d1a1f7c5eb0d 177 //car cannot go further left than the left lane etc
el16a2t 7:d1a1f7c5eb0d 178 if (x_player <4) {
el16a2t 7:d1a1f7c5eb0d 179 x_player = 4;
el16a2t 7:d1a1f7c5eb0d 180 }
el16a2t 7:d1a1f7c5eb0d 181 if ( pad.check_event(Gamepad::B_PRESSED) == true) {
el16a2t 7:d1a1f7c5eb0d 182
el16a2t 7:d1a1f7c5eb0d 183 x_player = x_player+20;
el16a2t 7:d1a1f7c5eb0d 184 }
el16a2t 7:d1a1f7c5eb0d 185 if (x_player >44) {
el16a2t 7:d1a1f7c5eb0d 186 x_player = 44;
el16a2t 7:d1a1f7c5eb0d 187 }
el16a2t 2:a48df109588e 188
el16a2t 2:a48df109588e 189
el16a2t 2:a48df109588e 190
el16a2t 2:a48df109588e 191
el16a2t 1:a3c9025e0dad 192
el16a2t 1:a3c9025e0dad 193
el16a2t 1:a3c9025e0dad 194 lcd.refresh();
el16a2t 6:933bb2b03b38 195 //control the wait time using the potentiometer value to control difficulty
el16a2t 6:933bb2b03b38 196 //lower potentiometer = easier difficulty = longer wait time = cars and score move slower
el16a2t 7:d1a1f7c5eb0d 197 //e.g - use wait(1-potentiometer value) where potentiometer value 0<x<1 is difficulty
el16a2t 2:a48df109588e 198 wait(0.1);
el16a2t 1:a3c9025e0dad 199
el16a2t 1:a3c9025e0dad 200
el16a2t 1:a3c9025e0dad 201
el16a2t 1:a3c9025e0dad 202
el16a2t 1:a3c9025e0dad 203
el16a2t 1:a3c9025e0dad 204
el16a2t 1:a3c9025e0dad 205
el16a2t 4:a6ca44e29e97 206
el16a2t 7:d1a1f7c5eb0d 207
el16a2t 7:d1a1f7c5eb0d 208
el16a2t 2:a48df109588e 209 }
el16a2t 1:a3c9025e0dad 210
el16a2t 7:d1a1f7c5eb0d 211 void gameOver()
el16a2t 7:d1a1f7c5eb0d 212 {
el16a2t 7:d1a1f7c5eb0d 213 printf("reached gameover\n");
el16a2t 7:d1a1f7c5eb0d 214 if (lives ==0){
el16a2t 1:a3c9025e0dad 215
el16a2t 7:d1a1f7c5eb0d 216
el16a2t 7:d1a1f7c5eb0d 217
el16a2t 7:d1a1f7c5eb0d 218 while ( pad.check_event(Gamepad::START_PRESSED) == false) {
el16a2t 7:d1a1f7c5eb0d 219
el16a2t 7:d1a1f7c5eb0d 220 printf("gameoverlives=%d\n", lives);
el16a2t 4:a6ca44e29e97 221 lcd.clear();
el16a2t 7:d1a1f7c5eb0d 222 lcd.refresh();
el16a2t 4:a6ca44e29e97 223 lcd.printString(str,64,1);
el16a2t 4:a6ca44e29e97 224 lcd.printString ("GAME OVER", 3,1);
el16a2t 7:d1a1f7c5eb0d 225 lcd.printString ("PRESS START", 3,3);
el16a2t 7:d1a1f7c5eb0d 226 wait(0.2);
el16a2t 7:d1a1f7c5eb0d 227 }
el16a2t 7:d1a1f7c5eb0d 228 init ();
el16a2t 7:d1a1f7c5eb0d 229 }}