Albert Tan Mulligan Submission

Dependencies:   mbed

Committer:
Albutt
Date:
Tue May 26 12:49:15 2020 +0000
Revision:
13:217c6102ffc0
Parent:
12:c557b6c9b17a
Child:
14:2d7e41f46879
Bug fixes and comments

Who changed what in which revision?

UserRevisionLine numberNew contents of line
eencae 0:b7f1f47bb26a 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
eencae 0:b7f1f47bb26a 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 6:546eba371942 20 #include <vector>
Albutt 2:c25ec0da7636 21 Serial pc(USBTX, USBRX);
Albutt 3:fcc9cf213a61 22 //STRUCTS
Albutt 3:fcc9cf213a61 23 struct State {
Albutt 3:fcc9cf213a61 24 int number;
Albutt 3:fcc9cf213a61 25 int next_state[2];
Albutt 3:fcc9cf213a61 26 };
Albutt 3:fcc9cf213a61 27
Albutt 3:fcc9cf213a61 28 //OBJECTS
eencae 0:b7f1f47bb26a 29 Gamepad pad;
eencae 0:b7f1f47bb26a 30 N5110 lcd;
Albutt 2:c25ec0da7636 31 Character p1;
Albutt 7:0434857199cf 32 vector<Bullets> shots;
Albutt 6:546eba371942 33 vector<Enemy> enemies;
Albutt 13:217c6102ffc0 34
Albutt 13:217c6102ffc0 35 //Variables
Albutt 10:71ced616a64f 36 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 37 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 10:71ced616a64f 38 State fsm[4] = {
Albutt 3:fcc9cf213a61 39 {0,{1,1}},
Albutt 10:71ced616a64f 40 {1,{2,3}},
Albutt 13:217c6102ffc0 41 {2,{1,1}},
Albutt 10:71ced616a64f 42 {3,{0,0}}
Albutt 3:fcc9cf213a61 43 };
Albutt 3:fcc9cf213a61 44 volatile int Current_State = 0;
Albutt 6:546eba371942 45 volatile int timer = 0;
Albutt 10:71ced616a64f 46 volatile int score = 0;
Albutt 12:c557b6c9b17a 47 volatile int holder;
Albutt 13:217c6102ffc0 48
Albutt 3:fcc9cf213a61 49 //PROTOTYPES
Albutt 3:fcc9cf213a61 50 void menu();
Albutt 3:fcc9cf213a61 51 void GameRun();
Albutt 3:fcc9cf213a61 52 void Pause();
Albutt 10:71ced616a64f 53 void AddEnemy();
Albutt 10:71ced616a64f 54 void PlayerDead();
Albutt 10:71ced616a64f 55 void animation();
Albutt 10:71ced616a64f 56 void reset();
Albutt 12:c557b6c9b17a 57 void collisions();
Albutt 12:c557b6c9b17a 58 void draws();
Albutt 12:c557b6c9b17a 59 void updates(Direction dir);
Albutt 13:217c6102ffc0 60
Albutt 3:fcc9cf213a61 61 //FUNCTIONS
Albutt 13:217c6102ffc0 62 int main() {//pc.printf("Main Open");
Albutt 3:fcc9cf213a61 63 //SETUPS
Albutt 3:fcc9cf213a61 64 pad.init();
Albutt 2:c25ec0da7636 65 lcd.init();
Albutt 13:217c6102ffc0 66 lcd.setContrast(0.4 + (pad.read_pot1() / 2.0));
Albutt 3:fcc9cf213a61 67 lcd.clear();
Albutt 3:fcc9cf213a61 68 //pc.printf("CoolTerm is Connected\n");
Albutt 13:217c6102ffc0 69 while(1){
Albutt 3:fcc9cf213a61 70 //pc.printf("CurrentState = %d\n", Current_State);
Albutt 3:fcc9cf213a61 71 if(Current_State == 0){
Albutt 3:fcc9cf213a61 72 menu();
Albutt 3:fcc9cf213a61 73 }
Albutt 3:fcc9cf213a61 74 else if (Current_State == 1){
Albutt 3:fcc9cf213a61 75 GameRun();
Albutt 3:fcc9cf213a61 76 }
Albutt 10:71ced616a64f 77 else if (Current_State == 2){
Albutt 3:fcc9cf213a61 78 Pause();
Albutt 3:fcc9cf213a61 79 }
Albutt 10:71ced616a64f 80 else if (Current_State == 3){
Albutt 10:71ced616a64f 81 PlayerDead();
Albutt 13:217c6102ffc0 82 reset();
Albutt 10:71ced616a64f 83 }
Albutt 3:fcc9cf213a61 84 }
Albutt 3:fcc9cf213a61 85 }
Albutt 3:fcc9cf213a61 86
Albutt 3:fcc9cf213a61 87 void menu(){
Albutt 3:fcc9cf213a61 88 //pc.printf("Menu Open");
Albutt 10:71ced616a64f 89 lcd.clear();
Albutt 10:71ced616a64f 90 lcd.printString("BoxHead",21,1);
Albutt 10:71ced616a64f 91 lcd.printString(" Press A to ",0,3);
Albutt 10:71ced616a64f 92 lcd.printString("Start",27,4);
Albutt 3:fcc9cf213a61 93 lcd.refresh();
Albutt 12:c557b6c9b17a 94 while (1) {
Albutt 3:fcc9cf213a61 95 //pc.printf("While Loop + %d", g_pad.Button_A_flag);
Albutt 13:217c6102ffc0 96 if (pad.A_held()) {
Albutt 13:217c6102ffc0 97 //pc.printf("Button_A");
Albutt 13:217c6102ffc0 98 animation();
Albutt 13:217c6102ffc0 99 Current_State = fsm[0].next_state[0];
Albutt 13:217c6102ffc0 100 enemies.push_back(Enemy(timer));
Albutt 13:217c6102ffc0 101 p1.init(40,22);
Albutt 13:217c6102ffc0 102 return;
Albutt 3:fcc9cf213a61 103 }
Albutt 4:b16b6078a432 104 sleep();
Albutt 3:fcc9cf213a61 105 }
Albutt 3:fcc9cf213a61 106 }
Albutt 13:217c6102ffc0 107 //Runs actual game code
Albutt 3:fcc9cf213a61 108 void GameRun(){
Albutt 3:fcc9cf213a61 109 //pc.printf("Game Open");
Albutt 2:c25ec0da7636 110 Direction dir = pad.get_direction();
Albutt 10:71ced616a64f 111 pad.play_melody(46, melody,durations,180.0,true);
Albutt 13:217c6102ffc0 112 //main game run loop
Albutt 2:c25ec0da7636 113 while(1){
Albutt 13:217c6102ffc0 114 //Timer to seed random functions/spawn enemies intermittently
Albutt 6:546eba371942 115 timer++;
Albutt 12:c557b6c9b17a 116 if(timer%100==0){ AddEnemy(); }
Albutt 2:c25ec0da7636 117 dir = pad.get_direction();
Albutt 13:217c6102ffc0 118 //setting a placeholder for last direction, because bullets should travel in facing direction if the joystick is in neutral position
Albutt 12:c557b6c9b17a 119 if(dir == N){ holder = 0; }
Albutt 12:c557b6c9b17a 120 else if(dir == S){ holder = 2; }
Albutt 12:c557b6c9b17a 121 else if(dir == E){ holder = 1; }
Albutt 13:217c6102ffc0 122 else if(dir == W){ holder = 3; }
Albutt 13:217c6102ffc0 123 //pc.printf("Direction holder = %d\n", holder);
Albutt 13:217c6102ffc0 124 //shoot if A is pressed
Albutt 4:b16b6078a432 125 if (pad.A_pressed()) {
Albutt 12:c557b6c9b17a 126 shots.push_back(Bullets(p1.get_x()+2, p1.get_y()+2, holder)); }
Albutt 13:217c6102ffc0 127 //lcd updates, collsions and draws
Albutt 12:c557b6c9b17a 128 updates(dir);
Albutt 12:c557b6c9b17a 129 draws();
Albutt 12:c557b6c9b17a 130 collisions();
Albutt 13:217c6102ffc0 131 //Brings up pause menu if you press start
Albutt 13:217c6102ffc0 132 if (pad.start_held()) {
Albutt 13:217c6102ffc0 133 Current_State = fsm[Current_State].next_state[0];
Albutt 13:217c6102ffc0 134 return; }
Albutt 13:217c6102ffc0 135 //Collisions could change current state to 3 (Dead state)
Albutt 13:217c6102ffc0 136 if(Current_State!= 1){ return; }
Albutt 13:217c6102ffc0 137 //setting frames
Albutt 4:b16b6078a432 138 wait(1.0f/10.0f);
Albutt 2:c25ec0da7636 139 }
eencae 0:b7f1f47bb26a 140 }
Albutt 13:217c6102ffc0 141
Albutt 3:fcc9cf213a61 142 void Pause(){
Albutt 10:71ced616a64f 143 lcd.printString(" PAUSED",0,1);
Albutt 3:fcc9cf213a61 144 lcd.refresh();
Albutt 13:217c6102ffc0 145 lcd.printString(" Press B to",0,4);
Albutt 13:217c6102ffc0 146 lcd.printString("Unpause",21,5);
Albutt 13:217c6102ffc0 147 //B goes back to main game run code
Albutt 13:217c6102ffc0 148 if (pad.B_held()) {
Albutt 3:fcc9cf213a61 149 Current_State = fsm[Current_State].next_state[0];
Albutt 3:fcc9cf213a61 150 lcd.clear();
Albutt 3:fcc9cf213a61 151 return;
Albutt 3:fcc9cf213a61 152 }
Albutt 13:217c6102ffc0 153 //sleep function for interrupt
Albutt 3:fcc9cf213a61 154 sleep();
Albutt 3:fcc9cf213a61 155 }
Albutt 13:217c6102ffc0 156 //Add enemies
Albutt 10:71ced616a64f 157 void AddEnemy(){
Albutt 13:217c6102ffc0 158 //adds an enemy to the vector of enemy class
Albutt 10:71ced616a64f 159 enemies.push_back(Enemy(timer));
Albutt 3:fcc9cf213a61 160 return;
Albutt 3:fcc9cf213a61 161 }
Albutt 13:217c6102ffc0 162 //Called When Player Dies, B returns the game to menu
Albutt 10:71ced616a64f 163 void PlayerDead(){
Albutt 10:71ced616a64f 164 lcd.clear();
Albutt 10:71ced616a64f 165 lcd.printString("YOU DIED",18,1);
Albutt 10:71ced616a64f 166 char buffer[14];
Albutt 10:71ced616a64f 167 if(score>10){
Albutt 10:71ced616a64f 168 sprintf(buffer, " Score:%d", score);
Albutt 10:71ced616a64f 169 lcd.printString(buffer,0,2);
Albutt 10:71ced616a64f 170 }else{
Albutt 10:71ced616a64f 171 sprintf(buffer, "Score:0%d", score);
Albutt 10:71ced616a64f 172 lcd.printString(buffer,18,2);
Albutt 10:71ced616a64f 173 }
Albutt 13:217c6102ffc0 174 lcd.printString(" Press B to ",0,4);
Albutt 10:71ced616a64f 175 lcd.printString("Restart",21,5);
Albutt 10:71ced616a64f 176 lcd.refresh();
Albutt 10:71ced616a64f 177 while(1){
Albutt 13:217c6102ffc0 178 if(pad.B_held()){
Albutt 13:217c6102ffc0 179 animation();
Albutt 10:71ced616a64f 180 Current_State =fsm[Current_State].next_state[1];
Albutt 10:71ced616a64f 181 return;
Albutt 10:71ced616a64f 182 }
Albutt 10:71ced616a64f 183 sleep();
Albutt 10:71ced616a64f 184 }
Albutt 10:71ced616a64f 185 }
Albutt 13:217c6102ffc0 186 //Small animation for transition between main menus
Albutt 10:71ced616a64f 187 void animation(){
Albutt 10:71ced616a64f 188 for(int i = 1; i<=42; i++){
Albutt 13:217c6102ffc0 189 lcd.drawRect(0, 0, i, 48, FILL_BLACK);
Albutt 13:217c6102ffc0 190 lcd.drawRect(84-i, 0, i, 48, FILL_BLACK);
Albutt 10:71ced616a64f 191 lcd.refresh();
Albutt 10:71ced616a64f 192 wait(0.005);
Albutt 10:71ced616a64f 193 }
Albutt 10:71ced616a64f 194 for(int i = 1; i<=42; i++){
Albutt 13:217c6102ffc0 195 lcd.drawRect(0, 0, i, 48, FILL_WHITE);
Albutt 13:217c6102ffc0 196 lcd.drawRect(84-i, 0, i, 48, FILL_WHITE);
Albutt 13:217c6102ffc0 197 lcd.refresh();
Albutt 13:217c6102ffc0 198 wait(0.005);
Albutt 10:71ced616a64f 199 }
Albutt 10:71ced616a64f 200
Albutt 10:71ced616a64f 201 return;
Albutt 10:71ced616a64f 202 }
Albutt 13:217c6102ffc0 203 //Resets the game variables when you die
Albutt 11:e60b40963095 204 void reset(){
Albutt 11:e60b40963095 205 score = 0;
Albutt 13:217c6102ffc0 206 while(enemies.size() >= 1){
Albutt 11:e60b40963095 207 enemies.pop_back();
Albutt 11:e60b40963095 208 }
Albutt 13:217c6102ffc0 209 while(shots.size() >= 1){
Albutt 11:e60b40963095 210 shots.pop_back();
Albutt 11:e60b40963095 211 }
Albutt 11:e60b40963095 212 p1.reset();
Albutt 13:217c6102ffc0 213 holder = 0;
Albutt 11:e60b40963095 214 return;
Albutt 12:c557b6c9b17a 215 }
Albutt 13:217c6102ffc0 216 //all the collisions and
Albutt 12:c557b6c9b17a 217 void collisions(){
Albutt 13:217c6102ffc0 218 //Checking all shots to make sure they are erased if they leave the screen
Albutt 13:217c6102ffc0 219 for(int i = 1; i < shots.size(); i++){
Albutt 13:217c6102ffc0 220 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 12:c557b6c9b17a 221 shots.erase(shots.begin()+i);
Albutt 12:c557b6c9b17a 222 }
Albutt 12:c557b6c9b17a 223 }
Albutt 13:217c6102ffc0 224 //Checking all enemy-player collisions and enemy-bullet collisions
Albutt 13:217c6102ffc0 225 for(int i = 0; i < enemies.size(); i++){
Albutt 13:217c6102ffc0 226 //update enemies to save processing time of having another large for loop in updates function
Albutt 13:217c6102ffc0 227 enemies.at(i).update(p1.get_x()+1, p1.get_y()+1);
Albutt 13:217c6102ffc0 228 //enemy player collisions
Albutt 13:217c6102ffc0 229 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 230 Current_State = fsm[Current_State].next_state[1];
Albutt 13:217c6102ffc0 231 return;
Albutt 12:c557b6c9b17a 232 }
Albutt 13:217c6102ffc0 233 //enemy bullet collisions
Albutt 13:217c6102ffc0 234 for(int j = 0; j < shots.size(); j++){
Albutt 13:217c6102ffc0 235 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 236 shots.at(j).dead();
Albutt 13:217c6102ffc0 237 enemies.at(i).reset(timer);
Albutt 13:217c6102ffc0 238 score++;
Albutt 13:217c6102ffc0 239 }
Albutt 13:217c6102ffc0 240 }
Albutt 13:217c6102ffc0 241 }
Albutt 12:c557b6c9b17a 242 }
Albutt 13:217c6102ffc0 243 //All the draw functions w/ clear and refresh
Albutt 12:c557b6c9b17a 244 void draws(){
Albutt 12:c557b6c9b17a 245 lcd.clear();
Albutt 12:c557b6c9b17a 246 for(int i = 0; i<enemies.size(); i++){
Albutt 12:c557b6c9b17a 247 enemies.at(i).draw(lcd);
Albutt 12:c557b6c9b17a 248 }
Albutt 12:c557b6c9b17a 249 for(int i = 0; i<shots.size(); i++){
Albutt 12:c557b6c9b17a 250 shots.at(i).draw(lcd);
Albutt 12:c557b6c9b17a 251 }
Albutt 12:c557b6c9b17a 252 p1.draw(lcd);
Albutt 12:c557b6c9b17a 253 lcd.refresh();
Albutt 12:c557b6c9b17a 254 }
Albutt 13:217c6102ffc0 255 //Updates objects after every frame(enemy update is in collisions)
Albutt 12:c557b6c9b17a 256 void updates(Direction dir){
Albutt 12:c557b6c9b17a 257 p1.update(dir);
Albutt 12:c557b6c9b17a 258 for(int i = 0; i<shots.size(); i++){
Albutt 12:c557b6c9b17a 259 shots.at(i).update();
Albutt 12:c557b6c9b17a 260 }
Albutt 12:c557b6c9b17a 261 }