Li Ruofan 201199450
Dependencies: mbed Gamepad Joystick
Diff: main.cpp
- Revision:
- 3:cf9fead9c3f4
- Child:
- 4:1ebf8b8842e0
diff -r 5969f78a25ba -r cf9fead9c3f4 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Thu May 14 13:12:28 2020 +0000 @@ -0,0 +1,208 @@ +/* +ELEC2645 Embedded Systems Project +School of Electronic & Electrical Engineering +University of Leeds +Name:Li Ruofan +Username:el17rl +Student ID Number:201199450 +Date:12 May 2020 +*/ +#include "mbed.h" +#include "N5110.h" +#include "Gamepad.h" +#include "shot.h" +#include "Ufo.h" +#include "Spaceship.h" +#include "bgm.h" + +#define SPACESHIP_WIDTH 5 +#define SPACESHIP_HEIGHT 6 +#define UFO_SIZE 4 +#define UFO_SPEED 1 +#define SPACESHIP_LIFE 2 + +/////////////// objects /////////////// +N5110 lcd(PTC9,PTC0,PTC7,PTD2,PTD1,PTC11); +Joystick joystick(PTB10,PTB11,PTC16); +InterruptIn start(PTC5); +InterruptIn buttonX(PTC17); +InterruptIn buttonY(PTC12); +InterruptIn buttonA(PTB9); +InterruptIn buttonB(PTD0); +BusOut output(PTA1,PTA2,PTC2,PTC3,PTC4,PTD3); //leds +bgm bgm; + +Ufo *Ufo = NULL; +shot *shot[5] = {NULL,NULL,NULL,NULL,NULL}; +Spaceship *Spaceship = NULL; +Homepage *Homepage = NULL; + +int score[3] = {0,0,0}; +int curScore = 0; +int fail = 0; +int count = 0; +int mode = 0; + +///////////// prototypes /////////////// +void attack(); +void move(int signal); +void shoot(); +void welcome(); +void over(); +void updateScore(); +void over(); +void init(); +void updateGame(); + +///////////// functions //////////////// +int main(){ + + init(); + + while (1) { + //welcome to the star war + Homepage->welcome(lcd,output,bgm); + //choose different function + Homepage->Homepage(lcd,buttonA,buttonY,buttonX,buttonB,start,score,3); + Spaceship = new Spaceship(); + Spaceship->init(37,38,10,10); + //choose the mode: easy, normal, defficult + mode = Homepage->getMode(); + while(1){ + //playing... + updateGame(); + //failing, check weather playing again + if (fail == 1) { + int tmp = Homepage->again(lcd,curScore,buttonX,buttonY); + if(tmp == 0) + //do not play again + break; + else{ + //play again + curScore+=tmp; + fail = 0; + lcd.clear(); + Ufo = NULL; + } + } + count++; + //change Ufo's speed + if(count %8 == 0)Ufo->setSpeed(Ufo->getSpeed()+1); + wait(1.0f/3); + } + over(); + while (start == 0){ + } + lcd.clear(); + + } +} +//this function is used to update a game, such as +//display the current score, draw Spaceship, shot ect. +void updateGame(){ + Homepage->displayCurScore(lcd,curScore); + Direction d = joystick.get_direction(); + Spaceship->update(d); + Spaceship->draw(lcd); + shoot(); + attack(); + lcd.clear(); +} + +// initialies buttons, lcd and joystick +void init(){ + buttonX.mode(PullDown); + start.mode(PullDown); + buttonA.mode(PullDown); + buttonY.mode(PullDown); + buttonB.mode(PullDown); + joystick.init(); + lcd.init(); + Homepage = new Homepage(); +} + +//do something about game over, +//clear data, Bgm, etc. +void over(){ + bgm.tone(1500.0,0.5); + Homepage->over(lcd,output); + Ufo = NULL; + for(int i = 0;i<5;i++)shot[i] = NULL; + fail = 0; + count = 0; + updateScore(); + curScore = 0; +} + +//update top 3 history scores when game over +void updateScore(){ + for(int i = 0;i<3;i++){ + if(score[i]<curScore){ + //score[i] = curScore; + for(int j = 2;j>i;j--){ + score[j] = score[j-1]; + } + score[i] = curScore; + break; + } + } +} + +//display the movement of the shot +//initialize the shot +//shot moves upwards until the Ufo's blood ran out. +void shoot() { + if (buttonX == 1) { + for(int i = 0;i<5;i++){ + if(shot[i] == NULL){ + shot[i] = new shot(); + shot[i]->init(Spaceship->getPos().x+3,35,5,3); + break; + } + } + } + for(int i = 0;i<5;i++){ + if(shot[i]!=NULL){ + shot[i]->draw(lcd); + lcd.refresh(); + if(shot[i]->getPos().x>=Ufo->getPos().x && shot[i]->getPos().x<=(Ufo->getPos().x+12) && shot[i]->getPos().y<=(Ufo->getPos().y+5)){ //being shot + bgm.tone(750.0,0.1); + shot[i] = NULL; + Ufo->setBlood(1); + if(Ufo->getBlood() <= 0){ + Ufo = NULL; //destroy + curScore+=((mode+1)*2); //get points according to the mode + } + }else if(shot[i]->getPos().y<=0){ + shot[i] = NULL; + }else { + shot[i]->update(); + } + } + } +} + +//display the movement of the Ufo +//initialize the Ufo +//Ufo moves downwards until meets the Spaceship +void attack() { + if(Ufo == NULL){ + Ufo = new Ufo(mode); + Ufo->init(12,5); + Ufo->draw(lcd,mode); + lcd.refresh(); + } else { + Ufo->update(); + if(Ufo->getPos().y>=33){ + fail = 1; + }else{ + Ufo->draw(lcd,mode); + lcd.refresh(); + } + } +} + + + + +