Joshua O'hara 201291390

Dependencies:   mbed

Committer:
josh_ohara
Date:
Mon May 18 19:26:06 2020 +0000
Revision:
35:517b56b010df
Parent:
34:853f0cf0ce03
Child:
36:78efa0e7bd31
Powerup function added

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
josh_ohara 1:9b659b3c092b 7 Name: Joshua O'hara
josh_ohara 1:9b659b3c092b 8 Username: el18jkeo
josh_ohara 1:9b659b3c092b 9 Student ID Number: 201291390
josh_ohara 1:9b659b3c092b 10 Date: 11.03.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"
josh_ohara 8:86cb9a9f8a73 17 #include "SpaceInvaderEngine.h"
eencae 0:b7f1f47bb26a 18
josh_ohara 12:be491ab6e742 19 #define SHIP_WIDTH 9
josh_ohara 8:86cb9a9f8a73 20 #define SHIP_HEIGHT 2
josh_ohara 12:be491ab6e742 21 #define ALIEN_SIZE 4
josh_ohara 12:be491ab6e742 22 #define ROW_SIZE 3
josh_ohara 12:be491ab6e742 23 #define COLUMN_SIZE 5
josh_ohara 15:dde4ce4bf7fe 24 #define COVER_Y 38
josh_ohara 15:dde4ce4bf7fe 25 #define COVER1_X 9
josh_ohara 15:dde4ce4bf7fe 26 #define COVER2_X 34
josh_ohara 15:dde4ce4bf7fe 27 #define COVER3_X 59
josh_ohara 15:dde4ce4bf7fe 28 #define ROCK_NUMBER 10
eencae 0:b7f1f47bb26a 29
eencae 0:b7f1f47bb26a 30 // objects
eencae 0:b7f1f47bb26a 31 Gamepad pad;
eencae 0:b7f1f47bb26a 32 N5110 lcd;
josh_ohara 8:86cb9a9f8a73 33 SpaceInvaderEngine SpaceInvader;
josh_ohara 8:86cb9a9f8a73 34
josh_ohara 8:86cb9a9f8a73 35 // structs
josh_ohara 8:86cb9a9f8a73 36 struct UserInput {
josh_ohara 8:86cb9a9f8a73 37 Direction d;
josh_ohara 8:86cb9a9f8a73 38 float mag;
josh_ohara 8:86cb9a9f8a73 39 };
josh_ohara 8:86cb9a9f8a73 40
josh_ohara 8:86cb9a9f8a73 41 //functions
josh_ohara 22:3e978b1d7958 42 void hardware_init();
josh_ohara 22:3e978b1d7958 43 void game_init();
josh_ohara 8:86cb9a9f8a73 44 void draw_game();
josh_ohara 8:86cb9a9f8a73 45 void start_menu();
josh_ohara 22:3e978b1d7958 46 void game_over(int level);
josh_ohara 22:3e978b1d7958 47 void next_level(int level);
josh_ohara 24:ff5af5a013b5 48 void select_difficulty();
josh_ohara 33:d8284dee58db 49 //variables
josh_ohara 33:d8284dee58db 50 int _fps;
josh_ohara 33:d8284dee58db 51 int _counter;
josh_ohara 33:d8284dee58db 52 int _level;
josh_ohara 33:d8284dee58db 53 int _difficulty;
josh_ohara 33:d8284dee58db 54 int _number_of_aliens;
josh_ohara 33:d8284dee58db 55 bool _armada_life;
josh_ohara 33:d8284dee58db 56 bool _ship_life;
josh_ohara 24:ff5af5a013b5 57
josh_ohara 24:ff5af5a013b5 58 Direction direction;
eencae 0:b7f1f47bb26a 59
eencae 0:b7f1f47bb26a 60 int main()
eencae 0:b7f1f47bb26a 61 {
josh_ohara 33:d8284dee58db 62 _fps = 6;
josh_ohara 33:d8284dee58db 63 _counter = 0;
josh_ohara 33:d8284dee58db 64 _level = 1;
josh_ohara 33:d8284dee58db 65 _armada_life = true;
josh_ohara 33:d8284dee58db 66 _ship_life = true;
eencae 0:b7f1f47bb26a 67
josh_ohara 22:3e978b1d7958 68 hardware_init();
josh_ohara 8:86cb9a9f8a73 69 start_menu();
josh_ohara 24:ff5af5a013b5 70 select_difficulty();
josh_ohara 24:ff5af5a013b5 71
josh_ohara 33:d8284dee58db 72 _number_of_aliens = 5*_difficulty;
josh_ohara 24:ff5af5a013b5 73
josh_ohara 8:86cb9a9f8a73 74 draw_game();
josh_ohara 33:d8284dee58db 75 wait(1.0f/_fps);
josh_ohara 8:86cb9a9f8a73 76
josh_ohara 22:3e978b1d7958 77 while(1){
josh_ohara 22:3e978b1d7958 78 hardware_init();
josh_ohara 22:3e978b1d7958 79 game_init();
josh_ohara 33:d8284dee58db 80 next_level(_level);
josh_ohara 8:86cb9a9f8a73 81 while(1) {
josh_ohara 8:86cb9a9f8a73 82 SpaceInvader.read_input(pad);
josh_ohara 33:d8284dee58db 83 SpaceInvader.update(pad, lcd, _counter, _level);
josh_ohara 8:86cb9a9f8a73 84 draw_game();
josh_ohara 33:d8284dee58db 85 wait(1.0f/_fps);
josh_ohara 33:d8284dee58db 86 _counter++;
josh_ohara 33:d8284dee58db 87 _ship_life = SpaceInvader.get_ship_life();
josh_ohara 33:d8284dee58db 88 if(_ship_life == false){
josh_ohara 33:d8284dee58db 89 game_over(_level);
josh_ohara 22:3e978b1d7958 90 }
josh_ohara 33:d8284dee58db 91 _armada_life = SpaceInvader.get_armada_life();
josh_ohara 33:d8284dee58db 92 if(_armada_life == false){
josh_ohara 22:3e978b1d7958 93 break;
josh_ohara 35:517b56b010df 94 }
josh_ohara 8:86cb9a9f8a73 95 }
josh_ohara 23:aa86e32b6a74 96 SpaceInvader.kill_all();
josh_ohara 33:d8284dee58db 97 _level++;
josh_ohara 22:3e978b1d7958 98 }
eencae 0:b7f1f47bb26a 99 }
eencae 0:b7f1f47bb26a 100
josh_ohara 33:d8284dee58db 101 void start_menu()
josh_ohara 33:d8284dee58db 102 {
josh_ohara 8:86cb9a9f8a73 103 lcd.printString("Space Invaders",0,1);
josh_ohara 8:86cb9a9f8a73 104 lcd.printString(" Press Start ",0,4);
josh_ohara 8:86cb9a9f8a73 105 lcd.refresh();
josh_ohara 8:86cb9a9f8a73 106
josh_ohara 33:d8284dee58db 107 while(pad.start_pressed() == false) {
josh_ohara 8:86cb9a9f8a73 108 lcd.setContrast( pad.read_pot1());
josh_ohara 8:86cb9a9f8a73 109 pad.leds_on();
josh_ohara 8:86cb9a9f8a73 110 wait(0.1);
josh_ohara 8:86cb9a9f8a73 111 pad.leds_off();
josh_ohara 8:86cb9a9f8a73 112 wait(0.1);
josh_ohara 8:86cb9a9f8a73 113 }
josh_ohara 8:86cb9a9f8a73 114 }
josh_ohara 8:86cb9a9f8a73 115
josh_ohara 8:86cb9a9f8a73 116 void draw_game()
josh_ohara 8:86cb9a9f8a73 117 {
josh_ohara 10:9189419fda68 118 lcd.clear();
josh_ohara 8:86cb9a9f8a73 119 SpaceInvader.render(lcd);
josh_ohara 8:86cb9a9f8a73 120 lcd.refresh();
josh_ohara 8:86cb9a9f8a73 121 }
josh_ohara 8:86cb9a9f8a73 122
josh_ohara 22:3e978b1d7958 123 void hardware_init()
josh_ohara 8:86cb9a9f8a73 124 {
josh_ohara 8:86cb9a9f8a73 125 lcd.init();
josh_ohara 8:86cb9a9f8a73 126 pad.init();
josh_ohara 21:970807533b10 127 }
josh_ohara 22:3e978b1d7958 128 void game_init()
josh_ohara 21:970807533b10 129 {
josh_ohara 34:853f0cf0ce03 130 SpaceInvader.init(SHIP_HEIGHT,SHIP_WIDTH,ALIEN_SIZE,_number_of_aliens,COLUMN_SIZE,ROW_SIZE,COVER_Y,COVER1_X,COVER2_X,COVER3_X,ROCK_NUMBER,_level);
josh_ohara 8:86cb9a9f8a73 131 }
josh_ohara 8:86cb9a9f8a73 132
josh_ohara 33:d8284dee58db 133 void game_over(int level)
josh_ohara 33:d8284dee58db 134 {
josh_ohara 22:3e978b1d7958 135 lcd.clear();
josh_ohara 22:3e978b1d7958 136 while(1){
josh_ohara 22:3e978b1d7958 137 lcd.printString(" Game Over",0,0);
josh_ohara 33:d8284dee58db 138 char buffer_[14];
josh_ohara 33:d8284dee58db 139 sprintf(buffer_," Level %2d",level);
josh_ohara 33:d8284dee58db 140 lcd.printString(buffer_,0,2);
josh_ohara 22:3e978b1d7958 141 lcd.printString(" Press reset ",0,4);
josh_ohara 22:3e978b1d7958 142 lcd.refresh();
josh_ohara 22:3e978b1d7958 143 }
josh_ohara 22:3e978b1d7958 144 }
josh_ohara 22:3e978b1d7958 145
josh_ohara 33:d8284dee58db 146 void next_level(int level)
josh_ohara 33:d8284dee58db 147 {
josh_ohara 22:3e978b1d7958 148 lcd.clear();
josh_ohara 33:d8284dee58db 149 char buffer_[14];
josh_ohara 33:d8284dee58db 150 sprintf(buffer_," Level %2d",level);
josh_ohara 33:d8284dee58db 151 lcd.printString(buffer_,0,2);
josh_ohara 22:3e978b1d7958 152 lcd.refresh();
josh_ohara 22:3e978b1d7958 153 wait(2);
josh_ohara 22:3e978b1d7958 154 lcd.clear();
josh_ohara 22:3e978b1d7958 155 }
josh_ohara 24:ff5af5a013b5 156
josh_ohara 33:d8284dee58db 157 void select_difficulty()
josh_ohara 33:d8284dee58db 158 {
josh_ohara 33:d8284dee58db 159 _difficulty = 1;
josh_ohara 33:d8284dee58db 160 bool select_ = false;
josh_ohara 33:d8284dee58db 161 while(select_ == false){
josh_ohara 24:ff5af5a013b5 162 lcd.clear();
josh_ohara 24:ff5af5a013b5 163 lcd.printString(" Easy",0,0);
josh_ohara 24:ff5af5a013b5 164 lcd.printString(" Medium",0,2);
josh_ohara 24:ff5af5a013b5 165 lcd.printString(" Hard",0,4);
josh_ohara 33:d8284dee58db 166 if(_difficulty == 1){
josh_ohara 24:ff5af5a013b5 167 lcd.drawRect(0,0,3,3,FILL_BLACK);
josh_ohara 24:ff5af5a013b5 168 }
josh_ohara 33:d8284dee58db 169 if(_difficulty == 2){
josh_ohara 24:ff5af5a013b5 170 lcd.drawRect(0,20,3,3,FILL_BLACK);
josh_ohara 24:ff5af5a013b5 171 }
josh_ohara 33:d8284dee58db 172 if(_difficulty == 3){
josh_ohara 24:ff5af5a013b5 173 lcd.drawRect(0,40,3,3,FILL_BLACK);
josh_ohara 24:ff5af5a013b5 174 }
josh_ohara 24:ff5af5a013b5 175 lcd.refresh();
josh_ohara 24:ff5af5a013b5 176 wait(1);
josh_ohara 24:ff5af5a013b5 177
josh_ohara 24:ff5af5a013b5 178 while(1){
josh_ohara 24:ff5af5a013b5 179 direction = pad.get_direction();
josh_ohara 24:ff5af5a013b5 180 if(pad.A_pressed()==true){
josh_ohara 33:d8284dee58db 181 select_ = true;
josh_ohara 24:ff5af5a013b5 182 break;
josh_ohara 24:ff5af5a013b5 183 }
josh_ohara 33:d8284dee58db 184 if((_difficulty==1)&&
josh_ohara 24:ff5af5a013b5 185 (direction==N)){
josh_ohara 33:d8284dee58db 186 _difficulty = 3;
josh_ohara 24:ff5af5a013b5 187 break;
josh_ohara 24:ff5af5a013b5 188 }
josh_ohara 33:d8284dee58db 189 if((_difficulty==1)&&
josh_ohara 24:ff5af5a013b5 190 (direction==S)){
josh_ohara 33:d8284dee58db 191 _difficulty = 2;
josh_ohara 24:ff5af5a013b5 192 break;
josh_ohara 24:ff5af5a013b5 193 }
josh_ohara 33:d8284dee58db 194 if((_difficulty==2)&&
josh_ohara 24:ff5af5a013b5 195 (direction==N)){
josh_ohara 33:d8284dee58db 196 _difficulty = 1;
josh_ohara 24:ff5af5a013b5 197 break;
josh_ohara 24:ff5af5a013b5 198 }
josh_ohara 33:d8284dee58db 199 if((_difficulty==2)&&
josh_ohara 24:ff5af5a013b5 200 (direction==S)){
josh_ohara 33:d8284dee58db 201 _difficulty = 3;
josh_ohara 24:ff5af5a013b5 202 break;
josh_ohara 24:ff5af5a013b5 203 }
josh_ohara 33:d8284dee58db 204 if((_difficulty==3)&&
josh_ohara 24:ff5af5a013b5 205 (direction==N)){
josh_ohara 33:d8284dee58db 206 _difficulty = 2;
josh_ohara 24:ff5af5a013b5 207 break;
josh_ohara 24:ff5af5a013b5 208 }
josh_ohara 33:d8284dee58db 209 if((_difficulty==3)&&
josh_ohara 24:ff5af5a013b5 210 (direction==S)){
josh_ohara 33:d8284dee58db 211 _difficulty = 1;
josh_ohara 24:ff5af5a013b5 212 break;
josh_ohara 24:ff5af5a013b5 213 }
josh_ohara 24:ff5af5a013b5 214 }
josh_ohara 24:ff5af5a013b5 215 //printf(" difficulty %2d",direction);
josh_ohara 24:ff5af5a013b5 216 }
josh_ohara 24:ff5af5a013b5 217 }
josh_ohara 24:ff5af5a013b5 218
josh_ohara 24:ff5af5a013b5 219