Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
engine/main.cpp@9:514c6f98ca5a, 2018-05-06 (annotated)
- 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?
| User | Revision | Line number | New 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 | }} |