ELEC2645 (2015/16)
/
Maze_Escape
Game Project by Mauro Aguiar/el14mma
main.cpp@1:32905b0858ac, 2016-05-05 (annotated)
- Committer:
- el14mma
- Date:
- Thu May 05 15:15:14 2016 +0000
- Revision:
- 1:32905b0858ac
- Parent:
- 0:026fa541af7a
Mauro Aguiar el14mma : Game Project "Maze Escape"
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
el14mma | 1:32905b0858ac | 1 | /* Maze Escape |
eencae | 0:026fa541af7a | 2 | |
el14mma | 1:32905b0858ac | 3 | Mauro Aguiar |
eencae | 0:026fa541af7a | 4 | */ |
eencae | 0:026fa541af7a | 5 | |
eencae | 0:026fa541af7a | 6 | #include "mbed.h" |
el14mma | 1:32905b0858ac | 7 | #include "N5110.h" |
eencae | 0:026fa541af7a | 8 | |
eencae | 0:026fa541af7a | 9 | // change this to alter tolerance of joystick direction |
eencae | 0:026fa541af7a | 10 | #define DIRECTION_TOLERANCE 0.05 |
eencae | 0:026fa541af7a | 11 | |
eencae | 0:026fa541af7a | 12 | // connections for joystick |
el14mma | 1:32905b0858ac | 13 | DigitalIn button(PTB11); |
el14mma | 1:32905b0858ac | 14 | AnalogIn xPot(PTB2); |
el14mma | 1:32905b0858ac | 15 | AnalogIn yPot(PTB3); |
el14mma | 1:32905b0858ac | 16 | |
el14mma | 1:32905b0858ac | 17 | N5110 lcd (PTE26 , PTA0 , PTC4 , PTD0 , PTD2 , PTD1 , PTC3); |
eencae | 0:026fa541af7a | 18 | |
eencae | 0:026fa541af7a | 19 | // timer to regularly read the joystick |
eencae | 0:026fa541af7a | 20 | Ticker pollJoystick; |
el14mma | 1:32905b0858ac | 21 | |
el14mma | 1:32905b0858ac | 22 | // timer to move the obstacle |
el14mma | 1:32905b0858ac | 23 | Ticker ticker; |
el14mma | 1:32905b0858ac | 24 | |
el14mma | 1:32905b0858ac | 25 | // timer to increase score and discharge energy |
el14mma | 1:32905b0858ac | 26 | Ticker ticker2; |
el14mma | 1:32905b0858ac | 27 | |
eencae | 0:026fa541af7a | 28 | // Serial for debug |
eencae | 0:026fa541af7a | 29 | Serial serial(USBTX,USBRX); |
eencae | 0:026fa541af7a | 30 | |
el14mma | 1:32905b0858ac | 31 | // menu is on mode |
el14mma | 1:32905b0858ac | 32 | |
el14mma | 1:32905b0858ac | 33 | int loading = 0; |
el14mma | 1:32905b0858ac | 34 | |
el14mma | 1:32905b0858ac | 35 | // origin coordinates for the cercle |
el14mma | 1:32905b0858ac | 36 | int a = 41; |
el14mma | 1:32905b0858ac | 37 | int b = 23; |
el14mma | 1:32905b0858ac | 38 | |
el14mma | 1:32905b0858ac | 39 | // Save variables |
el14mma | 1:32905b0858ac | 40 | |
el14mma | 1:32905b0858ac | 41 | int save1 = 1; |
el14mma | 1:32905b0858ac | 42 | int save2 = 1; |
el14mma | 1:32905b0858ac | 43 | int save3 = 1; |
el14mma | 1:32905b0858ac | 44 | int save4 = 1; |
el14mma | 1:32905b0858ac | 45 | int save5 = 1; |
el14mma | 1:32905b0858ac | 46 | |
el14mma | 1:32905b0858ac | 47 | // Initial obstacle speed |
el14mma | 1:32905b0858ac | 48 | |
el14mma | 1:32905b0858ac | 49 | float speed = 0.5; |
el14mma | 1:32905b0858ac | 50 | // Game Score |
el14mma | 1:32905b0858ac | 51 | |
el14mma | 1:32905b0858ac | 52 | int score = 0; |
el14mma | 1:32905b0858ac | 53 | |
el14mma | 1:32905b0858ac | 54 | // origin coordinates for obstacles |
el14mma | 1:32905b0858ac | 55 | |
el14mma | 1:32905b0858ac | 56 | int d1 = 1; |
el14mma | 1:32905b0858ac | 57 | |
el14mma | 1:32905b0858ac | 58 | int d2 = 1; |
el14mma | 1:32905b0858ac | 59 | |
el14mma | 1:32905b0858ac | 60 | int d3 = 1; |
el14mma | 1:32905b0858ac | 61 | |
el14mma | 1:32905b0858ac | 62 | int d4 = 83; |
el14mma | 1:32905b0858ac | 63 | |
el14mma | 1:32905b0858ac | 64 | int d5; |
el14mma | 1:32905b0858ac | 65 | |
el14mma | 1:32905b0858ac | 66 | int d6; |
el14mma | 1:32905b0858ac | 67 | |
el14mma | 1:32905b0858ac | 68 | int b1; |
el14mma | 1:32905b0858ac | 69 | |
el14mma | 1:32905b0858ac | 70 | int b2; |
el14mma | 1:32905b0858ac | 71 | |
el14mma | 1:32905b0858ac | 72 | int b3 = 0; |
el14mma | 1:32905b0858ac | 73 | |
el14mma | 1:32905b0858ac | 74 | int b4 = 47; |
el14mma | 1:32905b0858ac | 75 | |
el14mma | 1:32905b0858ac | 76 | // Energy needed for the player to use slow mode (must discharge to one) |
el14mma | 1:32905b0858ac | 77 | |
el14mma | 1:32905b0858ac | 78 | int energy = 20; |
el14mma | 1:32905b0858ac | 79 | |
el14mma | 1:32905b0858ac | 80 | // Random Obstacle decision by random variable and obstacles states |
el14mma | 1:32905b0858ac | 81 | |
el14mma | 1:32905b0858ac | 82 | int r = 0; |
el14mma | 1:32905b0858ac | 83 | |
el14mma | 1:32905b0858ac | 84 | int state1 = 0; |
el14mma | 1:32905b0858ac | 85 | int state2 = 0; |
el14mma | 1:32905b0858ac | 86 | int state3 = 0; |
el14mma | 1:32905b0858ac | 87 | int state4 = 0; |
el14mma | 1:32905b0858ac | 88 | int state5 = 0; |
el14mma | 1:32905b0858ac | 89 | int state6 = 0; |
el14mma | 1:32905b0858ac | 90 | |
el14mma | 1:32905b0858ac | 91 | // Variables used to check if the player touched an obstacle |
el14mma | 1:32905b0858ac | 92 | |
el14mma | 1:32905b0858ac | 93 | int hit = 0; |
el14mma | 1:32905b0858ac | 94 | int hit1 = 0; |
el14mma | 1:32905b0858ac | 95 | int hit2 = 0; |
el14mma | 1:32905b0858ac | 96 | int hit3 = 0; |
el14mma | 1:32905b0858ac | 97 | int hit4 = 0; |
el14mma | 1:32905b0858ac | 98 | int hit5 = 0; |
el14mma | 1:32905b0858ac | 99 | int hit6 = 0; |
el14mma | 1:32905b0858ac | 100 | int hit7 = 0; |
el14mma | 1:32905b0858ac | 101 | int hit8 = 0; |
el14mma | 1:32905b0858ac | 102 | |
el14mma | 1:32905b0858ac | 103 | |
eencae | 0:026fa541af7a | 104 | // create enumerated type (0,1,2,3 etc. for direction) |
eencae | 0:026fa541af7a | 105 | // could be extended for diagonals etc. |
eencae | 0:026fa541af7a | 106 | enum DirectionName { |
eencae | 0:026fa541af7a | 107 | UP, |
eencae | 0:026fa541af7a | 108 | DOWN, |
eencae | 0:026fa541af7a | 109 | LEFT, |
eencae | 0:026fa541af7a | 110 | RIGHT, |
eencae | 0:026fa541af7a | 111 | CENTRE, |
el14mma | 1:32905b0858ac | 112 | DIAGONAL_RIGHT_UP, |
el14mma | 1:32905b0858ac | 113 | DIAGONAL_RIGHT_DOWN, |
el14mma | 1:32905b0858ac | 114 | DIAGONAL_LEFT_UP, |
el14mma | 1:32905b0858ac | 115 | DIAGONAL_LEFT_DOWN, |
el14mma | 1:32905b0858ac | 116 | UNKNOWN, |
eencae | 0:026fa541af7a | 117 | }; |
eencae | 0:026fa541af7a | 118 | |
eencae | 0:026fa541af7a | 119 | // struct for Joystick |
eencae | 0:026fa541af7a | 120 | typedef struct JoyStick Joystick; |
eencae | 0:026fa541af7a | 121 | struct JoyStick { |
eencae | 0:026fa541af7a | 122 | float x; // current x value |
eencae | 0:026fa541af7a | 123 | float x0; // 'centred' x value |
eencae | 0:026fa541af7a | 124 | float y; // current y value |
eencae | 0:026fa541af7a | 125 | float y0; // 'centred' y value |
eencae | 0:026fa541af7a | 126 | int button; // button state (assume pull-down used, so 1 = pressed, 0 = unpressed) |
eencae | 0:026fa541af7a | 127 | DirectionName direction; // current direction |
eencae | 0:026fa541af7a | 128 | }; |
eencae | 0:026fa541af7a | 129 | // create struct variable |
eencae | 0:026fa541af7a | 130 | Joystick joystick; |
eencae | 0:026fa541af7a | 131 | |
eencae | 0:026fa541af7a | 132 | int printFlag = 0; |
eencae | 0:026fa541af7a | 133 | |
eencae | 0:026fa541af7a | 134 | // function prototypes |
eencae | 0:026fa541af7a | 135 | void calibrateJoystick(); |
eencae | 0:026fa541af7a | 136 | void updateJoystick(); |
el14mma | 1:32905b0858ac | 137 | void obstacle(); |
el14mma | 1:32905b0858ac | 138 | void lost(); |
el14mma | 1:32905b0858ac | 139 | void erase(); |
el14mma | 1:32905b0858ac | 140 | void erase2(); |
el14mma | 1:32905b0858ac | 141 | void erase3(); |
el14mma | 1:32905b0858ac | 142 | void erase4(); |
el14mma | 1:32905b0858ac | 143 | void erase5(); |
el14mma | 1:32905b0858ac | 144 | void update(); |
el14mma | 1:32905b0858ac | 145 | void menu(); |
eencae | 0:026fa541af7a | 146 | |
eencae | 0:026fa541af7a | 147 | int main() |
el14mma | 1:32905b0858ac | 148 | { |
eencae | 0:026fa541af7a | 149 | calibrateJoystick(); // get centred values of joystick |
el14mma | 1:32905b0858ac | 150 | pollJoystick.attach(&updateJoystick,1.0/11.0); // read joystick 12 times per second (faster than obstacle max speed ) |
el14mma | 1:32905b0858ac | 151 | lcd.init(); |
el14mma | 1:32905b0858ac | 152 | |
el14mma | 1:32905b0858ac | 153 | lcd.printString("Welcome to",0,1); |
el14mma | 1:32905b0858ac | 154 | lcd.printString("Maze Escape",0,2); |
el14mma | 1:32905b0858ac | 155 | lcd.printString("Press Button",0,3); |
el14mma | 1:32905b0858ac | 156 | lcd.printString("to Play",0,4); |
el14mma | 1:32905b0858ac | 157 | |
el14mma | 1:32905b0858ac | 158 | while ( button == 0 ) { |
el14mma | 1:32905b0858ac | 159 | |
el14mma | 1:32905b0858ac | 160 | sleep(); |
el14mma | 1:32905b0858ac | 161 | } |
el14mma | 1:32905b0858ac | 162 | |
el14mma | 1:32905b0858ac | 163 | lcd.clear(); |
el14mma | 1:32905b0858ac | 164 | lcd.drawCircle(a,b,2,0); |
el14mma | 1:32905b0858ac | 165 | |
el14mma | 1:32905b0858ac | 166 | // draw a line across the display at y = 47 pixels |
el14mma | 1:32905b0858ac | 167 | for (int i = 0; i < WIDTH; i++) { |
el14mma | 1:32905b0858ac | 168 | lcd.setPixel(i,47); |
el14mma | 1:32905b0858ac | 169 | } |
el14mma | 1:32905b0858ac | 170 | |
el14mma | 1:32905b0858ac | 171 | // draw a line across the display at x = 0 pixels |
el14mma | 1:32905b0858ac | 172 | for (int i = 0; i < WIDTH; i++) { |
el14mma | 1:32905b0858ac | 173 | lcd.setPixel(0,i); |
el14mma | 1:32905b0858ac | 174 | } |
el14mma | 1:32905b0858ac | 175 | |
el14mma | 1:32905b0858ac | 176 | // draw a line across the display at y = 0 pixels |
el14mma | 1:32905b0858ac | 177 | for (int i = 0; i < WIDTH; i++) { |
el14mma | 1:32905b0858ac | 178 | lcd.setPixel(i,0); |
el14mma | 1:32905b0858ac | 179 | } |
el14mma | 1:32905b0858ac | 180 | |
el14mma | 1:32905b0858ac | 181 | // draw a line across the display at x = 83 pixels |
el14mma | 1:32905b0858ac | 182 | for (int i = 0; i < WIDTH; i++) { |
el14mma | 1:32905b0858ac | 183 | lcd.setPixel(83,i); |
el14mma | 1:32905b0858ac | 184 | } |
el14mma | 1:32905b0858ac | 185 | |
el14mma | 1:32905b0858ac | 186 | ticker.attach(&obstacle,speed); // Obstacle speed |
el14mma | 1:32905b0858ac | 187 | ticker2.attach(&update,1); // points gain and energy discharge speed |
el14mma | 1:32905b0858ac | 188 | |
el14mma | 1:32905b0858ac | 189 | lcd.refresh(); |
el14mma | 1:32905b0858ac | 190 | |
eencae | 0:026fa541af7a | 191 | |
eencae | 0:026fa541af7a | 192 | while(1) { |
el14mma | 1:32905b0858ac | 193 | |
el14mma | 1:32905b0858ac | 194 | if (button == energy) { // Button pressed <=> Slow mode activated |
el14mma | 1:32905b0858ac | 195 | |
el14mma | 1:32905b0858ac | 196 | speed = 2; |
el14mma | 1:32905b0858ac | 197 | |
el14mma | 1:32905b0858ac | 198 | ticker.detach(); |
el14mma | 1:32905b0858ac | 199 | |
el14mma | 1:32905b0858ac | 200 | ticker.attach(&obstacle,speed); // New Obstacle speed |
el14mma | 1:32905b0858ac | 201 | |
el14mma | 1:32905b0858ac | 202 | energy = 20; // energy is recharged so the slow mode can only be used in 20 seconds. |
el14mma | 1:32905b0858ac | 203 | |
el14mma | 1:32905b0858ac | 204 | // reset saves |
el14mma | 1:32905b0858ac | 205 | save1 = 1; |
el14mma | 1:32905b0858ac | 206 | save2 = 1; |
el14mma | 1:32905b0858ac | 207 | save3 = 1; |
el14mma | 1:32905b0858ac | 208 | save4 = 1; |
el14mma | 1:32905b0858ac | 209 | save5 = 1; |
el14mma | 1:32905b0858ac | 210 | } |
eencae | 0:026fa541af7a | 211 | |
eencae | 0:026fa541af7a | 212 | if (printFlag) { // if flag set, clear flag and print joystick values to serial port |
eencae | 0:026fa541af7a | 213 | printFlag = 0; |
eencae | 0:026fa541af7a | 214 | serial.printf("x = %f y = %f button = %d ",joystick.x,joystick.y,joystick.button); |
eencae | 0:026fa541af7a | 215 | |
eencae | 0:026fa541af7a | 216 | // check joystick direction |
el14mma | 1:32905b0858ac | 217 | if (joystick.direction == DOWN) |
el14mma | 1:32905b0858ac | 218 | { |
el14mma | 1:32905b0858ac | 219 | if (loading == 0) { |
el14mma | 1:32905b0858ac | 220 | serial.printf(" DOWN\n"); |
el14mma | 1:32905b0858ac | 221 | erase(); |
el14mma | 1:32905b0858ac | 222 | b=b-2; |
el14mma | 1:32905b0858ac | 223 | lost(); |
el14mma | 1:32905b0858ac | 224 | if (hit ==0) { |
el14mma | 1:32905b0858ac | 225 | lcd.drawCircle(a,b,2,0); |
el14mma | 1:32905b0858ac | 226 | } |
el14mma | 1:32905b0858ac | 227 | lcd.refresh();}} |
el14mma | 1:32905b0858ac | 228 | |
eencae | 0:026fa541af7a | 229 | if (joystick.direction == UP) |
el14mma | 1:32905b0858ac | 230 | { |
el14mma | 1:32905b0858ac | 231 | if (loading == 0) { |
eencae | 0:026fa541af7a | 232 | serial.printf(" UP\n"); |
el14mma | 1:32905b0858ac | 233 | erase(); |
el14mma | 1:32905b0858ac | 234 | b=b+2; |
el14mma | 1:32905b0858ac | 235 | lost(); |
el14mma | 1:32905b0858ac | 236 | if (hit ==0) { |
el14mma | 1:32905b0858ac | 237 | lcd.drawCircle(a,b,2,0); |
el14mma | 1:32905b0858ac | 238 | } |
el14mma | 1:32905b0858ac | 239 | lcd.refresh();}} |
el14mma | 1:32905b0858ac | 240 | |
el14mma | 1:32905b0858ac | 241 | if (joystick.direction == RIGHT) |
el14mma | 1:32905b0858ac | 242 | { |
el14mma | 1:32905b0858ac | 243 | if (loading == 0) { |
el14mma | 1:32905b0858ac | 244 | serial.printf(" RIGHT\n"); |
el14mma | 1:32905b0858ac | 245 | erase(); |
el14mma | 1:32905b0858ac | 246 | a=a+2; |
el14mma | 1:32905b0858ac | 247 | lost(); |
el14mma | 1:32905b0858ac | 248 | if (hit ==0) { |
el14mma | 1:32905b0858ac | 249 | lcd.drawCircle(a,b,2,0); |
el14mma | 1:32905b0858ac | 250 | } |
el14mma | 1:32905b0858ac | 251 | lcd.refresh();}} |
el14mma | 1:32905b0858ac | 252 | |
eencae | 0:026fa541af7a | 253 | if (joystick.direction == LEFT) |
el14mma | 1:32905b0858ac | 254 | { |
el14mma | 1:32905b0858ac | 255 | if (loading == 0) { |
eencae | 0:026fa541af7a | 256 | serial.printf(" LEFT\n"); |
el14mma | 1:32905b0858ac | 257 | erase(); |
el14mma | 1:32905b0858ac | 258 | a=a-2; |
el14mma | 1:32905b0858ac | 259 | lost(); |
el14mma | 1:32905b0858ac | 260 | if (hit ==0) { |
el14mma | 1:32905b0858ac | 261 | lcd.drawCircle(a,b,2,0); |
el14mma | 1:32905b0858ac | 262 | } |
el14mma | 1:32905b0858ac | 263 | lcd.refresh();}} |
el14mma | 1:32905b0858ac | 264 | |
el14mma | 1:32905b0858ac | 265 | if (joystick.direction == DIAGONAL_RIGHT_UP) |
el14mma | 1:32905b0858ac | 266 | { |
el14mma | 1:32905b0858ac | 267 | if (loading == 0) { |
el14mma | 1:32905b0858ac | 268 | serial.printf(" DIAGONAL-RIGHT-UP\n"); |
el14mma | 1:32905b0858ac | 269 | erase(); |
el14mma | 1:32905b0858ac | 270 | a=a+2; |
el14mma | 1:32905b0858ac | 271 | b=b+2; |
el14mma | 1:32905b0858ac | 272 | lost(); |
el14mma | 1:32905b0858ac | 273 | if (hit ==0) { |
el14mma | 1:32905b0858ac | 274 | lcd.drawCircle(a,b,2,0); |
el14mma | 1:32905b0858ac | 275 | } |
el14mma | 1:32905b0858ac | 276 | lcd.refresh();}} |
el14mma | 1:32905b0858ac | 277 | |
el14mma | 1:32905b0858ac | 278 | if (joystick.direction == DIAGONAL_RIGHT_DOWN) |
el14mma | 1:32905b0858ac | 279 | { |
el14mma | 1:32905b0858ac | 280 | if (loading == 0) { |
el14mma | 1:32905b0858ac | 281 | serial.printf(" DIAGONAL-RIGHT-DOWN\n"); |
el14mma | 1:32905b0858ac | 282 | erase(); |
el14mma | 1:32905b0858ac | 283 | a=a+2; |
el14mma | 1:32905b0858ac | 284 | b=b-2; |
el14mma | 1:32905b0858ac | 285 | lost(); |
el14mma | 1:32905b0858ac | 286 | if (hit ==0) { |
el14mma | 1:32905b0858ac | 287 | lcd.drawCircle(a,b,2,0); |
el14mma | 1:32905b0858ac | 288 | } |
el14mma | 1:32905b0858ac | 289 | lcd.refresh();}} |
el14mma | 1:32905b0858ac | 290 | |
el14mma | 1:32905b0858ac | 291 | if (joystick.direction == DIAGONAL_LEFT_UP) |
el14mma | 1:32905b0858ac | 292 | { |
el14mma | 1:32905b0858ac | 293 | if (loading == 0) { |
el14mma | 1:32905b0858ac | 294 | serial.printf(" DIAGONAL-LEFT-UP\n"); |
el14mma | 1:32905b0858ac | 295 | erase(); |
el14mma | 1:32905b0858ac | 296 | a=a-2; |
el14mma | 1:32905b0858ac | 297 | b=b+2; |
el14mma | 1:32905b0858ac | 298 | lost(); |
el14mma | 1:32905b0858ac | 299 | if (hit ==0) { |
el14mma | 1:32905b0858ac | 300 | lcd.drawCircle(a,b,2,0); |
el14mma | 1:32905b0858ac | 301 | } |
el14mma | 1:32905b0858ac | 302 | lcd.refresh();}} |
el14mma | 1:32905b0858ac | 303 | |
el14mma | 1:32905b0858ac | 304 | if (joystick.direction == DIAGONAL_LEFT_DOWN) |
el14mma | 1:32905b0858ac | 305 | { |
el14mma | 1:32905b0858ac | 306 | if (loading == 0) { |
el14mma | 1:32905b0858ac | 307 | serial.printf(" DIAGONAL-RIGHT-UP\n"); |
el14mma | 1:32905b0858ac | 308 | erase(); |
el14mma | 1:32905b0858ac | 309 | a=a-2; |
el14mma | 1:32905b0858ac | 310 | b=b-2; |
el14mma | 1:32905b0858ac | 311 | lost(); |
el14mma | 1:32905b0858ac | 312 | if (hit ==0) { |
el14mma | 1:32905b0858ac | 313 | lcd.drawCircle(a,b,2,0); |
el14mma | 1:32905b0858ac | 314 | } |
el14mma | 1:32905b0858ac | 315 | lcd.refresh();}} |
el14mma | 1:32905b0858ac | 316 | |
eencae | 0:026fa541af7a | 317 | if (joystick.direction == CENTRE) |
el14mma | 1:32905b0858ac | 318 | { |
el14mma | 1:32905b0858ac | 319 | if (loading == 0) { |
eencae | 0:026fa541af7a | 320 | serial.printf(" CENTRE\n"); |
el14mma | 1:32905b0858ac | 321 | erase(); |
el14mma | 1:32905b0858ac | 322 | b=b-1; |
el14mma | 1:32905b0858ac | 323 | lost(); |
el14mma | 1:32905b0858ac | 324 | if (hit ==0) { |
el14mma | 1:32905b0858ac | 325 | lcd.drawCircle(a,b,2,0); |
el14mma | 1:32905b0858ac | 326 | } |
el14mma | 1:32905b0858ac | 327 | lcd.refresh(); |
el14mma | 1:32905b0858ac | 328 | }} |
el14mma | 1:32905b0858ac | 329 | |
el14mma | 1:32905b0858ac | 330 | |
eencae | 0:026fa541af7a | 331 | if (joystick.direction == UNKNOWN) |
el14mma | 1:32905b0858ac | 332 | {serial.printf(" Unsupported direction\n");} |
el14mma | 1:32905b0858ac | 333 | |
eencae | 0:026fa541af7a | 334 | |
eencae | 0:026fa541af7a | 335 | } |
el14mma | 1:32905b0858ac | 336 | |
el14mma | 1:32905b0858ac | 337 | } |
eencae | 0:026fa541af7a | 338 | |
eencae | 0:026fa541af7a | 339 | } |
eencae | 0:026fa541af7a | 340 | |
eencae | 0:026fa541af7a | 341 | // read default positions of the joystick to calibrate later readings |
eencae | 0:026fa541af7a | 342 | void calibrateJoystick() |
eencae | 0:026fa541af7a | 343 | { |
eencae | 0:026fa541af7a | 344 | button.mode(PullDown); |
eencae | 0:026fa541af7a | 345 | // must not move during calibration |
eencae | 0:026fa541af7a | 346 | joystick.x0 = xPot; // initial positions in the range 0.0 to 1.0 (0.5 if centred exactly) |
eencae | 0:026fa541af7a | 347 | joystick.y0 = yPot; |
eencae | 0:026fa541af7a | 348 | } |
eencae | 0:026fa541af7a | 349 | void updateJoystick() |
eencae | 0:026fa541af7a | 350 | { |
eencae | 0:026fa541af7a | 351 | // read current joystick values relative to calibrated values (in range -0.5 to 0.5, 0.0 is centred) |
eencae | 0:026fa541af7a | 352 | joystick.x = xPot - joystick.x0; |
eencae | 0:026fa541af7a | 353 | joystick.y = yPot - joystick.y0; |
eencae | 0:026fa541af7a | 354 | // read button state |
eencae | 0:026fa541af7a | 355 | joystick.button = button; |
eencae | 0:026fa541af7a | 356 | |
el14mma | 1:32905b0858ac | 357 | // calculate direction depending on x,y values |
eencae | 0:026fa541af7a | 358 | // tolerance allows a little lee-way in case joystick not exactly in the stated direction |
eencae | 0:026fa541af7a | 359 | if ( fabs(joystick.y) < DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) { |
el14mma | 1:32905b0858ac | 360 | joystick.direction = CENTRE; |
el14mma | 1:32905b0858ac | 361 | |
eencae | 0:026fa541af7a | 362 | } else if ( joystick.y > DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) { |
el14mma | 1:32905b0858ac | 363 | joystick.direction = DOWN; // inverted because of screen |
el14mma | 1:32905b0858ac | 364 | |
eencae | 0:026fa541af7a | 365 | } else if ( joystick.y < DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) { |
el14mma | 1:32905b0858ac | 366 | joystick.direction = UP; // inverted because of screen |
el14mma | 1:32905b0858ac | 367 | |
eencae | 0:026fa541af7a | 368 | } else if ( joystick.x > DIRECTION_TOLERANCE && fabs(joystick.y) < DIRECTION_TOLERANCE) { |
el14mma | 1:32905b0858ac | 369 | joystick.direction = LEFT; |
el14mma | 1:32905b0858ac | 370 | |
eencae | 0:026fa541af7a | 371 | } else if ( joystick.x < DIRECTION_TOLERANCE && fabs(joystick.y) < DIRECTION_TOLERANCE) { |
el14mma | 1:32905b0858ac | 372 | joystick.direction = RIGHT; |
el14mma | 1:32905b0858ac | 373 | |
el14mma | 1:32905b0858ac | 374 | } else if ( joystick.x < DIRECTION_TOLERANCE && joystick.y < DIRECTION_TOLERANCE) { |
el14mma | 1:32905b0858ac | 375 | joystick.direction = DIAGONAL_RIGHT_UP; |
el14mma | 1:32905b0858ac | 376 | |
el14mma | 1:32905b0858ac | 377 | } else if ( joystick.x < DIRECTION_TOLERANCE && joystick.y > DIRECTION_TOLERANCE) { |
el14mma | 1:32905b0858ac | 378 | joystick.direction = DIAGONAL_RIGHT_DOWN; |
el14mma | 1:32905b0858ac | 379 | |
el14mma | 1:32905b0858ac | 380 | } else if ( joystick.x > DIRECTION_TOLERANCE && joystick.y < DIRECTION_TOLERANCE) { |
el14mma | 1:32905b0858ac | 381 | joystick.direction = DIAGONAL_LEFT_UP; |
el14mma | 1:32905b0858ac | 382 | } |
el14mma | 1:32905b0858ac | 383 | |
el14mma | 1:32905b0858ac | 384 | else if ( joystick.x > DIRECTION_TOLERANCE && joystick.y > DIRECTION_TOLERANCE) { |
el14mma | 1:32905b0858ac | 385 | joystick.direction = DIAGONAL_LEFT_DOWN; |
el14mma | 1:32905b0858ac | 386 | } |
el14mma | 1:32905b0858ac | 387 | |
el14mma | 1:32905b0858ac | 388 | else { |
el14mma | 1:32905b0858ac | 389 | joystick.direction = UNKNOWN; // In case the reading is not accurate |
eencae | 0:026fa541af7a | 390 | } |
eencae | 0:026fa541af7a | 391 | |
eencae | 0:026fa541af7a | 392 | // set flag for printing |
eencae | 0:026fa541af7a | 393 | printFlag = 1; |
el14mma | 1:32905b0858ac | 394 | } |
el14mma | 1:32905b0858ac | 395 | void obstacle() |
el14mma | 1:32905b0858ac | 396 | { |
el14mma | 1:32905b0858ac | 397 | if (score > 15 && score <= 30 ) { |
el14mma | 1:32905b0858ac | 398 | |
el14mma | 1:32905b0858ac | 399 | if (save1 == 1) { // only happens once |
el14mma | 1:32905b0858ac | 400 | |
el14mma | 1:32905b0858ac | 401 | save1 = 0; |
el14mma | 1:32905b0858ac | 402 | |
el14mma | 1:32905b0858ac | 403 | speed = 0.4; |
el14mma | 1:32905b0858ac | 404 | |
el14mma | 1:32905b0858ac | 405 | ticker.detach(); |
el14mma | 1:32905b0858ac | 406 | |
el14mma | 1:32905b0858ac | 407 | ticker.attach(&obstacle,speed); // New Obstacle speed |
el14mma | 1:32905b0858ac | 408 | |
el14mma | 1:32905b0858ac | 409 | } |
el14mma | 1:32905b0858ac | 410 | |
el14mma | 1:32905b0858ac | 411 | } |
el14mma | 1:32905b0858ac | 412 | |
el14mma | 1:32905b0858ac | 413 | else if (score >30 && score<=50) { |
el14mma | 1:32905b0858ac | 414 | |
el14mma | 1:32905b0858ac | 415 | if (save2 == 1) { |
el14mma | 1:32905b0858ac | 416 | |
el14mma | 1:32905b0858ac | 417 | save2 = 0; |
el14mma | 1:32905b0858ac | 418 | |
el14mma | 1:32905b0858ac | 419 | speed = 0.3; |
el14mma | 1:32905b0858ac | 420 | |
el14mma | 1:32905b0858ac | 421 | ticker.detach(); |
el14mma | 1:32905b0858ac | 422 | |
el14mma | 1:32905b0858ac | 423 | ticker.attach(&obstacle,speed); // New Obstacle speed |
el14mma | 1:32905b0858ac | 424 | |
el14mma | 1:32905b0858ac | 425 | } |
el14mma | 1:32905b0858ac | 426 | } |
el14mma | 1:32905b0858ac | 427 | |
el14mma | 1:32905b0858ac | 428 | else if (score>50 && score<=80) { |
el14mma | 1:32905b0858ac | 429 | |
el14mma | 1:32905b0858ac | 430 | if (save3 == 1); { |
el14mma | 1:32905b0858ac | 431 | |
el14mma | 1:32905b0858ac | 432 | save3 = 0; |
el14mma | 1:32905b0858ac | 433 | |
el14mma | 1:32905b0858ac | 434 | speed = 0.2; |
el14mma | 1:32905b0858ac | 435 | |
el14mma | 1:32905b0858ac | 436 | ticker.detach(); |
el14mma | 1:32905b0858ac | 437 | |
el14mma | 1:32905b0858ac | 438 | ticker.attach(&obstacle,speed); // New Obstacle speed |
el14mma | 1:32905b0858ac | 439 | |
el14mma | 1:32905b0858ac | 440 | } |
el14mma | 1:32905b0858ac | 441 | } |
el14mma | 1:32905b0858ac | 442 | |
el14mma | 1:32905b0858ac | 443 | else if (score>80 && score<=110) { |
el14mma | 1:32905b0858ac | 444 | |
el14mma | 1:32905b0858ac | 445 | if (save4 == 1) { |
el14mma | 1:32905b0858ac | 446 | |
el14mma | 1:32905b0858ac | 447 | save4 = 0; |
el14mma | 1:32905b0858ac | 448 | |
el14mma | 1:32905b0858ac | 449 | speed = 0.15; |
el14mma | 1:32905b0858ac | 450 | |
el14mma | 1:32905b0858ac | 451 | ticker.detach(); |
el14mma | 1:32905b0858ac | 452 | |
el14mma | 1:32905b0858ac | 453 | ticker.attach(&obstacle,speed); // New Obstacle speed |
el14mma | 1:32905b0858ac | 454 | |
el14mma | 1:32905b0858ac | 455 | } |
el14mma | 1:32905b0858ac | 456 | } |
el14mma | 1:32905b0858ac | 457 | else if (score>110) { // Fastest mode |
el14mma | 1:32905b0858ac | 458 | |
el14mma | 1:32905b0858ac | 459 | if (save5 == 1) { |
el14mma | 1:32905b0858ac | 460 | |
el14mma | 1:32905b0858ac | 461 | save5 = 0; |
el14mma | 1:32905b0858ac | 462 | |
el14mma | 1:32905b0858ac | 463 | speed = 0.1; |
el14mma | 1:32905b0858ac | 464 | |
el14mma | 1:32905b0858ac | 465 | ticker.detach(); |
el14mma | 1:32905b0858ac | 466 | |
el14mma | 1:32905b0858ac | 467 | ticker.attach(&obstacle,speed); // New Obstacle speed |
el14mma | 1:32905b0858ac | 468 | |
el14mma | 1:32905b0858ac | 469 | } |
el14mma | 1:32905b0858ac | 470 | |
el14mma | 1:32905b0858ac | 471 | } |
el14mma | 1:32905b0858ac | 472 | |
el14mma | 1:32905b0858ac | 473 | if (d2-d1>10 || d1-d2>10) { // minimun distance |
el14mma | 1:32905b0858ac | 474 | |
el14mma | 1:32905b0858ac | 475 | r = rand() %6; // generate random number between 0 and 5 for obstacle |
el14mma | 1:32905b0858ac | 476 | |
el14mma | 1:32905b0858ac | 477 | } |
el14mma | 1:32905b0858ac | 478 | |
el14mma | 1:32905b0858ac | 479 | if (r == 0 || state1 == 1) { // obstacle 1 |
el14mma | 1:32905b0858ac | 480 | |
el14mma | 1:32905b0858ac | 481 | if (state1 == 0) { // once |
el14mma | 1:32905b0858ac | 482 | |
el14mma | 1:32905b0858ac | 483 | // draw a line across the display at y = 0 pixels |
el14mma | 1:32905b0858ac | 484 | for (int i = 0; i < WIDTH; i++) { |
el14mma | 1:32905b0858ac | 485 | lcd.setPixel(i,0); |
el14mma | 1:32905b0858ac | 486 | } |
el14mma | 1:32905b0858ac | 487 | |
el14mma | 1:32905b0858ac | 488 | } |
el14mma | 1:32905b0858ac | 489 | |
el14mma | 1:32905b0858ac | 490 | if (d1<47) { // less than maximun vertical pixels |
el14mma | 1:32905b0858ac | 491 | |
el14mma | 1:32905b0858ac | 492 | state1 = 1; // on |
el14mma | 1:32905b0858ac | 493 | |
el14mma | 1:32905b0858ac | 494 | // erase previous line |
el14mma | 1:32905b0858ac | 495 | for (int i = 41; i < 83; i++) { |
el14mma | 1:32905b0858ac | 496 | lcd.clearPixel(i,d1); |
el14mma | 1:32905b0858ac | 497 | } |
el14mma | 1:32905b0858ac | 498 | |
el14mma | 1:32905b0858ac | 499 | d1=d1+1; |
el14mma | 1:32905b0858ac | 500 | |
el14mma | 1:32905b0858ac | 501 | lcd.drawLine(83,d1,41,d1,1); |
el14mma | 1:32905b0858ac | 502 | |
el14mma | 1:32905b0858ac | 503 | lcd.refresh(); |
el14mma | 1:32905b0858ac | 504 | |
el14mma | 1:32905b0858ac | 505 | |
el14mma | 1:32905b0858ac | 506 | } |
el14mma | 1:32905b0858ac | 507 | |
el14mma | 1:32905b0858ac | 508 | else { |
el14mma | 1:32905b0858ac | 509 | |
el14mma | 1:32905b0858ac | 510 | d1 = 1; |
el14mma | 1:32905b0858ac | 511 | |
el14mma | 1:32905b0858ac | 512 | state1 = 0; // off |
el14mma | 1:32905b0858ac | 513 | |
el14mma | 1:32905b0858ac | 514 | } |
el14mma | 1:32905b0858ac | 515 | } |
el14mma | 1:32905b0858ac | 516 | |
el14mma | 1:32905b0858ac | 517 | if (r==1 || state2 == 1) { // obstacle 2 |
el14mma | 1:32905b0858ac | 518 | |
el14mma | 1:32905b0858ac | 519 | if (d2<47) { // less than maximun vertical pixels |
el14mma | 1:32905b0858ac | 520 | |
el14mma | 1:32905b0858ac | 521 | state2 = 1; // on |
el14mma | 1:32905b0858ac | 522 | |
el14mma | 1:32905b0858ac | 523 | // erase previous line |
el14mma | 1:32905b0858ac | 524 | for (int i = 1; i < 42; i++) { |
el14mma | 1:32905b0858ac | 525 | lcd.clearPixel(i,d2); |
el14mma | 1:32905b0858ac | 526 | } |
el14mma | 1:32905b0858ac | 527 | |
el14mma | 1:32905b0858ac | 528 | d2=d2+1; |
el14mma | 1:32905b0858ac | 529 | |
el14mma | 1:32905b0858ac | 530 | lcd.drawLine(41,d2,0,d2,1); |
el14mma | 1:32905b0858ac | 531 | |
el14mma | 1:32905b0858ac | 532 | lcd.refresh(); |
el14mma | 1:32905b0858ac | 533 | |
el14mma | 1:32905b0858ac | 534 | |
el14mma | 1:32905b0858ac | 535 | } |
el14mma | 1:32905b0858ac | 536 | |
el14mma | 1:32905b0858ac | 537 | else { |
el14mma | 1:32905b0858ac | 538 | |
el14mma | 1:32905b0858ac | 539 | d2 = 1; |
el14mma | 1:32905b0858ac | 540 | |
el14mma | 1:32905b0858ac | 541 | state2 = 0; // off |
el14mma | 1:32905b0858ac | 542 | |
el14mma | 1:32905b0858ac | 543 | } |
el14mma | 1:32905b0858ac | 544 | } |
el14mma | 1:32905b0858ac | 545 | |
el14mma | 1:32905b0858ac | 546 | if (r==2 || state3 == 1) { // obstacle 3 |
el14mma | 1:32905b0858ac | 547 | |
el14mma | 1:32905b0858ac | 548 | if (state3 == 0) { // Only happens once inside the loop |
el14mma | 1:32905b0858ac | 549 | |
el14mma | 1:32905b0858ac | 550 | b1 = b; |
el14mma | 1:32905b0858ac | 551 | } |
el14mma | 1:32905b0858ac | 552 | |
el14mma | 1:32905b0858ac | 553 | if (d3<84) { // less than maximun horizontal pixels |
el14mma | 1:32905b0858ac | 554 | |
el14mma | 1:32905b0858ac | 555 | state3 = 1; // on |
el14mma | 1:32905b0858ac | 556 | |
el14mma | 1:32905b0858ac | 557 | // erase previous circle |
el14mma | 1:32905b0858ac | 558 | erase2(); |
el14mma | 1:32905b0858ac | 559 | |
el14mma | 1:32905b0858ac | 560 | d3=d3+2; |
el14mma | 1:32905b0858ac | 561 | |
el14mma | 1:32905b0858ac | 562 | lcd.drawCircle(d3,b1,2,0); |
el14mma | 1:32905b0858ac | 563 | |
el14mma | 1:32905b0858ac | 564 | lcd.refresh(); |
el14mma | 1:32905b0858ac | 565 | |
el14mma | 1:32905b0858ac | 566 | |
el14mma | 1:32905b0858ac | 567 | } |
el14mma | 1:32905b0858ac | 568 | |
el14mma | 1:32905b0858ac | 569 | else { |
el14mma | 1:32905b0858ac | 570 | |
el14mma | 1:32905b0858ac | 571 | d3 = 1; |
el14mma | 1:32905b0858ac | 572 | |
el14mma | 1:32905b0858ac | 573 | state3 = 0; // off |
el14mma | 1:32905b0858ac | 574 | |
el14mma | 1:32905b0858ac | 575 | } |
el14mma | 1:32905b0858ac | 576 | |
el14mma | 1:32905b0858ac | 577 | } |
el14mma | 1:32905b0858ac | 578 | |
el14mma | 1:32905b0858ac | 579 | if (r==3 || state4 == 1) { // obstacle 4 |
el14mma | 1:32905b0858ac | 580 | |
el14mma | 1:32905b0858ac | 581 | if (state4 == 0) { // Only happens once inside the loop |
el14mma | 1:32905b0858ac | 582 | |
el14mma | 1:32905b0858ac | 583 | b2 = b; |
el14mma | 1:32905b0858ac | 584 | } |
el14mma | 1:32905b0858ac | 585 | |
el14mma | 1:32905b0858ac | 586 | if (d4>=0) { // minimun horizontal pixels |
el14mma | 1:32905b0858ac | 587 | |
el14mma | 1:32905b0858ac | 588 | state4 = 1; // on |
el14mma | 1:32905b0858ac | 589 | |
el14mma | 1:32905b0858ac | 590 | // erase previous circle |
el14mma | 1:32905b0858ac | 591 | erase3(); |
el14mma | 1:32905b0858ac | 592 | |
el14mma | 1:32905b0858ac | 593 | d4=d4-2; |
el14mma | 1:32905b0858ac | 594 | |
el14mma | 1:32905b0858ac | 595 | lcd.drawCircle(d4,b2,2,0); |
el14mma | 1:32905b0858ac | 596 | |
el14mma | 1:32905b0858ac | 597 | lcd.refresh(); |
el14mma | 1:32905b0858ac | 598 | |
el14mma | 1:32905b0858ac | 599 | |
el14mma | 1:32905b0858ac | 600 | } |
el14mma | 1:32905b0858ac | 601 | |
el14mma | 1:32905b0858ac | 602 | else { |
el14mma | 1:32905b0858ac | 603 | |
el14mma | 1:32905b0858ac | 604 | d4 = 83; |
el14mma | 1:32905b0858ac | 605 | |
el14mma | 1:32905b0858ac | 606 | state4 = 0; // off |
el14mma | 1:32905b0858ac | 607 | |
el14mma | 1:32905b0858ac | 608 | } |
el14mma | 1:32905b0858ac | 609 | |
el14mma | 1:32905b0858ac | 610 | } |
el14mma | 1:32905b0858ac | 611 | |
el14mma | 1:32905b0858ac | 612 | if (r==4 || state5 == 1) { // obstacle 5 |
el14mma | 1:32905b0858ac | 613 | |
el14mma | 1:32905b0858ac | 614 | if (state5 == 0) { // Only happens once inside the loop |
el14mma | 1:32905b0858ac | 615 | |
el14mma | 1:32905b0858ac | 616 | d5 = a; |
el14mma | 1:32905b0858ac | 617 | } |
el14mma | 1:32905b0858ac | 618 | |
el14mma | 1:32905b0858ac | 619 | if (b3<47) { // minimun vertical pixels |
el14mma | 1:32905b0858ac | 620 | |
el14mma | 1:32905b0858ac | 621 | state5 = 1; // on |
el14mma | 1:32905b0858ac | 622 | |
el14mma | 1:32905b0858ac | 623 | // erase previous circle |
el14mma | 1:32905b0858ac | 624 | erase4(); |
el14mma | 1:32905b0858ac | 625 | |
el14mma | 1:32905b0858ac | 626 | b3=b3+2; |
el14mma | 1:32905b0858ac | 627 | |
el14mma | 1:32905b0858ac | 628 | lcd.drawCircle(d5,b3,2,0); |
el14mma | 1:32905b0858ac | 629 | |
el14mma | 1:32905b0858ac | 630 | lcd.refresh(); |
el14mma | 1:32905b0858ac | 631 | |
el14mma | 1:32905b0858ac | 632 | |
el14mma | 1:32905b0858ac | 633 | } |
el14mma | 1:32905b0858ac | 634 | |
el14mma | 1:32905b0858ac | 635 | else { |
el14mma | 1:32905b0858ac | 636 | |
el14mma | 1:32905b0858ac | 637 | b3 = 0; |
el14mma | 1:32905b0858ac | 638 | |
el14mma | 1:32905b0858ac | 639 | state5 = 0; // off |
el14mma | 1:32905b0858ac | 640 | |
el14mma | 1:32905b0858ac | 641 | } |
el14mma | 1:32905b0858ac | 642 | |
el14mma | 1:32905b0858ac | 643 | } |
el14mma | 1:32905b0858ac | 644 | |
el14mma | 1:32905b0858ac | 645 | if (r==5 || state6 == 1) { // obstacle 6 |
el14mma | 1:32905b0858ac | 646 | |
el14mma | 1:32905b0858ac | 647 | if (state6 == 0) { // Only happens once inside the loop |
el14mma | 1:32905b0858ac | 648 | |
el14mma | 1:32905b0858ac | 649 | d6 = a; |
el14mma | 1:32905b0858ac | 650 | } |
el14mma | 1:32905b0858ac | 651 | |
el14mma | 1:32905b0858ac | 652 | if (b4>=0) { |
el14mma | 1:32905b0858ac | 653 | |
el14mma | 1:32905b0858ac | 654 | state6 = 1; // on |
el14mma | 1:32905b0858ac | 655 | |
el14mma | 1:32905b0858ac | 656 | // erase previous circle |
el14mma | 1:32905b0858ac | 657 | erase5(); |
el14mma | 1:32905b0858ac | 658 | |
el14mma | 1:32905b0858ac | 659 | b4=b4-2; |
el14mma | 1:32905b0858ac | 660 | |
el14mma | 1:32905b0858ac | 661 | lcd.drawCircle(d6,b4,2,0); |
el14mma | 1:32905b0858ac | 662 | |
el14mma | 1:32905b0858ac | 663 | lcd.refresh(); |
el14mma | 1:32905b0858ac | 664 | |
el14mma | 1:32905b0858ac | 665 | |
el14mma | 1:32905b0858ac | 666 | } |
el14mma | 1:32905b0858ac | 667 | |
el14mma | 1:32905b0858ac | 668 | else { |
el14mma | 1:32905b0858ac | 669 | |
el14mma | 1:32905b0858ac | 670 | b4 = 47; |
el14mma | 1:32905b0858ac | 671 | |
el14mma | 1:32905b0858ac | 672 | state6 = 0; // off |
el14mma | 1:32905b0858ac | 673 | |
el14mma | 1:32905b0858ac | 674 | } |
el14mma | 1:32905b0858ac | 675 | |
el14mma | 1:32905b0858ac | 676 | } |
el14mma | 1:32905b0858ac | 677 | |
el14mma | 1:32905b0858ac | 678 | } |
el14mma | 1:32905b0858ac | 679 | |
el14mma | 1:32905b0858ac | 680 | |
el14mma | 1:32905b0858ac | 681 | |
el14mma | 1:32905b0858ac | 682 | void lost() // Check if player lost |
el14mma | 1:32905b0858ac | 683 | { |
el14mma | 1:32905b0858ac | 684 | int x = 2; |
el14mma | 1:32905b0858ac | 685 | |
el14mma | 1:32905b0858ac | 686 | int y = 0; |
el14mma | 1:32905b0858ac | 687 | |
el14mma | 1:32905b0858ac | 688 | int radiusError = 1-x; |
el14mma | 1:32905b0858ac | 689 | |
el14mma | 1:32905b0858ac | 690 | while(x >= y) { |
el14mma | 1:32905b0858ac | 691 | |
el14mma | 1:32905b0858ac | 692 | // Check if the pixels where the player move to are clear |
el14mma | 1:32905b0858ac | 693 | |
el14mma | 1:32905b0858ac | 694 | hit1 = lcd.getPixel( x + a, y + b); |
el14mma | 1:32905b0858ac | 695 | hit2 = lcd.getPixel(-x + a, y + b); |
el14mma | 1:32905b0858ac | 696 | hit3 = lcd.getPixel( y + a, x + b); |
el14mma | 1:32905b0858ac | 697 | hit4 = lcd.getPixel(-y + a, x + b); |
el14mma | 1:32905b0858ac | 698 | hit5 = lcd.getPixel(-y + a, -x + b); |
el14mma | 1:32905b0858ac | 699 | hit6 = lcd.getPixel( y + a, -x + b); |
el14mma | 1:32905b0858ac | 700 | hit7 = lcd.getPixel( x + a, -y + b); |
el14mma | 1:32905b0858ac | 701 | hit8 = lcd.getPixel(-x + a, -y + b); |
el14mma | 1:32905b0858ac | 702 | |
el14mma | 1:32905b0858ac | 703 | |
el14mma | 1:32905b0858ac | 704 | y++; |
el14mma | 1:32905b0858ac | 705 | |
el14mma | 1:32905b0858ac | 706 | if (radiusError<0) { |
el14mma | 1:32905b0858ac | 707 | radiusError += 2 * y + 1; |
el14mma | 1:32905b0858ac | 708 | } else { |
el14mma | 1:32905b0858ac | 709 | x--; |
el14mma | 1:32905b0858ac | 710 | radiusError += 2 * (y - x) + 1; |
el14mma | 1:32905b0858ac | 711 | } |
el14mma | 1:32905b0858ac | 712 | |
el14mma | 1:32905b0858ac | 713 | } |
el14mma | 1:32905b0858ac | 714 | |
el14mma | 1:32905b0858ac | 715 | hit = hit1+hit2+hit3+hit4+hit5+hit6+hit7+hit8; |
el14mma | 1:32905b0858ac | 716 | |
el14mma | 1:32905b0858ac | 717 | if (hit != 0) { // touched obstacle |
el14mma | 1:32905b0858ac | 718 | |
el14mma | 1:32905b0858ac | 719 | ticker.detach(); |
el14mma | 1:32905b0858ac | 720 | ticker2.detach(); |
el14mma | 1:32905b0858ac | 721 | |
el14mma | 1:32905b0858ac | 722 | loading = 1; |
el14mma | 1:32905b0858ac | 723 | |
el14mma | 1:32905b0858ac | 724 | lcd.clear(); |
el14mma | 1:32905b0858ac | 725 | |
el14mma | 1:32905b0858ac | 726 | lcd.printString("Game Over",0,1); |
el14mma | 1:32905b0858ac | 727 | lcd.printString("Press Button",0,3); |
el14mma | 1:32905b0858ac | 728 | lcd.printString("to exit",0,4); |
el14mma | 1:32905b0858ac | 729 | |
el14mma | 1:32905b0858ac | 730 | char buffer[14]; // each character is 6 pixels wide, screen is 84 pixels (84/6 = 14) |
el14mma | 1:32905b0858ac | 731 | |
el14mma | 1:32905b0858ac | 732 | int length = sprintf(buffer,"Score %2d",score); |
el14mma | 1:32905b0858ac | 733 | lcd.printString(buffer,0,2); |
el14mma | 1:32905b0858ac | 734 | lcd.refresh(); |
el14mma | 1:32905b0858ac | 735 | |
el14mma | 1:32905b0858ac | 736 | while (button == 0) { // button not pressed |
el14mma | 1:32905b0858ac | 737 | |
el14mma | 1:32905b0858ac | 738 | sleep(); |
el14mma | 1:32905b0858ac | 739 | |
el14mma | 1:32905b0858ac | 740 | } |
el14mma | 1:32905b0858ac | 741 | |
el14mma | 1:32905b0858ac | 742 | menu(); |
el14mma | 1:32905b0858ac | 743 | |
el14mma | 1:32905b0858ac | 744 | } |
el14mma | 1:32905b0858ac | 745 | |
el14mma | 1:32905b0858ac | 746 | |
el14mma | 1:32905b0858ac | 747 | } |
el14mma | 1:32905b0858ac | 748 | |
el14mma | 1:32905b0858ac | 749 | void erase() |
el14mma | 1:32905b0858ac | 750 | { |
el14mma | 1:32905b0858ac | 751 | int x = 2; |
el14mma | 1:32905b0858ac | 752 | |
el14mma | 1:32905b0858ac | 753 | int y = 0; |
el14mma | 1:32905b0858ac | 754 | |
el14mma | 1:32905b0858ac | 755 | int radiusError = 1-x; |
el14mma | 1:32905b0858ac | 756 | |
el14mma | 1:32905b0858ac | 757 | while(x >= y) { |
el14mma | 1:32905b0858ac | 758 | |
el14mma | 1:32905b0858ac | 759 | lcd.clearPixel( x + a, y + b); |
el14mma | 1:32905b0858ac | 760 | lcd.clearPixel(-x + a, y + b); |
el14mma | 1:32905b0858ac | 761 | lcd.clearPixel( y + a, x + b); |
el14mma | 1:32905b0858ac | 762 | lcd.clearPixel(-y + a, x + b); |
el14mma | 1:32905b0858ac | 763 | lcd.clearPixel(-y + a, -x + b); |
el14mma | 1:32905b0858ac | 764 | lcd.clearPixel( y + a, -x + b); |
el14mma | 1:32905b0858ac | 765 | lcd.clearPixel( x + a, -y + b); |
el14mma | 1:32905b0858ac | 766 | lcd.clearPixel(-x + a, -y + b); |
el14mma | 1:32905b0858ac | 767 | |
el14mma | 1:32905b0858ac | 768 | |
el14mma | 1:32905b0858ac | 769 | y++; |
el14mma | 1:32905b0858ac | 770 | |
el14mma | 1:32905b0858ac | 771 | if (radiusError<0) { |
el14mma | 1:32905b0858ac | 772 | radiusError += 2 * y + 1; |
el14mma | 1:32905b0858ac | 773 | } else { |
el14mma | 1:32905b0858ac | 774 | x--; |
el14mma | 1:32905b0858ac | 775 | radiusError += 2 * (y - x) + 1; |
el14mma | 1:32905b0858ac | 776 | } |
el14mma | 1:32905b0858ac | 777 | |
el14mma | 1:32905b0858ac | 778 | } |
el14mma | 1:32905b0858ac | 779 | |
el14mma | 1:32905b0858ac | 780 | lcd.refresh(); |
el14mma | 1:32905b0858ac | 781 | } |
el14mma | 1:32905b0858ac | 782 | |
el14mma | 1:32905b0858ac | 783 | void erase2() { |
el14mma | 1:32905b0858ac | 784 | |
el14mma | 1:32905b0858ac | 785 | int x = 2; |
el14mma | 1:32905b0858ac | 786 | |
el14mma | 1:32905b0858ac | 787 | int y = 0; |
el14mma | 1:32905b0858ac | 788 | |
el14mma | 1:32905b0858ac | 789 | int radiusError = 1-x; |
el14mma | 1:32905b0858ac | 790 | |
el14mma | 1:32905b0858ac | 791 | while(x >= y) { |
el14mma | 1:32905b0858ac | 792 | |
el14mma | 1:32905b0858ac | 793 | lcd.clearPixel( x + d3, y + b1); |
el14mma | 1:32905b0858ac | 794 | lcd.clearPixel(-x + d3, y + b1); |
el14mma | 1:32905b0858ac | 795 | lcd.clearPixel( y + d3, x + b1); |
el14mma | 1:32905b0858ac | 796 | lcd.clearPixel(-y + d3, x + b1); |
el14mma | 1:32905b0858ac | 797 | lcd.clearPixel(-y + d3, -x + b1); |
el14mma | 1:32905b0858ac | 798 | lcd.clearPixel( y + d3, -x + b1); |
el14mma | 1:32905b0858ac | 799 | lcd.clearPixel( x + d3, -y + b1); |
el14mma | 1:32905b0858ac | 800 | lcd.clearPixel(-x + d3, -y + b1); |
el14mma | 1:32905b0858ac | 801 | |
el14mma | 1:32905b0858ac | 802 | |
el14mma | 1:32905b0858ac | 803 | y++; |
el14mma | 1:32905b0858ac | 804 | |
el14mma | 1:32905b0858ac | 805 | if (radiusError<0) { |
el14mma | 1:32905b0858ac | 806 | radiusError += 2 * y + 1; |
el14mma | 1:32905b0858ac | 807 | } else { |
el14mma | 1:32905b0858ac | 808 | x--; |
el14mma | 1:32905b0858ac | 809 | radiusError += 2 * (y - x) + 1; |
el14mma | 1:32905b0858ac | 810 | } |
el14mma | 1:32905b0858ac | 811 | |
el14mma | 1:32905b0858ac | 812 | } |
el14mma | 1:32905b0858ac | 813 | |
el14mma | 1:32905b0858ac | 814 | lcd.refresh(); |
el14mma | 1:32905b0858ac | 815 | } |
el14mma | 1:32905b0858ac | 816 | |
el14mma | 1:32905b0858ac | 817 | void erase3(){ |
el14mma | 1:32905b0858ac | 818 | |
el14mma | 1:32905b0858ac | 819 | int x = 2; |
el14mma | 1:32905b0858ac | 820 | |
el14mma | 1:32905b0858ac | 821 | int y = 0; |
el14mma | 1:32905b0858ac | 822 | |
el14mma | 1:32905b0858ac | 823 | int radiusError = 1-x; |
el14mma | 1:32905b0858ac | 824 | |
el14mma | 1:32905b0858ac | 825 | while(x >= y) { |
el14mma | 1:32905b0858ac | 826 | |
el14mma | 1:32905b0858ac | 827 | lcd.clearPixel( x + d4, y + b2); |
el14mma | 1:32905b0858ac | 828 | lcd.clearPixel(-x + d4, y + b2); |
el14mma | 1:32905b0858ac | 829 | lcd.clearPixel( y + d4, x + b2); |
el14mma | 1:32905b0858ac | 830 | lcd.clearPixel(-y + d4, x + b2); |
el14mma | 1:32905b0858ac | 831 | lcd.clearPixel(-y + d4, -x + b2); |
el14mma | 1:32905b0858ac | 832 | lcd.clearPixel( y + d4, -x + b2); |
el14mma | 1:32905b0858ac | 833 | lcd.clearPixel( x + d4, -y + b2); |
el14mma | 1:32905b0858ac | 834 | lcd.clearPixel(-x + d4, -y + b2); |
el14mma | 1:32905b0858ac | 835 | |
el14mma | 1:32905b0858ac | 836 | |
el14mma | 1:32905b0858ac | 837 | y++; |
el14mma | 1:32905b0858ac | 838 | |
el14mma | 1:32905b0858ac | 839 | if (radiusError<0) { |
el14mma | 1:32905b0858ac | 840 | radiusError += 2 * y + 1; |
el14mma | 1:32905b0858ac | 841 | } else { |
el14mma | 1:32905b0858ac | 842 | x--; |
el14mma | 1:32905b0858ac | 843 | radiusError += 2 * (y - x) + 1; |
el14mma | 1:32905b0858ac | 844 | } |
el14mma | 1:32905b0858ac | 845 | |
el14mma | 1:32905b0858ac | 846 | } |
el14mma | 1:32905b0858ac | 847 | |
el14mma | 1:32905b0858ac | 848 | lcd.refresh(); |
el14mma | 1:32905b0858ac | 849 | } |
el14mma | 1:32905b0858ac | 850 | |
el14mma | 1:32905b0858ac | 851 | void erase4(){ |
el14mma | 1:32905b0858ac | 852 | |
el14mma | 1:32905b0858ac | 853 | int x = 2; |
el14mma | 1:32905b0858ac | 854 | |
el14mma | 1:32905b0858ac | 855 | int y = 0; |
el14mma | 1:32905b0858ac | 856 | |
el14mma | 1:32905b0858ac | 857 | int radiusError = 1-x; |
el14mma | 1:32905b0858ac | 858 | |
el14mma | 1:32905b0858ac | 859 | while(x >= y) { |
el14mma | 1:32905b0858ac | 860 | |
el14mma | 1:32905b0858ac | 861 | lcd.clearPixel( x + d5, y + b3); |
el14mma | 1:32905b0858ac | 862 | lcd.clearPixel(-x + d5, y + b3); |
el14mma | 1:32905b0858ac | 863 | lcd.clearPixel( y + d5, x + b3); |
el14mma | 1:32905b0858ac | 864 | lcd.clearPixel(-y + d5, x + b3); |
el14mma | 1:32905b0858ac | 865 | lcd.clearPixel(-y + d5, -x + b3); |
el14mma | 1:32905b0858ac | 866 | lcd.clearPixel( y + d5, -x + b3); |
el14mma | 1:32905b0858ac | 867 | lcd.clearPixel( x + d5, -y + b3); |
el14mma | 1:32905b0858ac | 868 | lcd.clearPixel(-x + d5, -y + b3); |
el14mma | 1:32905b0858ac | 869 | |
el14mma | 1:32905b0858ac | 870 | |
el14mma | 1:32905b0858ac | 871 | y++; |
el14mma | 1:32905b0858ac | 872 | |
el14mma | 1:32905b0858ac | 873 | if (radiusError<0) { |
el14mma | 1:32905b0858ac | 874 | radiusError += 2 * y + 1; |
el14mma | 1:32905b0858ac | 875 | } else { |
el14mma | 1:32905b0858ac | 876 | x--; |
el14mma | 1:32905b0858ac | 877 | radiusError += 2 * (y - x) + 1; |
el14mma | 1:32905b0858ac | 878 | } |
el14mma | 1:32905b0858ac | 879 | |
el14mma | 1:32905b0858ac | 880 | } |
el14mma | 1:32905b0858ac | 881 | |
el14mma | 1:32905b0858ac | 882 | lcd.refresh(); |
el14mma | 1:32905b0858ac | 883 | } |
el14mma | 1:32905b0858ac | 884 | |
el14mma | 1:32905b0858ac | 885 | void erase5(){ |
el14mma | 1:32905b0858ac | 886 | |
el14mma | 1:32905b0858ac | 887 | int x = 2; |
el14mma | 1:32905b0858ac | 888 | |
el14mma | 1:32905b0858ac | 889 | int y = 0; |
el14mma | 1:32905b0858ac | 890 | |
el14mma | 1:32905b0858ac | 891 | int radiusError = 1-x; |
el14mma | 1:32905b0858ac | 892 | |
el14mma | 1:32905b0858ac | 893 | while(x >= y) { |
el14mma | 1:32905b0858ac | 894 | |
el14mma | 1:32905b0858ac | 895 | lcd.clearPixel( x + d6, y + b4); |
el14mma | 1:32905b0858ac | 896 | lcd.clearPixel(-x + d6, y + b4); |
el14mma | 1:32905b0858ac | 897 | lcd.clearPixel( y + d6, x + b4); |
el14mma | 1:32905b0858ac | 898 | lcd.clearPixel(-y + d6, x + b4); |
el14mma | 1:32905b0858ac | 899 | lcd.clearPixel(-y + d6, -x + b4); |
el14mma | 1:32905b0858ac | 900 | lcd.clearPixel( y + d6, -x + b4); |
el14mma | 1:32905b0858ac | 901 | lcd.clearPixel( x + d6, -y + b4); |
el14mma | 1:32905b0858ac | 902 | lcd.clearPixel(-x + d6, -y + b4); |
el14mma | 1:32905b0858ac | 903 | |
el14mma | 1:32905b0858ac | 904 | |
el14mma | 1:32905b0858ac | 905 | y++; |
el14mma | 1:32905b0858ac | 906 | |
el14mma | 1:32905b0858ac | 907 | if (radiusError<0) { |
el14mma | 1:32905b0858ac | 908 | radiusError += 2 * y + 1; |
el14mma | 1:32905b0858ac | 909 | } else { |
el14mma | 1:32905b0858ac | 910 | x--; |
el14mma | 1:32905b0858ac | 911 | radiusError += 2 * (y - x) + 1; |
el14mma | 1:32905b0858ac | 912 | } |
el14mma | 1:32905b0858ac | 913 | |
el14mma | 1:32905b0858ac | 914 | } |
el14mma | 1:32905b0858ac | 915 | |
el14mma | 1:32905b0858ac | 916 | lcd.refresh(); |
el14mma | 1:32905b0858ac | 917 | } |
el14mma | 1:32905b0858ac | 918 | |
el14mma | 1:32905b0858ac | 919 | void update() { |
el14mma | 1:32905b0858ac | 920 | |
el14mma | 1:32905b0858ac | 921 | score = score+1; |
el14mma | 1:32905b0858ac | 922 | |
el14mma | 1:32905b0858ac | 923 | if (energy > 1) { |
el14mma | 1:32905b0858ac | 924 | |
el14mma | 1:32905b0858ac | 925 | energy = energy-1; |
el14mma | 1:32905b0858ac | 926 | |
el14mma | 1:32905b0858ac | 927 | } |
el14mma | 1:32905b0858ac | 928 | |
el14mma | 1:32905b0858ac | 929 | } |
el14mma | 1:32905b0858ac | 930 | |
el14mma | 1:32905b0858ac | 931 | void menu() { // reset game |
el14mma | 1:32905b0858ac | 932 | |
el14mma | 1:32905b0858ac | 933 | // origin coordinates for the cercle |
el14mma | 1:32905b0858ac | 934 | a = 41; |
el14mma | 1:32905b0858ac | 935 | b = 23; |
el14mma | 1:32905b0858ac | 936 | |
el14mma | 1:32905b0858ac | 937 | // Save variables |
el14mma | 1:32905b0858ac | 938 | |
el14mma | 1:32905b0858ac | 939 | save1 = 1; |
el14mma | 1:32905b0858ac | 940 | save2 = 1; |
el14mma | 1:32905b0858ac | 941 | save3 = 1; |
el14mma | 1:32905b0858ac | 942 | save4 = 1; |
el14mma | 1:32905b0858ac | 943 | save5 = 1; |
el14mma | 1:32905b0858ac | 944 | |
el14mma | 1:32905b0858ac | 945 | // Initial obstacle speed |
el14mma | 1:32905b0858ac | 946 | |
el14mma | 1:32905b0858ac | 947 | speed = 0.5; |
el14mma | 1:32905b0858ac | 948 | // Game Score |
el14mma | 1:32905b0858ac | 949 | |
el14mma | 1:32905b0858ac | 950 | score = 0; |
el14mma | 1:32905b0858ac | 951 | |
el14mma | 1:32905b0858ac | 952 | // origin coordinates for obstacles |
el14mma | 1:32905b0858ac | 953 | |
el14mma | 1:32905b0858ac | 954 | d1 = 1; |
el14mma | 1:32905b0858ac | 955 | |
el14mma | 1:32905b0858ac | 956 | d2 = 1; |
el14mma | 1:32905b0858ac | 957 | |
el14mma | 1:32905b0858ac | 958 | d3 = 1; |
el14mma | 1:32905b0858ac | 959 | |
el14mma | 1:32905b0858ac | 960 | d4 = 83; |
el14mma | 1:32905b0858ac | 961 | |
el14mma | 1:32905b0858ac | 962 | d5 = 0; |
el14mma | 1:32905b0858ac | 963 | |
el14mma | 1:32905b0858ac | 964 | d6 = 0; |
el14mma | 1:32905b0858ac | 965 | |
el14mma | 1:32905b0858ac | 966 | b1 = 0; |
el14mma | 1:32905b0858ac | 967 | |
el14mma | 1:32905b0858ac | 968 | b2 = 0; |
el14mma | 1:32905b0858ac | 969 | |
el14mma | 1:32905b0858ac | 970 | b3 = 0; |
el14mma | 1:32905b0858ac | 971 | |
el14mma | 1:32905b0858ac | 972 | b4 = 47; |
el14mma | 1:32905b0858ac | 973 | |
el14mma | 1:32905b0858ac | 974 | // Energy needed for the player to use slow mode (must discharge to one) |
el14mma | 1:32905b0858ac | 975 | |
el14mma | 1:32905b0858ac | 976 | energy = 20; |
el14mma | 1:32905b0858ac | 977 | |
el14mma | 1:32905b0858ac | 978 | // Random Obstacle decision by random variable and obstacles states |
el14mma | 1:32905b0858ac | 979 | |
el14mma | 1:32905b0858ac | 980 | r = 0; |
el14mma | 1:32905b0858ac | 981 | |
el14mma | 1:32905b0858ac | 982 | state1 = 0; |
el14mma | 1:32905b0858ac | 983 | state2 = 0; |
el14mma | 1:32905b0858ac | 984 | state3 = 0; |
el14mma | 1:32905b0858ac | 985 | state4 = 0; |
el14mma | 1:32905b0858ac | 986 | state5 = 0; |
el14mma | 1:32905b0858ac | 987 | state6 = 0; |
el14mma | 1:32905b0858ac | 988 | |
el14mma | 1:32905b0858ac | 989 | // Variables used to check if the player touched an obstacle |
el14mma | 1:32905b0858ac | 990 | |
el14mma | 1:32905b0858ac | 991 | hit = 0; |
el14mma | 1:32905b0858ac | 992 | hit1 = 0; |
el14mma | 1:32905b0858ac | 993 | hit2 = 0; |
el14mma | 1:32905b0858ac | 994 | hit3 = 0; |
el14mma | 1:32905b0858ac | 995 | hit4 = 0; |
el14mma | 1:32905b0858ac | 996 | hit5 = 0; |
el14mma | 1:32905b0858ac | 997 | hit6 = 0; |
el14mma | 1:32905b0858ac | 998 | hit7 = 0; |
el14mma | 1:32905b0858ac | 999 | hit8 = 0; |
el14mma | 1:32905b0858ac | 1000 | |
el14mma | 1:32905b0858ac | 1001 | lcd.clear(); |
el14mma | 1:32905b0858ac | 1002 | |
el14mma | 1:32905b0858ac | 1003 | wait(1); |
el14mma | 1:32905b0858ac | 1004 | |
el14mma | 1:32905b0858ac | 1005 | loading = 0; |
el14mma | 1:32905b0858ac | 1006 | |
el14mma | 1:32905b0858ac | 1007 | main(); |
el14mma | 1:32905b0858ac | 1008 | |
eencae | 0:026fa541af7a | 1009 | } |