Meteor Dodger, simple mbed game w/ joystick on N5110 LCD

Dependencies:   N5110 PowerControl mbed

Committer:
j_ogus
Date:
Tue May 12 22:05:06 2015 +0000
Revision:
0:4686e853d105
test

Who changed what in which revision?

UserRevisionLine numberNew contents of line
j_ogus 0:4686e853d105 1
j_ogus 0:4686e853d105 2
j_ogus 0:4686e853d105 3 #include "main.h"
j_ogus 0:4686e853d105 4 /**
j_ogus 0:4686e853d105 5 * @file main.cpp
j_ogus 0:4686e853d105 6 *
j_ogus 0:4686e853d105 7 *
j_ogus 0:4686e853d105 8 * @brief code information
j_ogus 0:4686e853d105 9 * The code is written with numerous start and end positions of code class.
j_ogus 0:4686e853d105 10 * This made debugging much easier and will be used as a standard of practice
j_ogus 0:4686e853d105 11 * for future work.
j_ogus 0:4686e853d105 12 *
j_ogus 0:4686e853d105 13 * @author Jeremy Ogus
j_ogus 0:4686e853d105 14 *
j_ogus 0:4686e853d105 15 * @version 1.2.2
j_ogus 0:4686e853d105 16 *
j_ogus 0:4686e853d105 17 * @date 10/05/2015
j_ogus 0:4686e853d105 18 *
j_ogus 0:4686e853d105 19 *
j_ogus 0:4686e853d105 20 *v1.0 - broken code in separate loops
j_ogus 0:4686e853d105 21 *v1.1 - main game in working fashion, no bugs
j_ogus 0:4686e853d105 22 *v1.2 - power saving and multi directional joystick included, 8 way
j_ogus 0:4686e853d105 23 *v1.2.1 - pause system now flawless
j_ogus 0:4686e853d105 24 *v1.2.2 - harder game, borders more efficient
j_ogus 0:4686e853d105 25 *
j_ogus 0:4686e853d105 26 *____________________________________________________Definitions and inputs START_____________________________________________________________________
j_ogus 0:4686e853d105 27 */
j_ogus 0:4686e853d105 28
j_ogus 0:4686e853d105 29 /*
j_ogus 0:4686e853d105 30 *___________________________________________________Pause game interrupt END______________________________________________________________________
j_ogus 0:4686e853d105 31 *
j_ogus 0:4686e853d105 32 *
j_ogus 0:4686e853d105 33 *
j_ogus 0:4686e853d105 34 *______________________________________________________Main code loop START_____________________________________________________________________
j_ogus 0:4686e853d105 35 */
j_ogus 0:4686e853d105 36
j_ogus 0:4686e853d105 37 int main(){
j_ogus 0:4686e853d105 38
j_ogus 0:4686e853d105 39 //turns off ethernet ports
j_ogus 0:4686e853d105 40 PHY_PowerDown();
j_ogus 0:4686e853d105 41
j_ogus 0:4686e853d105 42
j_ogus 0:4686e853d105 43 //pause button interrupt
j_ogus 0:4686e853d105 44 buttonB.fall(&enable);
j_ogus 0:4686e853d105 45
j_ogus 0:4686e853d105 46
j_ogus 0:4686e853d105 47
j_ogus 0:4686e853d105 48 /*
j_ogus 0:4686e853d105 49 *_______________________________________________________Intro sequence START_____________________________________________________________________
j_ogus 0:4686e853d105 50 */
j_ogus 0:4686e853d105 51
j_ogus 0:4686e853d105 52 wait(0.3);
j_ogus 0:4686e853d105 53 led1 = 1; //oount up LED sequence
j_ogus 0:4686e853d105 54 wait(0.2);
j_ogus 0:4686e853d105 55 led2 = 1;
j_ogus 0:4686e853d105 56 wait(0.2);
j_ogus 0:4686e853d105 57 led3 = 1;
j_ogus 0:4686e853d105 58 wait(0.2);
j_ogus 0:4686e853d105 59 led4 = 1;
j_ogus 0:4686e853d105 60 wait(0.5);
j_ogus 0:4686e853d105 61
j_ogus 0:4686e853d105 62 led1 = 0;//LED flashing
j_ogus 0:4686e853d105 63 led2 = 0;
j_ogus 0:4686e853d105 64 led3 = 0;
j_ogus 0:4686e853d105 65 led4 = 0;
j_ogus 0:4686e853d105 66 wait(0.1);
j_ogus 0:4686e853d105 67 led1 = 1;
j_ogus 0:4686e853d105 68 led2 = 1;
j_ogus 0:4686e853d105 69 led3 = 1;
j_ogus 0:4686e853d105 70 led4 = 1;
j_ogus 0:4686e853d105 71 wait(0.1);
j_ogus 0:4686e853d105 72 led1 = 0;
j_ogus 0:4686e853d105 73 led2 = 0;
j_ogus 0:4686e853d105 74 led3 = 0;
j_ogus 0:4686e853d105 75 led4 = 0;
j_ogus 0:4686e853d105 76 wait(0.1);
j_ogus 0:4686e853d105 77 led1 = 1;
j_ogus 0:4686e853d105 78 led2 = 1;
j_ogus 0:4686e853d105 79 led3 = 1;
j_ogus 0:4686e853d105 80 led4 = 1;
j_ogus 0:4686e853d105 81 wait(0.1);
j_ogus 0:4686e853d105 82 led1 = 0;
j_ogus 0:4686e853d105 83 led2 = 0;
j_ogus 0:4686e853d105 84 led3 = 0;
j_ogus 0:4686e853d105 85 led4 = 0;
j_ogus 0:4686e853d105 86
j_ogus 0:4686e853d105 87
j_ogus 0:4686e853d105 88
j_ogus 0:4686e853d105 89 //LCD initialisation + power
j_ogus 0:4686e853d105 90 lcd.init();
j_ogus 0:4686e853d105 91 void clearBuffer();
j_ogus 0:4686e853d105 92 buzzer.period(0.05); //pwm period
j_ogus 0:4686e853d105 93 buzzer = 0.8; //duty cyle
j_ogus 0:4686e853d105 94
j_ogus 0:4686e853d105 95 wait(0.2);
j_ogus 0:4686e853d105 96 buzzer.period(0.05);
j_ogus 0:4686e853d105 97 buzzer = 0;
j_ogus 0:4686e853d105 98
j_ogus 0:4686e853d105 99 wait(0.1);
j_ogus 0:4686e853d105 100 lcd.normalMode(); // normal colour mode
j_ogus 0:4686e853d105 101 lcd.setBrightness(1); // put LED backlight on 100%
j_ogus 0:4686e853d105 102 lcd.printString("Let's Play..",8,3); //intro
j_ogus 0:4686e853d105 103 wait(1.25);
j_ogus 0:4686e853d105 104
j_ogus 0:4686e853d105 105 lcd.clear(); //clear current display
j_ogus 0:4686e853d105 106
j_ogus 0:4686e853d105 107 lcd.inverseMode(); //white on black mode
j_ogus 0:4686e853d105 108 lcd.printString("METEOR",26,2); //game title
j_ogus 0:4686e853d105 109 lcd.printString("DODGER",26,4);
j_ogus 0:4686e853d105 110 wait(2.25);
j_ogus 0:4686e853d105 111
j_ogus 0:4686e853d105 112 lcd.clear(); //clear display again
j_ogus 0:4686e853d105 113 lcd.normalMode();
j_ogus 0:4686e853d105 114
j_ogus 0:4686e853d105 115 /*
j_ogus 0:4686e853d105 116 *______________________________________________Replay cuts into code here => getTo theChopper;___________________________________________
j_ogus 0:4686e853d105 117 */
j_ogus 0:4686e853d105 118
j_ogus 0:4686e853d105 119 theChopper:
j_ogus 0:4686e853d105 120 wait(0.01);
j_ogus 0:4686e853d105 121
j_ogus 0:4686e853d105 122
j_ogus 0:4686e853d105 123 buttonA.mode(PullUp);
j_ogus 0:4686e853d105 124 buttonB.mode(PullUp);
j_ogus 0:4686e853d105 125
j_ogus 0:4686e853d105 126
j_ogus 0:4686e853d105 127 lcd.printString("Press button A",0,2);
j_ogus 0:4686e853d105 128 lcd.printString("to start!",16,4);
j_ogus 0:4686e853d105 129
j_ogus 0:4686e853d105 130
j_ogus 0:4686e853d105 131 /*____________________________________________________Intro sequence END_____________________________________________________________________
j_ogus 0:4686e853d105 132 *
j_ogus 0:4686e853d105 133 *
j_ogus 0:4686e853d105 134 *
j_ogus 0:4686e853d105 135 *____________________________________________________Game loop START_________________________________________________________________________
j_ogus 0:4686e853d105 136 */
j_ogus 0:4686e853d105 137
j_ogus 0:4686e853d105 138 //wait until A is pushed
j_ogus 0:4686e853d105 139
j_ogus 0:4686e853d105 140 while(buttonA==1){
j_ogus 0:4686e853d105 141 }
j_ogus 0:4686e853d105 142
j_ogus 0:4686e853d105 143 lcd.clear();
j_ogus 0:4686e853d105 144
j_ogus 0:4686e853d105 145
j_ogus 0:4686e853d105 146 // character spawn
j_ogus 0:4686e853d105 147 pxpos = 42;
j_ogus 0:4686e853d105 148 pypos = 32;
j_ogus 0:4686e853d105 149 lcd.drawCircle(pxpos,pypos,5,0);
j_ogus 0:4686e853d105 150 lcd.refresh();
j_ogus 0:4686e853d105 151
j_ogus 0:4686e853d105 152
j_ogus 0:4686e853d105 153 calibrateJoystick(); // get centred values of joystick
j_ogus 0:4686e853d105 154
j_ogus 0:4686e853d105 155 pollJoystick.attach(&updateJoystick,1.0/20.0); // read joystick 20 times per second
j_ogus 0:4686e853d105 156
j_ogus 0:4686e853d105 157 //Border rules START
j_ogus 0:4686e853d105 158 while(1){
j_ogus 0:4686e853d105 159
j_ogus 0:4686e853d105 160 for(int i=0;i<=47;i++){
j_ogus 0:4686e853d105 161 lcd.setPixel(0,i);
j_ogus 0:4686e853d105 162 lcd.setPixel(83,i);
j_ogus 0:4686e853d105 163 }
j_ogus 0:4686e853d105 164 for(int j=0;j<=83;j++){
j_ogus 0:4686e853d105 165 lcd.setPixel(j,0);
j_ogus 0:4686e853d105 166 lcd.setPixel(j,47);
j_ogus 0:4686e853d105 167 }
j_ogus 0:4686e853d105 168
j_ogus 0:4686e853d105 169 lcd.refresh();
j_ogus 0:4686e853d105 170
j_ogus 0:4686e853d105 171 //Border rules END
j_ogus 0:4686e853d105 172
j_ogus 0:4686e853d105 173 if (printFlag) { // if flag set, clear flag and print joystick values to serial port
j_ogus 0:4686e853d105 174 printFlag = 0;
j_ogus 0:4686e853d105 175 /*
j_ogus 0:4686e853d105 176 * middle "if" loop enables border rules, only move if character pixels are outside the border limit
j_ogus 0:4686e853d105 177 * main if loop moves position 2 pixels in relevant direction
j_ogus 0:4686e853d105 178 */
j_ogus 0:4686e853d105 179
j_ogus 0:4686e853d105 180 // check joystick direction
j_ogus 0:4686e853d105 181 if (joystick.direction == UP)
j_ogus 0:4686e853d105 182 {if(pypos>7){
j_ogus 0:4686e853d105 183 pypos = pypos-2;}}
j_ogus 0:4686e853d105 184
j_ogus 0:4686e853d105 185 if (joystick.direction == DOWN)
j_ogus 0:4686e853d105 186 {if(pypos<40){
j_ogus 0:4686e853d105 187 pypos = pypos+2;}}
j_ogus 0:4686e853d105 188
j_ogus 0:4686e853d105 189 if (joystick.direction == LEFT)
j_ogus 0:4686e853d105 190 {if(pxpos>7){
j_ogus 0:4686e853d105 191 pxpos = pxpos-2;}}
j_ogus 0:4686e853d105 192
j_ogus 0:4686e853d105 193 if (joystick.direction == RIGHT)
j_ogus 0:4686e853d105 194 {if(pxpos<76){
j_ogus 0:4686e853d105 195 pxpos = pxpos+2;}}
j_ogus 0:4686e853d105 196
j_ogus 0:4686e853d105 197 if (joystick.direction == UP_RIGHT)
j_ogus 0:4686e853d105 198 {if((pypos>7)&&(pxpos<76)){
j_ogus 0:4686e853d105 199 pxpos = pxpos+2;
j_ogus 0:4686e853d105 200 pypos = pypos-2;}}
j_ogus 0:4686e853d105 201
j_ogus 0:4686e853d105 202 if (joystick.direction == UP_LEFT)
j_ogus 0:4686e853d105 203 {if((pxpos>7)&&(pypos>7)){
j_ogus 0:4686e853d105 204 pxpos = pxpos-2;
j_ogus 0:4686e853d105 205 pypos = pypos-2;}}
j_ogus 0:4686e853d105 206
j_ogus 0:4686e853d105 207 if (joystick.direction == DOWN_RIGHT)
j_ogus 0:4686e853d105 208 {if((pxpos<76)&&(pypos<40)){
j_ogus 0:4686e853d105 209 pxpos = pxpos+2;
j_ogus 0:4686e853d105 210 pypos = pypos+2;}}
j_ogus 0:4686e853d105 211
j_ogus 0:4686e853d105 212 if (joystick.direction == DOWN_LEFT)
j_ogus 0:4686e853d105 213 {if((pxpos>7)&&(pypos<40)){
j_ogus 0:4686e853d105 214 pxpos = pxpos-2;
j_ogus 0:4686e853d105 215 pypos = pypos+2;}}
j_ogus 0:4686e853d105 216
j_ogus 0:4686e853d105 217 /*
j_ogus 0:4686e853d105 218 UNNEEDED FOR CURRENT VERSION
j_ogus 0:4686e853d105 219 if (joystick.direction == CENTRE)
j_ogus 0:4686e853d105 220 {}
j_ogus 0:4686e853d105 221
j_ogus 0:4686e853d105 222 if (joystick.direction == UNKNOWN)
j_ogus 0:4686e853d105 223
j_ogus 0:4686e853d105 224 {}
j_ogus 0:4686e853d105 225 */
j_ogus 0:4686e853d105 226
j_ogus 0:4686e853d105 227 }
j_ogus 0:4686e853d105 228
j_ogus 0:4686e853d105 229 //user drawing
j_ogus 0:4686e853d105 230 lcd.drawCircle(pxpos,pypos,5,0); //USER
j_ogus 0:4686e853d105 231
j_ogus 0:4686e853d105 232 lcd.refresh();
j_ogus 0:4686e853d105 233
j_ogus 0:4686e853d105 234
j_ogus 0:4686e853d105 235 /*
j_ogus 0:4686e853d105 236 *____________________________________________________Hostile AI START_____________________________________________________________________
j_ogus 0:4686e853d105 237 */
j_ogus 0:4686e853d105 238
j_ogus 0:4686e853d105 239
j_ogus 0:4686e853d105 240 if(meteorstart ==1){
j_ogus 0:4686e853d105 241
j_ogus 0:4686e853d105 242 meteorstart = 0;
j_ogus 0:4686e853d105 243 srand(time(NULL));
j_ogus 0:4686e853d105 244
j_ogus 0:4686e853d105 245 for(int q=0;q<=4;q++){ //do for all 5 AI
j_ogus 0:4686e853d105 246
j_ogus 0:4686e853d105 247 mxpos[q]=(rand()%83); //random generation
j_ogus 0:4686e853d105 248
j_ogus 0:4686e853d105 249
j_ogus 0:4686e853d105 250 mypos[q]=0;
j_ogus 0:4686e853d105 251 lcd.drawCircle(mxpos[q],mypos[q],2,1); // x,y,radius,black fill
j_ogus 0:4686e853d105 252
j_ogus 0:4686e853d105 253
j_ogus 0:4686e853d105 254 }
j_ogus 0:4686e853d105 255 }
j_ogus 0:4686e853d105 256 else{
j_ogus 0:4686e853d105 257
j_ogus 0:4686e853d105 258 for(int q=0;q<=4;q++){ //for all 5 AI
j_ogus 0:4686e853d105 259
j_ogus 0:4686e853d105 260 if (mypos[q] <=45){ //continue downward, if less than 45
j_ogus 0:4686e853d105 261
j_ogus 0:4686e853d105 262 mypos[q]=mypos[q]+3; //drop speed
j_ogus 0:4686e853d105 263 lcd.drawCircle(mxpos[q],mypos[q],2,1); // x,y,radius,black fill
j_ogus 0:4686e853d105 264 }
j_ogus 0:4686e853d105 265 else{
j_ogus 0:4686e853d105 266 meteorstart = 1;
j_ogus 0:4686e853d105 267 }
j_ogus 0:4686e853d105 268
j_ogus 0:4686e853d105 269
j_ogus 0:4686e853d105 270 }
j_ogus 0:4686e853d105 271 }
j_ogus 0:4686e853d105 272
j_ogus 0:4686e853d105 273
j_ogus 0:4686e853d105 274 for(int k = 0; k<=4;k++){ //if collision has occured
j_ogus 0:4686e853d105 275 if((abs(pxpos - mxpos[k])<7)){
j_ogus 0:4686e853d105 276 if((abs(pypos - mypos[k]))<7){
j_ogus 0:4686e853d105 277 magchange = 1;
j_ogus 0:4686e853d105 278 }
j_ogus 0:4686e853d105 279 }
j_ogus 0:4686e853d105 280
j_ogus 0:4686e853d105 281 }
j_ogus 0:4686e853d105 282
j_ogus 0:4686e853d105 283 if(magchange == 1){
j_ogus 0:4686e853d105 284 break;
j_ogus 0:4686e853d105 285
j_ogus 0:4686e853d105 286 }
j_ogus 0:4686e853d105 287
j_ogus 0:4686e853d105 288
j_ogus 0:4686e853d105 289
j_ogus 0:4686e853d105 290
j_ogus 0:4686e853d105 291 lcd.refresh();
j_ogus 0:4686e853d105 292 wait(0.1);//wait before spawn MUST be less than 0.1, affects refresh rate of anim + movement
j_ogus 0:4686e853d105 293 lcd.clear();
j_ogus 0:4686e853d105 294
j_ogus 0:4686e853d105 295
j_ogus 0:4686e853d105 296
j_ogus 0:4686e853d105 297 //____________________________________________________Hostile AI END_____________________________________________________________________
j_ogus 0:4686e853d105 298 }
j_ogus 0:4686e853d105 299
j_ogus 0:4686e853d105 300
j_ogus 0:4686e853d105 301 /*
j_ogus 0:4686e853d105 302 ESSENTIAL!
j_ogus 0:4686e853d105 303 following two statements enable initial code states, allowing the code to
j_ogus 0:4686e853d105 304 execute game loop properly
j_ogus 0:4686e853d105 305 */
j_ogus 0:4686e853d105 306 meteorstart = 1;
j_ogus 0:4686e853d105 307 magchange = 0;
j_ogus 0:4686e853d105 308
j_ogus 0:4686e853d105 309
j_ogus 0:4686e853d105 310
j_ogus 0:4686e853d105 311 lcd.clear();
j_ogus 0:4686e853d105 312 lcd.printString("GAME OVER!",14,2);
j_ogus 0:4686e853d105 313
j_ogus 0:4686e853d105 314 buzzer.period(0.05); //pwm period
j_ogus 0:4686e853d105 315 buzzer = 0.8; //duty cyle
j_ogus 0:4686e853d105 316
j_ogus 0:4686e853d105 317
j_ogus 0:4686e853d105 318 wait(0.5);
j_ogus 0:4686e853d105 319 lcd.inverseMode();
j_ogus 0:4686e853d105 320 wait(0.25);
j_ogus 0:4686e853d105 321 lcd.normalMode();
j_ogus 0:4686e853d105 322
j_ogus 0:4686e853d105 323 buzzer.period(0.05);
j_ogus 0:4686e853d105 324 buzzer = 0;
j_ogus 0:4686e853d105 325
j_ogus 0:4686e853d105 326 wait(0.25);
j_ogus 0:4686e853d105 327 lcd.inverseMode();
j_ogus 0:4686e853d105 328 wait(0.25);
j_ogus 0:4686e853d105 329 lcd.normalMode();
j_ogus 0:4686e853d105 330 wait(0.25);
j_ogus 0:4686e853d105 331 lcd.inverseMode();
j_ogus 0:4686e853d105 332 wait(0.25);
j_ogus 0:4686e853d105 333 lcd.normalMode();
j_ogus 0:4686e853d105 334 wait(0.5);
j_ogus 0:4686e853d105 335 lcd.clear();
j_ogus 0:4686e853d105 336 wait(0.1);
j_ogus 0:4686e853d105 337
j_ogus 0:4686e853d105 338
j_ogus 0:4686e853d105 339
j_ogus 0:4686e853d105 340 //inactivity timer, put to sleep if not replaying within 15 seconds
j_ogus 0:4686e853d105 341
j_ogus 0:4686e853d105 342 goneFishing.start();
j_ogus 0:4686e853d105 343
j_ogus 0:4686e853d105 344 lcd.printString("Press button A",0,2);
j_ogus 0:4686e853d105 345 lcd.printString("to replay..",10,4);
j_ogus 0:4686e853d105 346
j_ogus 0:4686e853d105 347 lcd.refresh();
j_ogus 0:4686e853d105 348
j_ogus 0:4686e853d105 349
j_ogus 0:4686e853d105 350 while(buttonA==1){
j_ogus 0:4686e853d105 351
j_ogus 0:4686e853d105 352 if(goneFishing.read()>10){
j_ogus 0:4686e853d105 353 lcd.setBrightness(0.25);
j_ogus 0:4686e853d105 354 }
j_ogus 0:4686e853d105 355
j_ogus 0:4686e853d105 356 if(goneFishing.read()> 11.25){
j_ogus 0:4686e853d105 357 DeepPowerDown();
j_ogus 0:4686e853d105 358 }
j_ogus 0:4686e853d105 359 }
j_ogus 0:4686e853d105 360
j_ogus 0:4686e853d105 361 goneFishing.stop();
j_ogus 0:4686e853d105 362 goneFishing.reset();
j_ogus 0:4686e853d105 363
j_ogus 0:4686e853d105 364
j_ogus 0:4686e853d105 365 lcd.clear();
j_ogus 0:4686e853d105 366 lcd.setBrightness(1);
j_ogus 0:4686e853d105 367 getTo theChopper;
j_ogus 0:4686e853d105 368
j_ogus 0:4686e853d105 369
j_ogus 0:4686e853d105 370 //____________________________________________________Game loop END_____________________________________________________________________
j_ogus 0:4686e853d105 371
j_ogus 0:4686e853d105 372
j_ogus 0:4686e853d105 373 }
j_ogus 0:4686e853d105 374 //____________________________________________________Main code loop END_____________________________________________________________________