Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@3:cf9fead9c3f4, 2020-05-14 (annotated)
- Committer:
- DannyLee
- Date:
- Thu May 14 13:12:28 2020 +0000
- Revision:
- 3:cf9fead9c3f4
- Child:
- 4:1ebf8b8842e0
aaa
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
DannyLee | 3:cf9fead9c3f4 | 1 | /* |
DannyLee | 3:cf9fead9c3f4 | 2 | ELEC2645 Embedded Systems Project |
DannyLee | 3:cf9fead9c3f4 | 3 | School of Electronic & Electrical Engineering |
DannyLee | 3:cf9fead9c3f4 | 4 | University of Leeds |
DannyLee | 3:cf9fead9c3f4 | 5 | Name:Li Ruofan |
DannyLee | 3:cf9fead9c3f4 | 6 | Username:el17rl |
DannyLee | 3:cf9fead9c3f4 | 7 | Student ID Number:201199450 |
DannyLee | 3:cf9fead9c3f4 | 8 | Date:12 May 2020 |
DannyLee | 3:cf9fead9c3f4 | 9 | */ |
DannyLee | 3:cf9fead9c3f4 | 10 | #include "mbed.h" |
DannyLee | 3:cf9fead9c3f4 | 11 | #include "N5110.h" |
DannyLee | 3:cf9fead9c3f4 | 12 | #include "Gamepad.h" |
DannyLee | 3:cf9fead9c3f4 | 13 | #include "shot.h" |
DannyLee | 3:cf9fead9c3f4 | 14 | #include "Ufo.h" |
DannyLee | 3:cf9fead9c3f4 | 15 | #include "Spaceship.h" |
DannyLee | 3:cf9fead9c3f4 | 16 | #include "bgm.h" |
DannyLee | 3:cf9fead9c3f4 | 17 | |
DannyLee | 3:cf9fead9c3f4 | 18 | #define SPACESHIP_WIDTH 5 |
DannyLee | 3:cf9fead9c3f4 | 19 | #define SPACESHIP_HEIGHT 6 |
DannyLee | 3:cf9fead9c3f4 | 20 | #define UFO_SIZE 4 |
DannyLee | 3:cf9fead9c3f4 | 21 | #define UFO_SPEED 1 |
DannyLee | 3:cf9fead9c3f4 | 22 | #define SPACESHIP_LIFE 2 |
DannyLee | 3:cf9fead9c3f4 | 23 | |
DannyLee | 3:cf9fead9c3f4 | 24 | /////////////// objects /////////////// |
DannyLee | 3:cf9fead9c3f4 | 25 | N5110 lcd(PTC9,PTC0,PTC7,PTD2,PTD1,PTC11); |
DannyLee | 3:cf9fead9c3f4 | 26 | Joystick joystick(PTB10,PTB11,PTC16); |
DannyLee | 3:cf9fead9c3f4 | 27 | InterruptIn start(PTC5); |
DannyLee | 3:cf9fead9c3f4 | 28 | InterruptIn buttonX(PTC17); |
DannyLee | 3:cf9fead9c3f4 | 29 | InterruptIn buttonY(PTC12); |
DannyLee | 3:cf9fead9c3f4 | 30 | InterruptIn buttonA(PTB9); |
DannyLee | 3:cf9fead9c3f4 | 31 | InterruptIn buttonB(PTD0); |
DannyLee | 3:cf9fead9c3f4 | 32 | BusOut output(PTA1,PTA2,PTC2,PTC3,PTC4,PTD3); //leds |
DannyLee | 3:cf9fead9c3f4 | 33 | bgm bgm; |
DannyLee | 3:cf9fead9c3f4 | 34 | |
DannyLee | 3:cf9fead9c3f4 | 35 | Ufo *Ufo = NULL; |
DannyLee | 3:cf9fead9c3f4 | 36 | shot *shot[5] = {NULL,NULL,NULL,NULL,NULL}; |
DannyLee | 3:cf9fead9c3f4 | 37 | Spaceship *Spaceship = NULL; |
DannyLee | 3:cf9fead9c3f4 | 38 | Homepage *Homepage = NULL; |
DannyLee | 3:cf9fead9c3f4 | 39 | |
DannyLee | 3:cf9fead9c3f4 | 40 | int score[3] = {0,0,0}; |
DannyLee | 3:cf9fead9c3f4 | 41 | int curScore = 0; |
DannyLee | 3:cf9fead9c3f4 | 42 | int fail = 0; |
DannyLee | 3:cf9fead9c3f4 | 43 | int count = 0; |
DannyLee | 3:cf9fead9c3f4 | 44 | int mode = 0; |
DannyLee | 3:cf9fead9c3f4 | 45 | |
DannyLee | 3:cf9fead9c3f4 | 46 | ///////////// prototypes /////////////// |
DannyLee | 3:cf9fead9c3f4 | 47 | void attack(); |
DannyLee | 3:cf9fead9c3f4 | 48 | void move(int signal); |
DannyLee | 3:cf9fead9c3f4 | 49 | void shoot(); |
DannyLee | 3:cf9fead9c3f4 | 50 | void welcome(); |
DannyLee | 3:cf9fead9c3f4 | 51 | void over(); |
DannyLee | 3:cf9fead9c3f4 | 52 | void updateScore(); |
DannyLee | 3:cf9fead9c3f4 | 53 | void over(); |
DannyLee | 3:cf9fead9c3f4 | 54 | void init(); |
DannyLee | 3:cf9fead9c3f4 | 55 | void updateGame(); |
DannyLee | 3:cf9fead9c3f4 | 56 | |
DannyLee | 3:cf9fead9c3f4 | 57 | ///////////// functions //////////////// |
DannyLee | 3:cf9fead9c3f4 | 58 | int main(){ |
DannyLee | 3:cf9fead9c3f4 | 59 | |
DannyLee | 3:cf9fead9c3f4 | 60 | init(); |
DannyLee | 3:cf9fead9c3f4 | 61 | |
DannyLee | 3:cf9fead9c3f4 | 62 | while (1) { |
DannyLee | 3:cf9fead9c3f4 | 63 | //welcome to the star war |
DannyLee | 3:cf9fead9c3f4 | 64 | Homepage->welcome(lcd,output,bgm); |
DannyLee | 3:cf9fead9c3f4 | 65 | //choose different function |
DannyLee | 3:cf9fead9c3f4 | 66 | Homepage->Homepage(lcd,buttonA,buttonY,buttonX,buttonB,start,score,3); |
DannyLee | 3:cf9fead9c3f4 | 67 | Spaceship = new Spaceship(); |
DannyLee | 3:cf9fead9c3f4 | 68 | Spaceship->init(37,38,10,10); |
DannyLee | 3:cf9fead9c3f4 | 69 | //choose the mode: easy, normal, defficult |
DannyLee | 3:cf9fead9c3f4 | 70 | mode = Homepage->getMode(); |
DannyLee | 3:cf9fead9c3f4 | 71 | while(1){ |
DannyLee | 3:cf9fead9c3f4 | 72 | //playing... |
DannyLee | 3:cf9fead9c3f4 | 73 | updateGame(); |
DannyLee | 3:cf9fead9c3f4 | 74 | //failing, check weather playing again |
DannyLee | 3:cf9fead9c3f4 | 75 | if (fail == 1) { |
DannyLee | 3:cf9fead9c3f4 | 76 | int tmp = Homepage->again(lcd,curScore,buttonX,buttonY); |
DannyLee | 3:cf9fead9c3f4 | 77 | if(tmp == 0) |
DannyLee | 3:cf9fead9c3f4 | 78 | //do not play again |
DannyLee | 3:cf9fead9c3f4 | 79 | break; |
DannyLee | 3:cf9fead9c3f4 | 80 | else{ |
DannyLee | 3:cf9fead9c3f4 | 81 | //play again |
DannyLee | 3:cf9fead9c3f4 | 82 | curScore+=tmp; |
DannyLee | 3:cf9fead9c3f4 | 83 | fail = 0; |
DannyLee | 3:cf9fead9c3f4 | 84 | lcd.clear(); |
DannyLee | 3:cf9fead9c3f4 | 85 | Ufo = NULL; |
DannyLee | 3:cf9fead9c3f4 | 86 | } |
DannyLee | 3:cf9fead9c3f4 | 87 | } |
DannyLee | 3:cf9fead9c3f4 | 88 | count++; |
DannyLee | 3:cf9fead9c3f4 | 89 | //change Ufo's speed |
DannyLee | 3:cf9fead9c3f4 | 90 | if(count %8 == 0)Ufo->setSpeed(Ufo->getSpeed()+1); |
DannyLee | 3:cf9fead9c3f4 | 91 | wait(1.0f/3); |
DannyLee | 3:cf9fead9c3f4 | 92 | } |
DannyLee | 3:cf9fead9c3f4 | 93 | over(); |
DannyLee | 3:cf9fead9c3f4 | 94 | while (start == 0){ |
DannyLee | 3:cf9fead9c3f4 | 95 | } |
DannyLee | 3:cf9fead9c3f4 | 96 | lcd.clear(); |
DannyLee | 3:cf9fead9c3f4 | 97 | |
DannyLee | 3:cf9fead9c3f4 | 98 | } |
DannyLee | 3:cf9fead9c3f4 | 99 | } |
DannyLee | 3:cf9fead9c3f4 | 100 | //this function is used to update a game, such as |
DannyLee | 3:cf9fead9c3f4 | 101 | //display the current score, draw Spaceship, shot ect. |
DannyLee | 3:cf9fead9c3f4 | 102 | void updateGame(){ |
DannyLee | 3:cf9fead9c3f4 | 103 | Homepage->displayCurScore(lcd,curScore); |
DannyLee | 3:cf9fead9c3f4 | 104 | Direction d = joystick.get_direction(); |
DannyLee | 3:cf9fead9c3f4 | 105 | Spaceship->update(d); |
DannyLee | 3:cf9fead9c3f4 | 106 | Spaceship->draw(lcd); |
DannyLee | 3:cf9fead9c3f4 | 107 | shoot(); |
DannyLee | 3:cf9fead9c3f4 | 108 | attack(); |
DannyLee | 3:cf9fead9c3f4 | 109 | lcd.clear(); |
DannyLee | 3:cf9fead9c3f4 | 110 | } |
DannyLee | 3:cf9fead9c3f4 | 111 | |
DannyLee | 3:cf9fead9c3f4 | 112 | // initialies buttons, lcd and joystick |
DannyLee | 3:cf9fead9c3f4 | 113 | void init(){ |
DannyLee | 3:cf9fead9c3f4 | 114 | buttonX.mode(PullDown); |
DannyLee | 3:cf9fead9c3f4 | 115 | start.mode(PullDown); |
DannyLee | 3:cf9fead9c3f4 | 116 | buttonA.mode(PullDown); |
DannyLee | 3:cf9fead9c3f4 | 117 | buttonY.mode(PullDown); |
DannyLee | 3:cf9fead9c3f4 | 118 | buttonB.mode(PullDown); |
DannyLee | 3:cf9fead9c3f4 | 119 | joystick.init(); |
DannyLee | 3:cf9fead9c3f4 | 120 | lcd.init(); |
DannyLee | 3:cf9fead9c3f4 | 121 | Homepage = new Homepage(); |
DannyLee | 3:cf9fead9c3f4 | 122 | } |
DannyLee | 3:cf9fead9c3f4 | 123 | |
DannyLee | 3:cf9fead9c3f4 | 124 | //do something about game over, |
DannyLee | 3:cf9fead9c3f4 | 125 | //clear data, Bgm, etc. |
DannyLee | 3:cf9fead9c3f4 | 126 | void over(){ |
DannyLee | 3:cf9fead9c3f4 | 127 | bgm.tone(1500.0,0.5); |
DannyLee | 3:cf9fead9c3f4 | 128 | Homepage->over(lcd,output); |
DannyLee | 3:cf9fead9c3f4 | 129 | Ufo = NULL; |
DannyLee | 3:cf9fead9c3f4 | 130 | for(int i = 0;i<5;i++)shot[i] = NULL; |
DannyLee | 3:cf9fead9c3f4 | 131 | fail = 0; |
DannyLee | 3:cf9fead9c3f4 | 132 | count = 0; |
DannyLee | 3:cf9fead9c3f4 | 133 | updateScore(); |
DannyLee | 3:cf9fead9c3f4 | 134 | curScore = 0; |
DannyLee | 3:cf9fead9c3f4 | 135 | } |
DannyLee | 3:cf9fead9c3f4 | 136 | |
DannyLee | 3:cf9fead9c3f4 | 137 | //update top 3 history scores when game over |
DannyLee | 3:cf9fead9c3f4 | 138 | void updateScore(){ |
DannyLee | 3:cf9fead9c3f4 | 139 | for(int i = 0;i<3;i++){ |
DannyLee | 3:cf9fead9c3f4 | 140 | if(score[i]<curScore){ |
DannyLee | 3:cf9fead9c3f4 | 141 | //score[i] = curScore; |
DannyLee | 3:cf9fead9c3f4 | 142 | for(int j = 2;j>i;j--){ |
DannyLee | 3:cf9fead9c3f4 | 143 | score[j] = score[j-1]; |
DannyLee | 3:cf9fead9c3f4 | 144 | } |
DannyLee | 3:cf9fead9c3f4 | 145 | score[i] = curScore; |
DannyLee | 3:cf9fead9c3f4 | 146 | break; |
DannyLee | 3:cf9fead9c3f4 | 147 | } |
DannyLee | 3:cf9fead9c3f4 | 148 | } |
DannyLee | 3:cf9fead9c3f4 | 149 | } |
DannyLee | 3:cf9fead9c3f4 | 150 | |
DannyLee | 3:cf9fead9c3f4 | 151 | //display the movement of the shot |
DannyLee | 3:cf9fead9c3f4 | 152 | //initialize the shot |
DannyLee | 3:cf9fead9c3f4 | 153 | //shot moves upwards until the Ufo's blood ran out. |
DannyLee | 3:cf9fead9c3f4 | 154 | void shoot() { |
DannyLee | 3:cf9fead9c3f4 | 155 | if (buttonX == 1) { |
DannyLee | 3:cf9fead9c3f4 | 156 | for(int i = 0;i<5;i++){ |
DannyLee | 3:cf9fead9c3f4 | 157 | if(shot[i] == NULL){ |
DannyLee | 3:cf9fead9c3f4 | 158 | shot[i] = new shot(); |
DannyLee | 3:cf9fead9c3f4 | 159 | shot[i]->init(Spaceship->getPos().x+3,35,5,3); |
DannyLee | 3:cf9fead9c3f4 | 160 | break; |
DannyLee | 3:cf9fead9c3f4 | 161 | } |
DannyLee | 3:cf9fead9c3f4 | 162 | } |
DannyLee | 3:cf9fead9c3f4 | 163 | } |
DannyLee | 3:cf9fead9c3f4 | 164 | for(int i = 0;i<5;i++){ |
DannyLee | 3:cf9fead9c3f4 | 165 | if(shot[i]!=NULL){ |
DannyLee | 3:cf9fead9c3f4 | 166 | shot[i]->draw(lcd); |
DannyLee | 3:cf9fead9c3f4 | 167 | lcd.refresh(); |
DannyLee | 3:cf9fead9c3f4 | 168 | 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 |
DannyLee | 3:cf9fead9c3f4 | 169 | bgm.tone(750.0,0.1); |
DannyLee | 3:cf9fead9c3f4 | 170 | shot[i] = NULL; |
DannyLee | 3:cf9fead9c3f4 | 171 | Ufo->setBlood(1); |
DannyLee | 3:cf9fead9c3f4 | 172 | if(Ufo->getBlood() <= 0){ |
DannyLee | 3:cf9fead9c3f4 | 173 | Ufo = NULL; //destroy |
DannyLee | 3:cf9fead9c3f4 | 174 | curScore+=((mode+1)*2); //get points according to the mode |
DannyLee | 3:cf9fead9c3f4 | 175 | } |
DannyLee | 3:cf9fead9c3f4 | 176 | }else if(shot[i]->getPos().y<=0){ |
DannyLee | 3:cf9fead9c3f4 | 177 | shot[i] = NULL; |
DannyLee | 3:cf9fead9c3f4 | 178 | }else { |
DannyLee | 3:cf9fead9c3f4 | 179 | shot[i]->update(); |
DannyLee | 3:cf9fead9c3f4 | 180 | } |
DannyLee | 3:cf9fead9c3f4 | 181 | } |
DannyLee | 3:cf9fead9c3f4 | 182 | } |
DannyLee | 3:cf9fead9c3f4 | 183 | } |
DannyLee | 3:cf9fead9c3f4 | 184 | |
DannyLee | 3:cf9fead9c3f4 | 185 | //display the movement of the Ufo |
DannyLee | 3:cf9fead9c3f4 | 186 | //initialize the Ufo |
DannyLee | 3:cf9fead9c3f4 | 187 | //Ufo moves downwards until meets the Spaceship |
DannyLee | 3:cf9fead9c3f4 | 188 | void attack() { |
DannyLee | 3:cf9fead9c3f4 | 189 | if(Ufo == NULL){ |
DannyLee | 3:cf9fead9c3f4 | 190 | Ufo = new Ufo(mode); |
DannyLee | 3:cf9fead9c3f4 | 191 | Ufo->init(12,5); |
DannyLee | 3:cf9fead9c3f4 | 192 | Ufo->draw(lcd,mode); |
DannyLee | 3:cf9fead9c3f4 | 193 | lcd.refresh(); |
DannyLee | 3:cf9fead9c3f4 | 194 | } else { |
DannyLee | 3:cf9fead9c3f4 | 195 | Ufo->update(); |
DannyLee | 3:cf9fead9c3f4 | 196 | if(Ufo->getPos().y>=33){ |
DannyLee | 3:cf9fead9c3f4 | 197 | fail = 1; |
DannyLee | 3:cf9fead9c3f4 | 198 | }else{ |
DannyLee | 3:cf9fead9c3f4 | 199 | Ufo->draw(lcd,mode); |
DannyLee | 3:cf9fead9c3f4 | 200 | lcd.refresh(); |
DannyLee | 3:cf9fead9c3f4 | 201 | } |
DannyLee | 3:cf9fead9c3f4 | 202 | } |
DannyLee | 3:cf9fead9c3f4 | 203 | } |
DannyLee | 3:cf9fead9c3f4 | 204 | |
DannyLee | 3:cf9fead9c3f4 | 205 | |
DannyLee | 3:cf9fead9c3f4 | 206 | |
DannyLee | 3:cf9fead9c3f4 | 207 | |
DannyLee | 3:cf9fead9c3f4 | 208 |