Testing Documentation

Dependencies:   mbed

Committer:
Albutt
Date:
Wed May 27 00:57:33 2020 +0000
Revision:
24:19994f789276
Parent:
17:c81c09625d92
Testing Documentation

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Albutt 15:3dbb3f4d7ae6 1 /*
eencae 0:b7f1f47bb26a 2 ELEC2645 Embedded Systems Project
eencae 0:b7f1f47bb26a 3 School of Electronic & Electrical Engineering
eencae 0:b7f1f47bb26a 4 University of Leeds
eencae 0:b7f1f47bb26a 5 2019/20
eencae 0:b7f1f47bb26a 6
Albutt 1:a52187d01a78 7 Name: Albert Tan Mulligan
Albutt 1:a52187d01a78 8 Username: el18ajst
Albutt 1:a52187d01a78 9 Student ID Number:201241153
Albutt 1:a52187d01a78 10 Date:10/4/2020
eencae 0:b7f1f47bb26a 11 */
eencae 0:b7f1f47bb26a 12
Albutt 24:19994f789276 13 // INCLUDES
eencae 0:b7f1f47bb26a 14 #include "mbed.h"
eencae 0:b7f1f47bb26a 15 #include "Gamepad.h"
eencae 0:b7f1f47bb26a 16 #include "N5110.h"
Albutt 2:c25ec0da7636 17 #include "Character.h"
Albutt 4:b16b6078a432 18 #include "Bullets.h"
Albutt 5:51fd6635141f 19 #include "Enemy.h"
Albutt 15:3dbb3f4d7ae6 20 #include "Bitmaps.h"
Albutt 6:546eba371942 21 #include <vector>
Albutt 15:3dbb3f4d7ae6 22 #include <Bitmap.h>
Albutt 17:c81c09625d92 23
Albutt 17:c81c09625d92 24 //my computer had issues with CoolTerm but setting up serial communication fixed it
Albutt 2:c25ec0da7636 25 Serial pc(USBTX, USBRX);
Albutt 3:fcc9cf213a61 26 //STRUCTS
Albutt 3:fcc9cf213a61 27 struct State {
Albutt 15:3dbb3f4d7ae6 28 int number;
Albutt 15:3dbb3f4d7ae6 29 int next_state[2];
Albutt 3:fcc9cf213a61 30 };
Albutt 3:fcc9cf213a61 31
Albutt 3:fcc9cf213a61 32 //OBJECTS
eencae 0:b7f1f47bb26a 33 Gamepad pad;
eencae 0:b7f1f47bb26a 34 N5110 lcd;
Albutt 2:c25ec0da7636 35 Character p1;
Albutt 7:0434857199cf 36 vector<Bullets> shots;
Albutt 6:546eba371942 37 vector<Enemy> enemies;
Albutt 13:217c6102ffc0 38
Albutt 13:217c6102ffc0 39 //Variables
Albutt 10:71ced616a64f 40 int melody[46] = {277, 330, 311, 277, 330, 311, 330, 311, 370, 330, 415, 330, 277, 330, 311, 277, 330, 311, 330, 311, 370, 330, 311, 247, 277, 330, 311, 277, 330, 311, 330, 311, 370, 330, 415, 440, 330, 415, 440, 494, 554, 415, 440, 494, 622, 659}; // #c = 277, d# =311, f# = 370, g# = 415
Albutt 10:71ced616a64f 41 int durations[46] = {4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4};
Albutt 15:3dbb3f4d7ae6 42 int dead_music[6] = {0, 0, 220, 220, 220, 175};
Albutt 15:3dbb3f4d7ae6 43 int dead_duration[6] = {8,8,8,8,8,1};
Albutt 10:71ced616a64f 44 State fsm[4] = {
Albutt 15:3dbb3f4d7ae6 45 {0,{1,1}},
Albutt 15:3dbb3f4d7ae6 46 {1,{2,3}},
Albutt 15:3dbb3f4d7ae6 47 {2,{1,1}},
Albutt 15:3dbb3f4d7ae6 48 {3,{0,0}}
Albutt 15:3dbb3f4d7ae6 49 };
Albutt 3:fcc9cf213a61 50 volatile int Current_State = 0;
Albutt 6:546eba371942 51 volatile int timer = 0;
Albutt 10:71ced616a64f 52 volatile int score = 0;
Albutt 12:c557b6c9b17a 53 volatile int holder;
Albutt 13:217c6102ffc0 54
Albutt 3:fcc9cf213a61 55 //PROTOTYPES
Albutt 3:fcc9cf213a61 56 void menu();
Albutt 3:fcc9cf213a61 57 void GameRun();
Albutt 3:fcc9cf213a61 58 void Pause();
Albutt 10:71ced616a64f 59 void AddEnemy();
Albutt 10:71ced616a64f 60 void PlayerDead();
Albutt 10:71ced616a64f 61 void animation();
Albutt 10:71ced616a64f 62 void reset();
Albutt 12:c557b6c9b17a 63 void collisions();
Albutt 12:c557b6c9b17a 64 void draws();
Albutt 12:c557b6c9b17a 65 void updates(Direction dir);
Albutt 15:3dbb3f4d7ae6 66 void DeathAnimation();
Albutt 13:217c6102ffc0 67
Albutt 3:fcc9cf213a61 68 //FUNCTIONS
Albutt 15:3dbb3f4d7ae6 69 int main() //pc.printf("Main Open");
Albutt 15:3dbb3f4d7ae6 70 {
Albutt 24:19994f789276 71 pad.init(); //initial setups
Albutt 2:c25ec0da7636 72 lcd.init();
Albutt 3:fcc9cf213a61 73 lcd.clear();
Albutt 3:fcc9cf213a61 74 //pc.printf("CoolTerm is Connected\n");
Albutt 15:3dbb3f4d7ae6 75 lcd.setContrast(0.3 + (pad.read_pot1() / 5.0));
Albutt 15:3dbb3f4d7ae6 76 while(1) {
Albutt 15:3dbb3f4d7ae6 77 //pc.printf("CurrentState = %d\n", Current_State);
Albutt 15:3dbb3f4d7ae6 78 if(Current_State == 0) {
Albutt 15:3dbb3f4d7ae6 79 menu();
Albutt 15:3dbb3f4d7ae6 80 } else if (Current_State == 1) {
Albutt 15:3dbb3f4d7ae6 81 GameRun();
Albutt 15:3dbb3f4d7ae6 82 } else if (Current_State == 2) {
Albutt 15:3dbb3f4d7ae6 83 Pause();
Albutt 15:3dbb3f4d7ae6 84 } else if (Current_State == 3) {
Albutt 15:3dbb3f4d7ae6 85 PlayerDead();
Albutt 15:3dbb3f4d7ae6 86 reset();
Albutt 3:fcc9cf213a61 87 }
Albutt 15:3dbb3f4d7ae6 88 }
Albutt 3:fcc9cf213a61 89 }
Albutt 3:fcc9cf213a61 90
Albutt 15:3dbb3f4d7ae6 91 void menu()
Albutt 15:3dbb3f4d7ae6 92 {
Albutt 3:fcc9cf213a61 93 //pc.printf("Menu Open");
Albutt 10:71ced616a64f 94 lcd.clear();
Albutt 16:a3a47fcba272 95 Bitmap sprite(Title, 17, 60);
Albutt 16:a3a47fcba272 96 sprite.render(lcd, 10, 6);
Albutt 15:3dbb3f4d7ae6 97 lcd.printString(" Press A to ",0,3);
Albutt 15:3dbb3f4d7ae6 98 lcd.printString("Start",27,4);
Albutt 3:fcc9cf213a61 99 lcd.refresh();
Albutt 12:c557b6c9b17a 100 while (1) {
Albutt 3:fcc9cf213a61 101 //pc.printf("While Loop + %d", g_pad.Button_A_flag);
Albutt 13:217c6102ffc0 102 if (pad.A_held()) {
Albutt 13:217c6102ffc0 103 //pc.printf("Button_A");
Albutt 13:217c6102ffc0 104 animation();
Albutt 13:217c6102ffc0 105 Current_State = fsm[0].next_state[0];
Albutt 13:217c6102ffc0 106 enemies.push_back(Enemy(timer));
Albutt 15:3dbb3f4d7ae6 107 timer = 0;
Albutt 13:217c6102ffc0 108 p1.init(40,22);
Albutt 13:217c6102ffc0 109 return;
Albutt 15:3dbb3f4d7ae6 110 }
Albutt 4:b16b6078a432 111 sleep();
Albutt 15:3dbb3f4d7ae6 112 }
Albutt 3:fcc9cf213a61 113 }
Albutt 15:3dbb3f4d7ae6 114 //Runs actual game code
Albutt 15:3dbb3f4d7ae6 115 void GameRun()
Albutt 15:3dbb3f4d7ae6 116 {
Albutt 17:c81c09625d92 117 //pc.printf("Game Open/n");
Albutt 2:c25ec0da7636 118 Direction dir = pad.get_direction();
Albutt 10:71ced616a64f 119 pad.play_melody(46, melody,durations,180.0,true);
Albutt 15:3dbb3f4d7ae6 120 while(1) { //main game run loop
Albutt 17:c81c09625d92 121 //pc.printf("Direction = %d/n", dir);
Albutt 15:3dbb3f4d7ae6 122 timer++; //Timer to seed random functions/spawn enemies intermittently
Albutt 15:3dbb3f4d7ae6 123 if(timer % 100 == 0) {
Albutt 15:3dbb3f4d7ae6 124 AddEnemy();
Albutt 15:3dbb3f4d7ae6 125 }
Albutt 2:c25ec0da7636 126 dir = pad.get_direction();
Albutt 15:3dbb3f4d7ae6 127
Albutt 15:3dbb3f4d7ae6 128 if(dir == N) {
Albutt 15:3dbb3f4d7ae6 129 holder = 0; //setting a placeholder for last direction, because bullets should travel in facing direction if the joystick is in neutral position
Albutt 15:3dbb3f4d7ae6 130 } else if(dir == S) {
Albutt 15:3dbb3f4d7ae6 131 holder = 2;
Albutt 15:3dbb3f4d7ae6 132 } else if(dir == E) {
Albutt 15:3dbb3f4d7ae6 133 holder = 1;
Albutt 15:3dbb3f4d7ae6 134 } else if(dir == W) {
Albutt 15:3dbb3f4d7ae6 135 holder = 3;
Albutt 15:3dbb3f4d7ae6 136 }
Albutt 13:217c6102ffc0 137 //pc.printf("Direction holder = %d\n", holder);
Albutt 15:3dbb3f4d7ae6 138
Albutt 15:3dbb3f4d7ae6 139 if (pad.A_pressed()) { //shoot if A is pressed
Albutt 15:3dbb3f4d7ae6 140 shots.push_back( Bullets( p1.get_x() + 2, p1.get_y() + 2, holder));
Albutt 15:3dbb3f4d7ae6 141 }
Albutt 15:3dbb3f4d7ae6 142
Albutt 15:3dbb3f4d7ae6 143 //lcd updates, collsions and draws
Albutt 12:c557b6c9b17a 144 updates(dir);
Albutt 12:c557b6c9b17a 145 draws();
Albutt 12:c557b6c9b17a 146 collisions();
Albutt 15:3dbb3f4d7ae6 147
Albutt 13:217c6102ffc0 148 if (pad.start_held()) {
Albutt 17:c81c09625d92 149 //pc.printf("Start Held/n");
Albutt 15:3dbb3f4d7ae6 150 Current_State = fsm[Current_State].next_state[0]; //Brings up pause menu if you press start
Albutt 15:3dbb3f4d7ae6 151 return;
Albutt 15:3dbb3f4d7ae6 152 }
Albutt 15:3dbb3f4d7ae6 153
Albutt 15:3dbb3f4d7ae6 154 if(Current_State != 1) {
Albutt 15:3dbb3f4d7ae6 155 return; //Collisions could change current state to 3 (Dead state)
Albutt 15:3dbb3f4d7ae6 156 }
Albutt 13:217c6102ffc0 157 //setting frames
Albutt 4:b16b6078a432 158 wait(1.0f/10.0f);
Albutt 2:c25ec0da7636 159 }
eencae 0:b7f1f47bb26a 160 }
Albutt 13:217c6102ffc0 161
Albutt 15:3dbb3f4d7ae6 162 void Pause() //Creates the Pause menu
Albutt 15:3dbb3f4d7ae6 163 {
Albutt 17:c81c09625d92 164 //pc.printf("Pause Menu/n");
Albutt 15:3dbb3f4d7ae6 165 lcd.printString(" PAUSED",0,1);
Albutt 15:3dbb3f4d7ae6 166 lcd.refresh();
Albutt 15:3dbb3f4d7ae6 167 lcd.printString(" Press B to",0,4);
Albutt 15:3dbb3f4d7ae6 168 lcd.printString("Unpause",21,5);
Albutt 15:3dbb3f4d7ae6 169 if (pad.B_held()) { //B goes back to main game run code
Albutt 17:c81c09625d92 170 //pc.printf("B Held/n");
Albutt 15:3dbb3f4d7ae6 171 Current_State = fsm[Current_State].next_state[0];
Albutt 15:3dbb3f4d7ae6 172 lcd.clear();
Albutt 15:3dbb3f4d7ae6 173 return;
Albutt 15:3dbb3f4d7ae6 174 }
Albutt 15:3dbb3f4d7ae6 175 sleep(); //sleep function for interrupt
Albutt 15:3dbb3f4d7ae6 176 }
Albutt 15:3dbb3f4d7ae6 177
Albutt 15:3dbb3f4d7ae6 178 void AddEnemy() //Add enemies
Albutt 15:3dbb3f4d7ae6 179 {
Albutt 17:c81c09625d92 180 //pc.printf("Add Enemy/n");
Albutt 15:3dbb3f4d7ae6 181 enemies.push_back(Enemy(timer)); //adds an enemy to the vector of enemy class
Albutt 15:3dbb3f4d7ae6 182 return;
Albutt 15:3dbb3f4d7ae6 183 }
Albutt 15:3dbb3f4d7ae6 184
Albutt 15:3dbb3f4d7ae6 185 void PlayerDead() //Called When Player Dies, B returns the game to menu
Albutt 15:3dbb3f4d7ae6 186 {
Albutt 17:c81c09625d92 187 //pc.printf("Player Dead/n");
Albutt 15:3dbb3f4d7ae6 188 pad.play_melody(6, dead_music, dead_duration,90.0,false);
Albutt 15:3dbb3f4d7ae6 189 DeathAnimation();
Albutt 15:3dbb3f4d7ae6 190 lcd.inverseMode();
Albutt 15:3dbb3f4d7ae6 191 lcd.clear();
Albutt 15:3dbb3f4d7ae6 192 lcd.printString("YOU DIED",18,1);
Albutt 15:3dbb3f4d7ae6 193 char buffer[14];
Albutt 24:19994f789276 194 if(score >= 10) { //score displays differently if below 10 to make sure the text is centered
Albutt 15:3dbb3f4d7ae6 195 sprintf(buffer, " Score:%d", score);
Albutt 15:3dbb3f4d7ae6 196 lcd.printString(buffer,0,2);
Albutt 15:3dbb3f4d7ae6 197 } else {
Albutt 15:3dbb3f4d7ae6 198 sprintf(buffer, "Score:0%d", score);
Albutt 15:3dbb3f4d7ae6 199 lcd.printString(buffer,18,2);
Albutt 15:3dbb3f4d7ae6 200 }
Albutt 15:3dbb3f4d7ae6 201 lcd.printString(" Press B to ",0,4);
Albutt 15:3dbb3f4d7ae6 202 lcd.printString("Restart",21,5);
Albutt 15:3dbb3f4d7ae6 203 lcd.refresh();
Albutt 15:3dbb3f4d7ae6 204 while(1) {
Albutt 15:3dbb3f4d7ae6 205 if(pad.B_held()) {
Albutt 15:3dbb3f4d7ae6 206 Current_State =fsm[Current_State].next_state[1];
Albutt 15:3dbb3f4d7ae6 207 lcd.normalMode();
Albutt 3:fcc9cf213a61 208 return;
Albutt 3:fcc9cf213a61 209 }
Albutt 3:fcc9cf213a61 210 sleep();
Albutt 3:fcc9cf213a61 211 }
Albutt 15:3dbb3f4d7ae6 212 }
Albutt 15:3dbb3f4d7ae6 213
Albutt 15:3dbb3f4d7ae6 214 void animation() //Small animation for transition between main menus
Albutt 15:3dbb3f4d7ae6 215 {
Albutt 15:3dbb3f4d7ae6 216
Albutt 15:3dbb3f4d7ae6 217 for(int i = 1; i <= 42; i++) {
Albutt 15:3dbb3f4d7ae6 218 lcd.drawRect(0, 0, i, 48, FILL_BLACK);
Albutt 15:3dbb3f4d7ae6 219 lcd.drawRect(84-i, 0, i, 48, FILL_BLACK);
Albutt 15:3dbb3f4d7ae6 220 lcd.refresh();
Albutt 15:3dbb3f4d7ae6 221 wait(0.005);
Albutt 3:fcc9cf213a61 222 }
Albutt 15:3dbb3f4d7ae6 223
Albutt 15:3dbb3f4d7ae6 224 for(int i = 1; i <= 42; i++) {
Albutt 13:217c6102ffc0 225 lcd.drawRect(0, 0, i, 48, FILL_WHITE);
Albutt 13:217c6102ffc0 226 lcd.drawRect(84-i, 0, i, 48, FILL_WHITE);
Albutt 13:217c6102ffc0 227 lcd.refresh();
Albutt 13:217c6102ffc0 228 wait(0.005);
Albutt 10:71ced616a64f 229 }
Albutt 15:3dbb3f4d7ae6 230
Albutt 10:71ced616a64f 231 return;
Albutt 15:3dbb3f4d7ae6 232 }
Albutt 15:3dbb3f4d7ae6 233
Albutt 15:3dbb3f4d7ae6 234 void reset() //Resets the game variables when you die
Albutt 15:3dbb3f4d7ae6 235 {
Albutt 17:c81c09625d92 236 //pc.printf("Game Reset/n");
Albutt 11:e60b40963095 237 score = 0;
Albutt 15:3dbb3f4d7ae6 238 while(enemies.size() >= 1) {
Albutt 11:e60b40963095 239 enemies.pop_back();
Albutt 11:e60b40963095 240 }
Albutt 15:3dbb3f4d7ae6 241
Albutt 15:3dbb3f4d7ae6 242 while(shots.size() >= 1) {
Albutt 11:e60b40963095 243 shots.pop_back();
Albutt 11:e60b40963095 244 }
Albutt 15:3dbb3f4d7ae6 245
Albutt 11:e60b40963095 246 p1.reset();
Albutt 13:217c6102ffc0 247 holder = 0;
Albutt 11:e60b40963095 248 return;
Albutt 15:3dbb3f4d7ae6 249 }
Albutt 15:3dbb3f4d7ae6 250
Albutt 15:3dbb3f4d7ae6 251 void collisions() //all the collisions
Albutt 15:3dbb3f4d7ae6 252 {
Albutt 17:c81c09625d92 253 //pc.printf("Collisions/n");
Albutt 15:3dbb3f4d7ae6 254 for(int i = 1; i < shots.size(); i++) { //Checking all shots to make sure they are erased if they leave the screen
Albutt 15:3dbb3f4d7ae6 255 if(shots.at(i).get_x()>84 | shots.at(i).get_x()<1 | shots.at(i).get_y()>48 | shots.at(i).get_y()<1) {
Albutt 15:3dbb3f4d7ae6 256 shots.erase(shots.begin()+i);
Albutt 15:3dbb3f4d7ae6 257 }
Albutt 12:c557b6c9b17a 258 }
Albutt 15:3dbb3f4d7ae6 259
Albutt 15:3dbb3f4d7ae6 260 for(int i = 0; i < enemies.size(); i++) { //Checking all enemy-player collisions and enemy-bullet collisions
Albutt 15:3dbb3f4d7ae6 261 enemies.at(i).update(p1.get_x()+1, p1.get_y()+1); //update enemies to save processing time of having another large for loop in updates function
Albutt 15:3dbb3f4d7ae6 262
Albutt 13:217c6102ffc0 263 //enemy player collisions
Albutt 15:3dbb3f4d7ae6 264 if(enemies.at(i).get_x() >= p1.get_x()-1 & enemies.at(i).get_x() <= p1.get_x()+3 & enemies.at(i).get_y() >= p1.get_y()-1 & enemies.at(i).get_y() <= p1.get_y()+3) {
Albutt 13:217c6102ffc0 265 Current_State = fsm[Current_State].next_state[1];
Albutt 13:217c6102ffc0 266 return;
Albutt 15:3dbb3f4d7ae6 267 }
Albutt 15:3dbb3f4d7ae6 268
Albutt 15:3dbb3f4d7ae6 269 for(int j = 0; j < shots.size(); j++) { //enemy bullet collisions
Albutt 15:3dbb3f4d7ae6 270 if(shots.at(j).get_x() >= enemies.at(i).get_x() & shots.at(j).get_x() <= enemies.at(i).get_x()+3 & shots.at(j).get_y() >= enemies.at(i).get_y() & shots.at(j).get_y() <= enemies.at(i).get_y()+3) {
Albutt 13:217c6102ffc0 271 shots.at(j).dead();
Albutt 14:2d7e41f46879 272 enemies.at(i).reset(timer, lcd);
Albutt 13:217c6102ffc0 273 score++;
Albutt 13:217c6102ffc0 274 }
Albutt 13:217c6102ffc0 275 }
Albutt 12:c557b6c9b17a 276 }
Albutt 15:3dbb3f4d7ae6 277 }
Albutt 15:3dbb3f4d7ae6 278
Albutt 15:3dbb3f4d7ae6 279 void draws() //All the draw functions w/ clear and refresh
Albutt 15:3dbb3f4d7ae6 280 {
Albutt 17:c81c09625d92 281 //pc.printf("Draw Functions/n");
Albutt 15:3dbb3f4d7ae6 282 lcd.clear();
Albutt 15:3dbb3f4d7ae6 283 for(int i = 0; i < enemies.size(); i++) {
Albutt 15:3dbb3f4d7ae6 284 enemies.at(i).draw(lcd);
Albutt 12:c557b6c9b17a 285 }
Albutt 15:3dbb3f4d7ae6 286 for(int i = 0; i < shots.size(); i++) {
Albutt 15:3dbb3f4d7ae6 287 shots.at(i).draw(lcd);
Albutt 15:3dbb3f4d7ae6 288 }
Albutt 15:3dbb3f4d7ae6 289 p1.draw(lcd);
Albutt 15:3dbb3f4d7ae6 290 lcd.refresh();
Albutt 15:3dbb3f4d7ae6 291 }
Albutt 15:3dbb3f4d7ae6 292
Albutt 15:3dbb3f4d7ae6 293 void updates(Direction dir) //Updates objects after every frame(enemy update is in collisions)
Albutt 15:3dbb3f4d7ae6 294 {
Albutt 17:c81c09625d92 295 //pc.printf("Update Functions/n");
Albutt 12:c557b6c9b17a 296 p1.update(dir);
Albutt 15:3dbb3f4d7ae6 297 for(int i = 0; i < shots.size(); i++) {
Albutt 12:c557b6c9b17a 298 shots.at(i).update();
Albutt 12:c557b6c9b17a 299 }
Albutt 15:3dbb3f4d7ae6 300 }
Albutt 15:3dbb3f4d7ae6 301
Albutt 15:3dbb3f4d7ae6 302 void DeathAnimation() //falling blood animation on death
Albutt 15:3dbb3f4d7ae6 303 {
Albutt 15:3dbb3f4d7ae6 304 for(int i = 1; i <= 65; i++) {
Albutt 15:3dbb3f4d7ae6 305 Bitmap sprite(falling_blood, 17, 84);
Albutt 15:3dbb3f4d7ae6 306 sprite.render(lcd, 0, i-17);
Albutt 15:3dbb3f4d7ae6 307 lcd.drawRect(84, i, 0, 0, FILL_BLACK);
Albutt 15:3dbb3f4d7ae6 308 lcd.refresh();
Albutt 15:3dbb3f4d7ae6 309 wait(0.03);
Albutt 15:3dbb3f4d7ae6 310 }
Albutt 12:c557b6c9b17a 311 }