
Joshua O'hara 201291390
Dependencies: mbed
main.cpp@35:517b56b010df, 2020-05-18 (annotated)
- 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?
User | Revision | Line number | New 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 |