Kamikaze Race. Bin Mohd Kamaludin. 200876993.
Dependencies: el14hzbm_Final_Project mbed
Fork of el14hzbm_FinalProject by
Diff: main.cpp
- Revision:
- 1:58b4f9dda460
- Parent:
- 0:211360300ec1
- Child:
- 3:c2227b3e2f0c
--- a/main.cpp Tue May 03 10:37:41 2016 +0000 +++ b/main.cpp Thu May 05 11:34:33 2016 +0000 @@ -1,192 +1,128 @@ +/** +@file main.cpp +@brief Program implementation +*/ + #include "mbed.h" #include "N5110.h" #include "tone.h" +#include "main.h" #define PI 3.14159265359 #define PAUSE 1 #define PLAY 0 -//connection for Nokia LCD -N5110 lcd(PTE26,PTA0,PTC4,PTD0,PTD2,PTD1,PTC3); - -// connections for joystick -InterruptIn button(PTB11); -AnalogIn yPot(PTB2); -AnalogIn xPot(PTB3); -// Serial for debug -Serial serial(USBTX,USBRX); - -// struct for state -struct State { - int output; // output value for current state - float time; // wait time for state - int next_state[4]; // next state (depending on direction 0 - UP, 1 - DOWN) -}; -typedef const struct State STyp; - -// array of states in the FSM, each element is the output of the counter, wait time, next state(s) -STyp fsm[4] = { - {1,0.2,{1,0}}, - {2,0.2,{2,1}}, - {4,0.2,{3,2}}, - {8,0.2,{0,3}} -}; - -void intro(); -void firstView(); -void firstViewPointer(); -void gameView(); -void initialGameInterface(); -void crash(int carValue[],int opponent_y,int g_score,int g_level,int k,int l,int delay); -void game_interface(int g_score,int g_level,int g_liveleft); -void live(int liveleft); -void roadline(int moving); -void playermovement(int g_level); -void checkLastCar(int g_level); -void finishLevel(int g_level); -void optionView(); -void optionPointer(); -void finishView(int g_level); -void brightnessController(); -void brightnessView(); -void instructionView(); -void button_isr(); -void gameplaysound(float duration); -void crashsound(); -void pausesound(); -void score(int m,int my); -void level(int x1,int y1); - -// all the stuff for tone creation -DigitalOut buzzer(PTA2); -DigitalOut green_led(PTC2); -Timer noteTimer; -void initArray(); // function to initialise sample array -void tone(float frequency,float duration); // play a tone of set frequency for given duration -int n = 32; // number of samples -float y[32]; // array to store samples -float BPM = 73.0; // beats per minute - -int pointer_x=20; -int pointer_y=40; -int loop=0; -int output=0; -int state=0; -float brightness_adjuster=0.0; -volatile int g_button_flag=0; -int g_crash=0; -int g_liveleft=3; -float duration=0; -int playerSpeed=0; -int g_level=1; -int g_score=0; -int carValue[10000]; -int car_x=22; //initiate car position_x -int car_y=38; //initiate car position_y -int delay=0; -int lastCar=0; -int game = PLAY; - int main() { - lcd.init(); - initArray(); - button.rise(&button_isr); - button.mode(PullDown); - int output=0; - int state=0; - intro(); + lcd.init(); //initialize the lcd + initArray(); //fill array with sine sample + button.rise(&button_isr); //will read the rise edge when button is pressed + button.mode(PullDown); //external button is set as PullDown while(1) { - // set output of current state (use dot syntax to access struct members) - output = fsm[state].output; - // implement required delay - //wait(fsm[state].time); - // set the next state depending on direction - //state = fsm[state].next_state[direction]; + + intro(); //state 0 - introduction interface + firstView(); //state 1 - main menu interface + gameView(); //state 2 - game interface + optionView(); //state 3 - option interface + instructionView(); //state 4 - how to play interface + brightnessView(); //state 5 - set up brightness interface + finishView(g_score); //state 6 - final score interface + } +} + +void intro() //state 0 - introduction interface +{ + if(state==0) { - firstView(); - gameView(); - optionView(); - brightnessView(); - instructionView(); + for(int k=90; k>5; k--) { + lcd.printString("KAMIKAZE",k,1); //display game title in left moving motion + lcd.printString("RACE",k+12,2); + lcd.refresh(); + wait(0.1); + lcd.clear(); + + if(g_button_flag==1) { + g_button_flag=0; + state=1; + break; + } + } + state=1; } } -void intro() +void firstView() //state 1 - main menu interface { - for(int k=90; k>5; k--) { - lcd.printString("KAMIKAZE",k,1); - lcd.printString("RACE",k,2); - lcd.refresh(); - wait(0.1); - lcd.clear(); - if(g_button_flag==1) { - g_button_flag=0; - break; - } - } -} -void firstView() -{ - if(state==0) { + if(state==1) { pointer_x=20; - pointer_y=35; + pointer_y=31; + while(loop==0) { - lcd.printString("KAMIKAZE",5,1); - lcd.printString("RACE",5,2); - lcd.printString("START",25,4); - lcd.printString("OPTION",25,5); - firstViewPointer(); - lcd.drawCircle(20,pointer_y,2,1); - lcd.refresh(); - wait(0.1); - lcd.clear(); - if(g_button_flag==1) { - g_button_flag=0; - loop=1; - if(pointer_y==35) { - state=1;//task for game - } else { - state=2; + sleepTimer.start(); // start timer + + if(sleepTimer.read()<15) { //display all the main menu interface + lcd.printString("KAMIKAZE",5,1); + lcd.printString("RACE",17,2); + lcd.drawLine(58,46,58,2,2); + lcd.drawLine(67,46,67,2,2); + lcd.drawLine(76,46,76,2,2); + lcd.drawCar(60,10,1); + lcd.drawCar(60,25,1); + lcd.drawCar(69,23,1); + lcd.printString("Start",14,4); + lcd.printString("Option",14,5); + firstViewPointer(); + lcd.drawCar(5,pointer_y,1); + lcd.refresh(); + wait(0.1); + lcd.clear(); + + if(g_button_flag==1) { + g_button_flag=0; + loop=1; + + if(pointer_y==31) { + state=2; //go to game state + } else { + state=3; //go to option state + } } + } else { //go to sleep mode after 15 second has passed + sleepTimer.stop(); // stop the timer + sleepTimer.reset(); // reset to 0 + SleepView(); } } loop=0; + sleepTimer.stop(); // stop the timer + sleepTimer.reset(); // reset to 0 } } -void firstViewPointer() +void gameView() //state 2 - game interface { - if(yPot>0.7f) { - pointer_y=35; - } - if(yPot<0.3f) { - pointer_y=43; - } -} + if(state==2) { -void gameView() -{ - if(state==1) { + initialGameInterface(); //function to initialize the game with countdown timer. + initGameVar(); //function to initiate all variable used in the game - initialGameInterface(); - - while(g_crash==0) { + while(g_crash==0) { //0 - crash not occur for(int i=1; i<=g_level*20; i++) { - carValue[i]=9*((rand()%6)+1)-5; //generate all opponent car + carValue[i]=9*((rand()%6)+1)-5; //generate random position for all vehicle on the road } for(int y_move=-5; y_move<100000; y_move++) { - if(game==PLAY) { + if(game==PLAY) { //when game is played crash(carValue,y_move,g_score,g_level,car_x,car_y,delay); //function to check whether crash occur - playermovement(g_level); + playermovement(g_level); //function to control the player's car movement lcd.refresh(); - checkLastCar(g_level); - if((y_move-(lastCar))>40) { - finishLevel(g_level); + checkLastCar(g_level); //function to check when will the last last car go out from the screen to finish level + + if((y_move-(lastCar))>40) { + finishLevel(g_level); //finish level when last car has passed through break; } if(g_crash==1) { @@ -196,24 +132,24 @@ if(g_liveleft<=1) { //check if live is zero after crash occured lcd.clear(); // if zero, game stop break; - } else { //if not zero - g_crash=0; //reduce the live,and continue the game - g_liveleft=g_liveleft-1; //return the car back to initial position - g_level=g_level-1; - car_x=22; + } else { //if still has life + g_crash=0; //continue the game + g_liveleft=g_liveleft-1; //reduce the life + g_level=g_level-1; //start at same level when crash occur + car_x=22; //return the car back to initial position car_y=38; break; } } lcd.clear(); g_score=g_score+1; //increase the score by 1 after every loop - } else { - y_move=y_move-1; - game_interface(g_score,g_level,g_liveleft); - lcd.printString("Paused",15,1); + } else { //when game is paused + y_move=y_move-1; //fix y_move to make the vehicle static + game_interface(g_score,g_level,g_liveleft); + lcd.printString("Paused",15,2); //display pause on the screen lcd.refresh(); } - if (g_button_flag==1) { + if (g_button_flag==1) { //press button to paused/play the game. g_button_flag=0; pausesound(); wait(0.1); @@ -225,141 +161,321 @@ } } g_level=g_level+1; - //game coding here - /*if(g_button_flag==1) { - g_button_flag=0; - loop=1; - state=3; - }*/ + } //when the game finished, move to finish View(display high score) + state=6; + finishView(g_score); + state=0; //goes back to main menu + } +} + +void optionView() //state 3 - option interface +{ + if(state==3) { + pointer_x=5; + pointer_y=7; + + while(loop==0) { + sleepTimer.start(); // start timer + + if(sleepTimer.read()<15) { + lcd.printString("Instruction",13,1); + lcd.printString("Brightness",13,2); + lcd.printString("Achievement",13,3); + lcd.printString("Back",13,4); + optionPointer(); + lcd.drawCar(4,pointer_y,1); + lcd.refresh(); + wait(0.1); + lcd.clear(); + + if(g_button_flag==1) { + g_button_flag=0; + loop=1; + + if(pointer_y==7) { + state=4;//go to instruction + } else if(pointer_y==15) { + state=5;//go to brightness + } else if(pointer_y==31) { + state=1;//go back + } else { //pointer====23 + state=6;//go to achievement + } + } + } else { + sleepTimer.stop(); // stop the timer + sleepTimer.reset(); // reset to 0 + SleepView(); + } } - finishView(g_score); - g_crash=0; - g_liveleft=3; - g_level=1; + loop=0; + sleepTimer.stop(); // stop the timer + sleepTimer.reset(); // reset to 0 } } -void crash(int carValue[],int opponent_y,int g_score,int g_level,int k,int l,int delay) +void instructionView() //state 4 - how to play interface +{ + if(state==4) { + + while(loop==0) { + sleepTimer.start(); // start timer + + if(sleepTimer.read()<15) { + lcd.printString("Make your way",0,0); //explain how to play the game + lcd.printString("through the",0,1); + lcd.printString("traffic by ",0,2); + lcd.printString("avoiding all",0,3); + lcd.printString("vehicles on",0,4); + lcd.printString("the highway.",0,5); + lcd.refresh(); + wait(0.1); + lcd.clear(); + + if(g_button_flag==1) { + g_button_flag=0; + loop=1; + state=9; + } + } else { + sleepTimer.stop(); // stop the timer + sleepTimer.reset(); // reset to 0 + SleepView(); + } + } + loop=0; + sleepTimer.stop(); // stop the timer + sleepTimer.reset(); // reset to 0 + } + if(state==9) { + + while(loop==0) { + sleepTimer.start(); // start timer + + if(sleepTimer.read()<15) { + lcd.printString("You have ",0,0); + lcd.printString("three lives",0,1); + lcd.printString("at the ",0,2); + lcd.printString("start of",0,3); + lcd.printString("the game.",0,4); + lcd.printString("Good Luck!!!",0,5); + lcd.refresh(); + wait(0.1); + lcd.clear(); + + if(g_button_flag==1) { + g_button_flag=0; + loop=1; + state=3; + } + } else { + sleepTimer.stop(); // stop the timer + sleepTimer.reset(); // reset to 0 + SleepView(); + } + } + loop=0; + sleepTimer.stop(); // stop the timer + sleepTimer.reset(); // reset to 0 + } +} + +void brightnessView() //state 5 - set up brightness interface { - float carPixel[84][48]; + if(state==5) { + brightness_adjuster=5; + + while(loop==0) { + sleepTimer.start(); // start timer + + if(sleepTimer.read()<15) { + brightnessController(); + lcd.printString("Adjust",25,1); + lcd.printString("Brightness",13,2); + lcd.printString("+",78,4); + lcd.printString("-",2,4); + lcd.setBrightness(brightness_adjuster/10); + lcd.drawRect(1,27,brightness_adjuster*8,4,1); + lcd.drawRect(1,27,81,4,0); + lcd.refresh(); + wait(0.1); + lcd.clear(); + + if(g_button_flag==1) { + g_button_flag=0; + loop=1; + state=3; + } + } else { + sleepTimer.stop(); // stop the timer + sleepTimer.reset(); // reset to 0 + SleepView(); + } + } + loop=0; + sleepTimer.stop(); // stop the timer + sleepTimer.reset(); // reset to 0 + } +} + +void finishView(int g_score) //state 6 - final score interface +{ + if(state==6) { + + while(loop==0) { + sleepTimer.start(); // start timer + + if(sleepTimer.read()<15) { + char buffer[14]; + int length = sprintf(buffer,"%2d",g_score/20); //display final score + lcd.printString("Your",30,1); + lcd.printString("Final Score",10,2); + lcd.printString("Is",34,3); + lcd.printString(buffer,34,4); + lcd.refresh(); + wait(0.1); + lcd.clear(); + + if(g_button_flag==1) { + g_button_flag=0; + loop=1; + state=3; + } + } else { + sleepTimer.stop(); // stop the timer + sleepTimer.reset(); // reset to 0 + SleepView(); + } + } + loop=0; + } +} + +void SleepView() //this function applies the sleep mode concept +{ //improve power effciency for the game system + while(loop==0) { //expand the battery lifetime. + lcd.turnOff(); //also turn off the lcd scrren when not in used + sleep(); + + if(g_button_flag==1) { + g_button_flag=0; //if button pressed, turn on the screen back. + lcd.init(); + loop=1; + } + } + loop=0; +} + + + +void crash(int carValue[],int opponent_y,int g_score,int g_level,int k,int l,int delay) //function to check if crash occur +{ + float carPixel[84][48]; //create array for vehicle on the road float enemyPixel[84][48]; lcd.clear(); lcd.drawCar(k,l,1); lcd.refresh(); + for(int i=0; i<=54; i++) { for(int j=0; j<=48; j++) { - carPixel[i][j]=lcd.getPixel(i,j); + carPixel[i][j]=lcd.getPixel(i,j); //check player's car pixel } } lcd.clear(); - for(int i=1; i<=(g_level*20); i++) { - if (g_level>=9) { - lcd.drawCar(carValue[i],opponent_y-delay,1); + if (g_level>=9) { //for this part, it draw different type of vehicle for given road lane. + if (carValue[i]<10) { + lcd.drawTruck(carValue[i],opponent_y-delay,1); //truck is drawn on most left lane + } else if (carValue[i]<20) { + lcd.drawVan(carValue[i],opponent_y-delay,1); //van is drawn second left lane + } else if (carValue[i]<40) { + lcd.drawCar(carValue[i],opponent_y-delay,1); //car is drawn on lane three and four + } else { + lcd.drawCarReverse(carValue[i],opponent_y-delay,1); //car is drawn in opposite direction for opposite lane + } if(i%3==0) { delay=delay+20; } - } else if(g_level>=5) { - lcd.drawCar(carValue[i],opponent_y-delay,1); + } else if(g_level>=5) { //the step is repeat for different level + if (carValue[i]<10) { //higher the level, more car will be on the road to make it more difficult + lcd.drawTruck(carValue[i],opponent_y-delay,1); + } else if (carValue[i]<20) { + lcd.drawVan(carValue[i],opponent_y-delay,1); + } else if (carValue[i]<40) { + lcd.drawCar(carValue[i],opponent_y-delay,1); + } else { + lcd.drawCarReverse(carValue[i],opponent_y-delay,1); + } if(i%2==0) { delay=delay+20; } } else { - lcd.drawCar(carValue[i],opponent_y-delay,1); + if (carValue[i]<10) { + lcd.drawTruck(carValue[i],opponent_y-delay,1); + } else if (carValue[i]<20) { + lcd.drawVan(carValue[i],opponent_y-delay,1); + } else if (carValue[i]<40) { + lcd.drawCar(carValue[i],opponent_y-delay,1); + } else { + lcd.drawCarReverse(carValue[i],opponent_y-delay,1); + } delay=delay+20; } } - /*if(opponent_x0==22) { - lcd.printString("+",opponent_x1,2); - lcd.drawCircle(opponent_x1+2,opponent_y,3,0); - lcd.printString("x",opponent_x1,2); - lcd.drawCircle(opponent_x1+2,opponent_y,3,0); - }*/ lcd.refresh(); for(int i=0; i<=54; i++) { for(int j=0; j<=48; j++) { - enemyPixel[i][j]=lcd.getPixel(i,j); + enemyPixel[i][j]=lcd.getPixel(i,j); //now, check the pixel for traffic's car } } - for(int i=0; i<=54; i++) { for(int j=0; j<=48; j++) { - if(enemyPixel[i][j]!=0 && carPixel[i][j]!=0) { - lcd.printString("!!CRASH!!",2,2); + if(enemyPixel[i][j]!=0 && carPixel[i][j]!=0) { //now, check if player's car pixel overlap with traffic's car pixel + lcd.printString("!!CRASH!!",2,2); //if yes, print crash g_crash=1; - } } } - game_interface(g_score,g_level,g_liveleft); + game_interface(g_score,g_level,g_liveleft); //put all the other displaying stuff to finish off the interface lcd.drawCar(k,l,1); lcd.refresh(); double ki=-((g_level)); - duration=(0.02*exp(ki))+0.005; //0.03*exp(ki))+0.005 + duration=(0.02*exp(ki))+0.005; //use exponential decay equation to be used for speed control at increasing level + if(opponent_y%5==0) { gameplaysound(duration); } else { - wait(duration); //0.05*pow(0.9,time)+0.004 + wait(duration); } - //lcd.clear(); } -void game_interface(int g_score,int g_level,int g_liveleft) +void game_interface(int g_score,int g_level,int g_liveleft) //function to provide game interface during gameplay { score(61,2); level(61,18); char buffer[14]; - int length = sprintf(buffer,"%2d",g_score/10); + int length = sprintf(buffer,"%2d",g_score/20); lcd.printString(buffer,62,1); int length1 = sprintf(buffer,"%2d",g_level); lcd.printString(buffer,62,3); live(g_liveleft); roadline(g_score); - lcd.drawRect(59,33,22,4,1); -} - -void live(int liveleft) -{ - lcd.drawHeart(59,40,liveleft,1); - lcd.refresh(); + lcd.drawRect(59,33,g_level*2,4,1); + lcd.drawRect(59,33,22,4,0); } -void roadline(int moving) +void playermovement(int g_level) //function to control the player's car movement { - lcd.drawLine(11,46,11,2,2); - lcd.drawLine(20,46,20,2,2); - lcd.drawLine(29,46,29,2,2); - lcd.drawLine(38,45,38,2,1); - lcd.drawLine(47,46,47,2,2); - - lcd.drawLine(0,47,0,0,1); - lcd.drawLine(83,47,83,0,1); - lcd.drawLine(83,0,0,0,1); - lcd.drawLine(83,47,0,47,1); - - if(moving%2!=0) { - lcd.drawLine(2,46,2,2,2); - lcd.drawLine(56,46,56,2,2); - lcd.refresh(); - } else { - lcd.drawLine(2,45,2,1,2); - lcd.drawLine(56,45,56,1,2); - lcd.refresh(); - } -} - -void playermovement(int g_level) -{ - if (g_level<3) { - playerSpeed=3; - } else if(g_level<6) { + if (g_level>=3) { //at higher level, speed is faster, so give small scale movement to give better handling playerSpeed=1; + } else if(g_level<3) { //at lower level, speed is slower, so high scale movemement is allowed. + playerSpeed=2; } - if(xPot>=0.7f) { + if(xPot>=0.7f) { //joystick movement control the screen is shown here if(car_x>-3 && car_x<49) { car_x=car_x+playerSpeed; } @@ -382,9 +498,9 @@ } } -void checkLastCar(int g_level) -{ - if(g_level>=9) { +void checkLastCar(int g_level) //check for last car will be on the screen +{ //needed in order to stop the for loop and finish the level + if(g_level>=9) { lastCar=g_level*33*4; } else if(g_level>=5) { lastCar=g_level*50*4; @@ -393,7 +509,7 @@ } } -void finishLevel(int g_level) +void finishLevel(int g_level) //display the high score screen when the game is finish { char buffer[48]; int length = sprintf(buffer,"%2d",g_level); @@ -408,13 +524,13 @@ car_y=38; } -void initialGameInterface() +void initialGameInterface() //provide initial countdown before the game start { - for(int countdown=5; countdown>=1; countdown--) { - score(62,2); - level(62,18); - lcd.printString("0",62,1); - lcd.printString("1",62,3); + for(int countdown=5; countdown>=1; countdown--) { //countdown from 5-1 + score(61,2); + level(61,18); + lcd.printString("0",68,1); + lcd.printString("1",68,3); lcd.drawHeart(59,40,3,1); lcd.drawLine(0,47,0,0,1); @@ -436,155 +552,54 @@ } } -void optionView() +void initGameVar() //initiate every variable use in the game before the game start { - if(state==2) { - pointer_x=5; - pointer_y=11; - while(loop==0) { - lcd.printString("INSTRUCTION",10,1); - lcd.printString("BRIGHTNESS",10,2); - lcd.printString("ACHIEVEMENT",10,3); - lcd.printString("BACK",10,4); - optionPointer(); - lcd.drawCircle(5,pointer_y,2,1); - lcd.refresh(); - wait(0.1); - lcd.clear(); - if(g_button_flag==1) { - g_button_flag=0; - loop=1; - if(pointer_y==11) { - state=5;//task for instruction - } else if(pointer_y==19) { - state=4;//task for high score - } else if(pointer_y==35) { - state=0;//task for go back - } else { - //state=2; - } - } - } - loop=0; + g_crash=0; + g_liveleft=3; + g_level=1; + g_score=0; + car_x=22; + car_y=38; +} + +void firstViewPointer() //control the pointer on main menu +{ + if(yPot>0.7f) { + pointer_y=31; + } + if(yPot<0.3f) { + pointer_y=39; } } -void optionPointer() +void optionPointer() //control the pointer on option menu { if(yPot>0.7f) { - if(pointer_y>11 && pointer_y<38) { + if(pointer_y>11 && pointer_y<32) { pointer_y=pointer_y-8; } } if(yPot<0.3f) { - if(pointer_y>5 && pointer_y<35) { + if(pointer_y>5 && pointer_y<28) { pointer_y=pointer_y+8; } } } -void button_isr() -{ - g_button_flag=1; -} - -void finishView(int g_score) -{ - char buffer[14]; - int length = sprintf(buffer,"%2d",g_score/10); - lcd.printString("Your",30,1); - lcd.printString("Final Score",10,2); - lcd.printString("Is",34,3); - lcd.printString(buffer,34,4); - lcd.refresh(); - wait(3.0); - lcd.clear(); - state=0; - g_score=0; -} - -void brightnessView() +void brightnessController() //control the brightness by using joystick { - if(state==4) { - brightness_adjuster=5; - while(loop==0) { - brightnessController(); - lcd.setBrightness(brightness_adjuster/10); - char buffer[14]; - int length = sprintf(buffer,"%2f",brightness_adjuster); - lcd.printString(buffer,20,2); - lcd.refresh(); - wait(0.1); - lcd.clear(); - if(g_button_flag==1) { - g_button_flag=0; - loop=1; - state=2; - } - } - loop=0; - } -} -void brightnessController() -{ - if(yPot>0.7f) { + if(xPot>0.7f) { if(brightness_adjuster>=0 && brightness_adjuster<=9) { brightness_adjuster=brightness_adjuster+1; } } - if(yPot<0.3f) { + if(xPot<0.3f) { if(brightness_adjuster>=1 && brightness_adjuster<=10) { brightness_adjuster=brightness_adjuster-1; } } } -void achievementView() -{ - lcd.printString("Your",30,1); - lcd.printString("Final Score",10,2); - lcd.printString("Is",34,3); - lcd.printString("40000",25,4); -} - - -void instructionView() -{ - if(state==5) { - while(loop==0) { - lcd.printString("Pass Through",0,0); - lcd.printString("The Traffic",0,1); - lcd.printString("As Many As You",0,2); - lcd.printString("Can You Will",0,3); - lcd.printString("Be Given",0,4); - lcd.printString("Three Life",0,5); - lcd.refresh(); - wait(0.1); - lcd.clear(); - if(g_button_flag==1) { - g_button_flag=0; - loop=1; - state=2; - } - } - loop=0; - } -} - -void gameplaysound(float duration) -{ - float noteArray[] = { - // provide sound during the time game is played - NOTE_G3, - }; - - int notes = sizeof(noteArray)/sizeof(float); - for(int i=0; i < notes; i++) { - tone(noteArray[i],duration); - - } -} - void initArray() { // create LUT - loop through array and calculate sine wave samples @@ -596,7 +611,7 @@ void tone(float frequency,float duration) { - green_led=1; //turn on LED + green=1; //turn on LED if (frequency > 0) { // a frequency of 0 indicates no note played so only play a note if frequency is not 0 @@ -619,7 +634,21 @@ wait(duration); } - green_led = 0; // turn off LEDs + green = 0; // turn off LEDs +} + +void gameplaysound(float duration) +{ + float noteArray[] = { + // provide sound during the time game is played + NOTE_G3, + }; + + int notes = sizeof(noteArray)/sizeof(float); + for(int i=0; i < notes; i++) { + tone(noteArray[i],duration); + + } } void crashsound() @@ -654,7 +683,53 @@ } } -void score(int m,int my) +void finishsound() +{ + float noteArray[] = { + // provide sound during the time game is played + NOTE_E6,NOTE_C6,NOTE_E6,NOTE_C6, + }; + float noteDuration[] = { + 8,8,8,8 + }; + int notes = sizeof(noteArray)/sizeof(float); + for(int i=0; i < notes; i++) { + tone(noteArray[i],60.0f/(BPM*noteDuration[i])); + + } +} + +void live(int liveleft) //draw how many life left on the screen +{ + lcd.drawHeart(59,40,liveleft,1); + lcd.refresh(); +} + +void roadline(int moving) //draw the road line +border line on the screen +{ //road line + lcd.drawLine(11,46,11,2,2); + lcd.drawLine(20,46,20,2,2); + lcd.drawLine(29,46,29,2,2); + lcd.drawLine(38,45,38,2,1); + lcd.drawLine(47,46,47,2,2); + //border line + lcd.drawLine(0,47,0,0,1); + lcd.drawLine(83,47,83,0,1); + lcd.drawLine(83,0,0,0,1); + lcd.drawLine(83,47,0,47,1); + + if(moving%2!=0) { + lcd.drawLine(2,46,2,2,2); + lcd.drawLine(56,46,56,2,2); + lcd.refresh(); + } else { + lcd.drawLine(2,45,2,1,2); + lcd.drawLine(56,45,56,1,2); + lcd.refresh(); + } +} + +void score(int m,int my) //display the score text on the screen { //show score title lcd.setPixel(m,my); @@ -712,7 +787,7 @@ lcd.setPixel(m+18,my+4); } -void level(int x1,int y1) +void level(int x1,int y1) //display the level text on the screen { int x0=x1; int y0=y1; @@ -731,4 +806,9 @@ lcd.setPixel(x1+13,y1+2); lcd.drawLine(x1+16,y1+4,x0+16,y0,1); lcd.drawLine(x1+18,y1+4,x0+16,y0+4,1); +} + +void button_isr() //use for interrupt +{ + g_button_flag=1; } \ No newline at end of file