Meteor Dodger, simple mbed game w/ joystick on N5110 LCD
Dependencies: N5110 PowerControl mbed
Diff: main.cpp
- Revision:
- 0:4686e853d105
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Tue May 12 22:05:06 2015 +0000 @@ -0,0 +1,374 @@ + + +#include "main.h" +/** +* @file main.cpp +* +* +* @brief code information +* The code is written with numerous start and end positions of code class. +* This made debugging much easier and will be used as a standard of practice +* for future work. +* +* @author Jeremy Ogus +* +* @version 1.2.2 +* +* @date 10/05/2015 +* +* +*v1.0 - broken code in separate loops +*v1.1 - main game in working fashion, no bugs +*v1.2 - power saving and multi directional joystick included, 8 way +*v1.2.1 - pause system now flawless +*v1.2.2 - harder game, borders more efficient +* +*____________________________________________________Definitions and inputs START_____________________________________________________________________ +*/ + +/* +*___________________________________________________Pause game interrupt END______________________________________________________________________ +* +* +* +*______________________________________________________Main code loop START_____________________________________________________________________ +*/ + +int main(){ + +//turns off ethernet ports +PHY_PowerDown(); + + +//pause button interrupt +buttonB.fall(&enable); + + + +/* +*_______________________________________________________Intro sequence START_____________________________________________________________________ +*/ + + wait(0.3); + led1 = 1; //oount up LED sequence + wait(0.2); + led2 = 1; + wait(0.2); + led3 = 1; + wait(0.2); + led4 = 1; + wait(0.5); + + led1 = 0;//LED flashing + led2 = 0; + led3 = 0; + led4 = 0; + wait(0.1); + led1 = 1; + led2 = 1; + led3 = 1; + led4 = 1; + wait(0.1); + led1 = 0; + led2 = 0; + led3 = 0; + led4 = 0; + wait(0.1); + led1 = 1; + led2 = 1; + led3 = 1; + led4 = 1; + wait(0.1); + led1 = 0; + led2 = 0; + led3 = 0; + led4 = 0; + + + + //LCD initialisation + power + lcd.init(); + void clearBuffer(); +buzzer.period(0.05); //pwm period +buzzer = 0.8; //duty cyle + +wait(0.2); +buzzer.period(0.05); +buzzer = 0; + + wait(0.1); + lcd.normalMode(); // normal colour mode + lcd.setBrightness(1); // put LED backlight on 100% + lcd.printString("Let's Play..",8,3); //intro + wait(1.25); + + lcd.clear(); //clear current display + + lcd.inverseMode(); //white on black mode + lcd.printString("METEOR",26,2); //game title + lcd.printString("DODGER",26,4); + wait(2.25); + + lcd.clear(); //clear display again + lcd.normalMode(); + +/* +*______________________________________________Replay cuts into code here => getTo theChopper;___________________________________________ +*/ + + theChopper: + wait(0.01); + + + buttonA.mode(PullUp); + buttonB.mode(PullUp); + + + lcd.printString("Press button A",0,2); + lcd.printString("to start!",16,4); + + +/*____________________________________________________Intro sequence END_____________________________________________________________________ +* +* +* +*____________________________________________________Game loop START_________________________________________________________________________ +*/ + +//wait until A is pushed + +while(buttonA==1){ + } + + lcd.clear(); + + + // character spawn + pxpos = 42; + pypos = 32; + lcd.drawCircle(pxpos,pypos,5,0); + lcd.refresh(); + + + calibrateJoystick(); // get centred values of joystick + + pollJoystick.attach(&updateJoystick,1.0/20.0); // read joystick 20 times per second + +//Border rules START + while(1){ + + for(int i=0;i<=47;i++){ + lcd.setPixel(0,i); + lcd.setPixel(83,i); + } + for(int j=0;j<=83;j++){ + lcd.setPixel(j,0); + lcd.setPixel(j,47); + } + + lcd.refresh(); + +//Border rules END + + if (printFlag) { // if flag set, clear flag and print joystick values to serial port + printFlag = 0; +/* +* middle "if" loop enables border rules, only move if character pixels are outside the border limit +* main if loop moves position 2 pixels in relevant direction +*/ + + // check joystick direction + if (joystick.direction == UP) + {if(pypos>7){ + pypos = pypos-2;}} + + if (joystick.direction == DOWN) + {if(pypos<40){ + pypos = pypos+2;}} + + if (joystick.direction == LEFT) + {if(pxpos>7){ + pxpos = pxpos-2;}} + + if (joystick.direction == RIGHT) + {if(pxpos<76){ + pxpos = pxpos+2;}} + + if (joystick.direction == UP_RIGHT) + {if((pypos>7)&&(pxpos<76)){ + pxpos = pxpos+2; + pypos = pypos-2;}} + + if (joystick.direction == UP_LEFT) + {if((pxpos>7)&&(pypos>7)){ + pxpos = pxpos-2; + pypos = pypos-2;}} + + if (joystick.direction == DOWN_RIGHT) + {if((pxpos<76)&&(pypos<40)){ + pxpos = pxpos+2; + pypos = pypos+2;}} + + if (joystick.direction == DOWN_LEFT) + {if((pxpos>7)&&(pypos<40)){ + pxpos = pxpos-2; + pypos = pypos+2;}} + +/* +UNNEEDED FOR CURRENT VERSION + if (joystick.direction == CENTRE) + {} + + if (joystick.direction == UNKNOWN) + + {} +*/ + + } + + //user drawing + lcd.drawCircle(pxpos,pypos,5,0); //USER + + lcd.refresh(); + + +/* +*____________________________________________________Hostile AI START_____________________________________________________________________ +*/ + + + if(meteorstart ==1){ + + meteorstart = 0; + srand(time(NULL)); + + for(int q=0;q<=4;q++){ //do for all 5 AI + + mxpos[q]=(rand()%83); //random generation + + + mypos[q]=0; + lcd.drawCircle(mxpos[q],mypos[q],2,1); // x,y,radius,black fill + + + } + } + else{ + + for(int q=0;q<=4;q++){ //for all 5 AI + + if (mypos[q] <=45){ //continue downward, if less than 45 + + mypos[q]=mypos[q]+3; //drop speed + lcd.drawCircle(mxpos[q],mypos[q],2,1); // x,y,radius,black fill + } + else{ + meteorstart = 1; + } + + + } + } + + + for(int k = 0; k<=4;k++){ //if collision has occured + if((abs(pxpos - mxpos[k])<7)){ + if((abs(pypos - mypos[k]))<7){ + magchange = 1; + } + } + + } + + if(magchange == 1){ + break; + + } + + + + + lcd.refresh(); + wait(0.1);//wait before spawn MUST be less than 0.1, affects refresh rate of anim + movement + lcd.clear(); + + + +//____________________________________________________Hostile AI END_____________________________________________________________________ +} + + +/* +ESSENTIAL! +following two statements enable initial code states, allowing the code to +execute game loop properly +*/ + meteorstart = 1; + magchange = 0; + + + + lcd.clear(); + lcd.printString("GAME OVER!",14,2); + +buzzer.period(0.05); //pwm period +buzzer = 0.8; //duty cyle + + + wait(0.5); + lcd.inverseMode(); + wait(0.25); + lcd.normalMode(); + +buzzer.period(0.05); +buzzer = 0; + + wait(0.25); + lcd.inverseMode(); + wait(0.25); + lcd.normalMode(); + wait(0.25); + lcd.inverseMode(); + wait(0.25); + lcd.normalMode(); + wait(0.5); + lcd.clear(); + wait(0.1); + + + +//inactivity timer, put to sleep if not replaying within 15 seconds + + goneFishing.start(); + + lcd.printString("Press button A",0,2); + lcd.printString("to replay..",10,4); + + lcd.refresh(); + + + while(buttonA==1){ + + if(goneFishing.read()>10){ + lcd.setBrightness(0.25); + } + + if(goneFishing.read()> 11.25){ + DeepPowerDown(); + } + } + + goneFishing.stop(); + goneFishing.reset(); + + + lcd.clear(); + lcd.setBrightness(1); + getTo theChopper; + + +//____________________________________________________Game loop END_____________________________________________________________________ + + +} +//____________________________________________________Main code loop END_____________________________________________________________________