Albert Tan Mulligan Submission

Dependencies:   mbed

Committer:
Albutt
Date:
Sun May 24 21:21:26 2020 +0000
Revision:
11:e60b40963095
Parent:
10:71ced616a64f
Child:
12:c557b6c9b17a
Dead Screen with Reset

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 10:71ced616a64f 34 Direction holder;
Albutt 10:71ced616a64f 35 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 36 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 3:fcc9cf213a61 37 //Variables
Albutt 10:71ced616a64f 38 State fsm[4] = {
Albutt 3:fcc9cf213a61 39 {0,{1,1}},
Albutt 10:71ced616a64f 40 {1,{2,3}},
Albutt 10:71ced616a64f 41 {2,{1,0}},
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 3:fcc9cf213a61 47 //PROTOTYPES
Albutt 3:fcc9cf213a61 48 void menu();
Albutt 3:fcc9cf213a61 49 void GameRun();
Albutt 3:fcc9cf213a61 50 void Pause();
Albutt 10:71ced616a64f 51 void AddEnemy();
Albutt 10:71ced616a64f 52 void PlayerDead();
Albutt 10:71ced616a64f 53 void animation();
Albutt 10:71ced616a64f 54 void reset();
Albutt 3:fcc9cf213a61 55 //FUNCTIONS
eencae 0:b7f1f47bb26a 56 int main()
Albutt 3:fcc9cf213a61 57 {
Albutt 3:fcc9cf213a61 58 //pc.printf("Main Open");
Albutt 3:fcc9cf213a61 59 //SETUPS
Albutt 3:fcc9cf213a61 60 pad.init();
Albutt 2:c25ec0da7636 61 lcd.init();
Albutt 10:71ced616a64f 62 lcd.setContrast(0.4+(pad.read_pot1()/2.0));
Albutt 3:fcc9cf213a61 63 lcd.clear();
Albutt 10:71ced616a64f 64 lcd.refresh();
Albutt 3:fcc9cf213a61 65 //testing CoolTerm
Albutt 3:fcc9cf213a61 66 //pc.printf("CoolTerm is Connected\n");
Albutt 3:fcc9cf213a61 67 //pc.printf("CurrentState = %d\n", Current_State);
Albutt 2:c25ec0da7636 68
Albutt 3:fcc9cf213a61 69 while(1){
Albutt 3:fcc9cf213a61 70 if(Current_State == 0){
Albutt 3:fcc9cf213a61 71 menu();
Albutt 3:fcc9cf213a61 72 }
Albutt 3:fcc9cf213a61 73 else if (Current_State == 1){
Albutt 3:fcc9cf213a61 74 GameRun();
Albutt 3:fcc9cf213a61 75 }
Albutt 10:71ced616a64f 76 else if (Current_State == 2){
Albutt 3:fcc9cf213a61 77 Pause();
Albutt 3:fcc9cf213a61 78 }
Albutt 10:71ced616a64f 79 else if (Current_State == 3){
Albutt 10:71ced616a64f 80 PlayerDead();
Albutt 10:71ced616a64f 81 }
Albutt 3:fcc9cf213a61 82 }
Albutt 3:fcc9cf213a61 83 }
Albutt 3:fcc9cf213a61 84
Albutt 3:fcc9cf213a61 85 void menu(){
Albutt 3:fcc9cf213a61 86 //pc.printf("Menu Open");
Albutt 10:71ced616a64f 87 lcd.clear();
Albutt 10:71ced616a64f 88 lcd.printString("BoxHead",21,1);
Albutt 10:71ced616a64f 89 lcd.printString(" Press A to ",0,3);
Albutt 10:71ced616a64f 90 lcd.printString("Start",27,4);
Albutt 3:fcc9cf213a61 91 lcd.refresh();
Albutt 3:fcc9cf213a61 92 while (1) {
Albutt 3:fcc9cf213a61 93 //pc.printf("While Loop + %d", g_pad.Button_A_flag);
Albutt 3:fcc9cf213a61 94 if (pad.A_pressed()) {
Albutt 3:fcc9cf213a61 95 //pc.printf("Button_A");
Albutt 10:71ced616a64f 96 animation();
Albutt 3:fcc9cf213a61 97 Current_State = fsm[0].next_state[0];
Albutt 6:546eba371942 98 enemies.push_back(Enemy(timer));
Albutt 3:fcc9cf213a61 99 p1.init(40,22);
Albutt 3:fcc9cf213a61 100 return;
Albutt 3:fcc9cf213a61 101 }
Albutt 4:b16b6078a432 102 sleep();
Albutt 3:fcc9cf213a61 103 }
Albutt 3:fcc9cf213a61 104 }
Albutt 3:fcc9cf213a61 105
Albutt 3:fcc9cf213a61 106 void GameRun(){
Albutt 3:fcc9cf213a61 107 //pc.printf("Game Open");
Albutt 2:c25ec0da7636 108 Direction dir = pad.get_direction();
Albutt 2:c25ec0da7636 109 float mag = pad.get_mag();
Albutt 10:71ced616a64f 110 pad.play_melody(46, melody,durations,180.0,true);
Albutt 2:c25ec0da7636 111 while(1){
Albutt 6:546eba371942 112 timer++;
Albutt 10:71ced616a64f 113 if(timer%100==0){
Albutt 10:71ced616a64f 114 AddEnemy();
Albutt 10:71ced616a64f 115 }
Albutt 3:fcc9cf213a61 116 //movement code
Albutt 2:c25ec0da7636 117 dir = pad.get_direction();
Albutt 2:c25ec0da7636 118 mag = pad.get_mag();
Albutt 10:71ced616a64f 119 if(dir == N){
Albutt 10:71ced616a64f 120 holder = dir;
Albutt 10:71ced616a64f 121 }
Albutt 10:71ced616a64f 122 else if(dir == S){
Albutt 10:71ced616a64f 123 holder = dir;
Albutt 10:71ced616a64f 124 }
Albutt 10:71ced616a64f 125 else if(dir == E){
Albutt 10:71ced616a64f 126 holder = dir;
Albutt 10:71ced616a64f 127 }
Albutt 10:71ced616a64f 128 else if(dir == W){
Albutt 10:71ced616a64f 129 holder = dir;
Albutt 10:71ced616a64f 130 }
Albutt 4:b16b6078a432 131 if (pad.A_pressed()) {
Albutt 10:71ced616a64f 132 shots.push_back(Bullets(p1.get_x()+2, p1.get_y()+2, holder));
Albutt 4:b16b6078a432 133 }
Albutt 2:c25ec0da7636 134 p1.update(dir, mag);
Albutt 8:0c6d6ed55851 135 for(int i = 0; i<shots.size(); i++){
Albutt 8:0c6d6ed55851 136 shots.at(i).update();
Albutt 6:546eba371942 137 }
Albutt 8:0c6d6ed55851 138 for(int i = 1; i<shots.size(); i++){
Albutt 8:0c6d6ed55851 139 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 7:0434857199cf 140 shots.erase(shots.begin()+i);
Albutt 7:0434857199cf 141 }
Albutt 8:0c6d6ed55851 142 }
Albutt 8:0c6d6ed55851 143 for(int i = 0; i<enemies.size(); i++){
Albutt 8:0c6d6ed55851 144 enemies.at(i).update(p1.get_x()+1, p1.get_y()+1);
Albutt 10:71ced616a64f 145 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 10:71ced616a64f 146 Current_State = fsm[Current_State].next_state[1];
Albutt 10:71ced616a64f 147 return;
Albutt 10:71ced616a64f 148 }
Albutt 9:62fe47a1374f 149 for(int j = 0; j<shots.size(); j++){
Albutt 9:62fe47a1374f 150 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 9:62fe47a1374f 151 shots.at(j).dead();
Albutt 10:71ced616a64f 152 enemies.at(i).reset(timer);
Albutt 10:71ced616a64f 153 score++;
Albutt 8:0c6d6ed55851 154 }
Albutt 8:0c6d6ed55851 155 }
Albutt 7:0434857199cf 156 }
Albutt 9:62fe47a1374f 157
Albutt 4:b16b6078a432 158 lcd.clear();
Albutt 6:546eba371942 159 for(int i = 0; i<enemies.size(); i++){
Albutt 6:546eba371942 160 enemies.at(i).draw(lcd);
Albutt 6:546eba371942 161 }
Albutt 7:0434857199cf 162 for(int i = 0; i<shots.size(); i++){
Albutt 7:0434857199cf 163 shots.at(i).draw(lcd);
Albutt 7:0434857199cf 164 }
Albutt 2:c25ec0da7636 165 p1.draw(lcd);
Albutt 2:c25ec0da7636 166 lcd.refresh();
Albutt 4:b16b6078a432 167 wait(1.0f/10.0f);
Albutt 3:fcc9cf213a61 168 if (pad.start_pressed()) {
Albutt 3:fcc9cf213a61 169 Current_State = fsm[Current_State].next_state[0];
Albutt 3:fcc9cf213a61 170 return;
Albutt 3:fcc9cf213a61 171
Albutt 3:fcc9cf213a61 172 }
Albutt 2:c25ec0da7636 173 }
eencae 0:b7f1f47bb26a 174 }
Albutt 3:fcc9cf213a61 175 void Pause(){
Albutt 10:71ced616a64f 176 lcd.printString(" PAUSED",0,1);
Albutt 3:fcc9cf213a61 177 lcd.refresh();
Albutt 3:fcc9cf213a61 178 // put the MCU to sleep until an interrupt wakes it up
Albutt 3:fcc9cf213a61 179 if (pad.start_pressed()) {
Albutt 3:fcc9cf213a61 180 Current_State = fsm[Current_State].next_state[0];
Albutt 3:fcc9cf213a61 181 return;
eencae 0:b7f1f47bb26a 182
Albutt 3:fcc9cf213a61 183 }
Albutt 3:fcc9cf213a61 184 if (pad.B_pressed()) {
Albutt 3:fcc9cf213a61 185 Current_State = fsm[Current_State].next_state[1];
Albutt 3:fcc9cf213a61 186 lcd.clear();
Albutt 3:fcc9cf213a61 187 return;
Albutt 3:fcc9cf213a61 188
Albutt 3:fcc9cf213a61 189 }
Albutt 3:fcc9cf213a61 190 sleep();
Albutt 3:fcc9cf213a61 191 }
Albutt 10:71ced616a64f 192 void AddEnemy(){
Albutt 10:71ced616a64f 193 enemies.push_back(Enemy(timer));
Albutt 3:fcc9cf213a61 194 return;
Albutt 3:fcc9cf213a61 195 }
Albutt 10:71ced616a64f 196 void PlayerDead(){
Albutt 10:71ced616a64f 197 lcd.clear();
Albutt 10:71ced616a64f 198 lcd.printString("YOU DIED",18,1);
Albutt 10:71ced616a64f 199 char buffer[14];
Albutt 10:71ced616a64f 200 if(score>10){
Albutt 10:71ced616a64f 201 sprintf(buffer, " Score:%d", score);
Albutt 10:71ced616a64f 202 lcd.printString(buffer,0,2);
Albutt 10:71ced616a64f 203 }else{
Albutt 10:71ced616a64f 204 sprintf(buffer, "Score:0%d", score);
Albutt 10:71ced616a64f 205 lcd.printString(buffer,18,2);
Albutt 10:71ced616a64f 206 }
Albutt 10:71ced616a64f 207 lcd.printString(" Press A to ",0,4);
Albutt 10:71ced616a64f 208 lcd.printString("Restart",21,5);
Albutt 10:71ced616a64f 209 lcd.refresh();
Albutt 10:71ced616a64f 210 while(1){
Albutt 10:71ced616a64f 211 if(pad.A_pressed()){
Albutt 10:71ced616a64f 212 Current_State =fsm[Current_State].next_state[1];
Albutt 10:71ced616a64f 213 return;
Albutt 10:71ced616a64f 214 }
Albutt 10:71ced616a64f 215 sleep();
Albutt 10:71ced616a64f 216 }
Albutt 10:71ced616a64f 217 }
Albutt 10:71ced616a64f 218
Albutt 10:71ced616a64f 219 void animation(){
Albutt 10:71ced616a64f 220 for(int i = 1; i<=42; i++){
Albutt 10:71ced616a64f 221 lcd.drawRect(0,0,i,48,FILL_BLACK);
Albutt 10:71ced616a64f 222 lcd.drawRect(84-i,0,i,48,FILL_BLACK);
Albutt 10:71ced616a64f 223 lcd.refresh();
Albutt 10:71ced616a64f 224 wait(0.005);
Albutt 10:71ced616a64f 225 }
Albutt 10:71ced616a64f 226 for(int i = 1; i<=42; i++){
Albutt 10:71ced616a64f 227 lcd.drawRect(0,0,i,48,FILL_WHITE);
Albutt 10:71ced616a64f 228 lcd.drawRect(84-i,0,i,48,FILL_WHITE);
Albutt 10:71ced616a64f 229 lcd.refresh();
Albutt 10:71ced616a64f 230 wait(0.005);
Albutt 10:71ced616a64f 231 }
Albutt 10:71ced616a64f 232
Albutt 10:71ced616a64f 233 return;
Albutt 10:71ced616a64f 234 }
Albutt 11:e60b40963095 235 void reset(){
Albutt 11:e60b40963095 236 score = 0;
Albutt 11:e60b40963095 237 while(enemies.size()>=1){
Albutt 11:e60b40963095 238 enemies.pop_back();
Albutt 11:e60b40963095 239 }
Albutt 11:e60b40963095 240 while(shots.size()>=1){
Albutt 11:e60b40963095 241 shots.pop_back();
Albutt 11:e60b40963095 242 }
Albutt 11:e60b40963095 243 p1.reset();
Albutt 11:e60b40963095 244 return;
Albutt 11:e60b40963095 245 }