Space Invaders - Embedded Systems Project 15/16 - Avinash Patel 200860407

Dependencies:   Joystick N5110 SDFileSystem mbed

Committer:
avi23
Date:
Thu Mar 31 16:03:26 2016 +0000
Revision:
4:a99953ef9e42
Parent:
3:544b59d60ab8
Child:
5:34855f712350
Before 3 state invader condition

Who changed what in which revision?

UserRevisionLine numberNew contents of line
avi23 1:b300d052d549 1 /*
avi23 1:b300d052d549 2 Space Invaders - Avinash Patel 200860407
avi23 1:b300d052d549 3
avi23 1:b300d052d549 4 Week 19 - Set up joystick class
avi23 1:b300d052d549 5 Week 20 - Changed to space invaders as constrained too much by screen resolution
avi23 1:b300d052d549 6 - Core cannon is drawn and can move, enemies are visible and they switch between states every second
avi23 2:d34c95990605 7 Week 21 - Begun to set up barriers
avi23 1:b300d052d549 8 */
avi23 0:427469992efe 9 #include "mbed.h"
avi23 0:427469992efe 10 #include "N5110.h"
avi23 0:427469992efe 11
avi23 2:d34c95990605 12 //Direction invaders are travelling
avi23 2:d34c95990605 13 #define LEFT 0
avi23 2:d34c95990605 14 #define RIGHT 1
avi23 2:d34c95990605 15
avi23 2:d34c95990605 16 //Preprocessor for screen map
avi23 4:a99953ef9e42 17 /*
avi23 0:427469992efe 18 #define EMPTY 0
avi23 2:d34c95990605 19 #define CANNON 1
avi23 2:d34c95990605 20 #define SMALL 2
avi23 2:d34c95990605 21 #define MEDIUM 3
avi23 2:d34c95990605 22 #define LARGE 4
avi23 2:d34c95990605 23 #define BARRIER 5
avi23 2:d34c95990605 24 #define UFO 6
avi23 2:d34c95990605 25 #define CANNON_SHOT 7
avi23 4:a99953ef9e42 26 */
avi23 0:427469992efe 27
avi23 0:427469992efe 28 //Joystick Class
avi23 0:427469992efe 29 class Joystick
avi23 0:427469992efe 30 {
avi23 0:427469992efe 31 public:
avi23 0:427469992efe 32 Joystick(PinName x_axis_pin, PinName y_axis_pin, PinName button_pin) {
avi23 0:427469992efe 33 //Dynamically allocates the pins
avi23 0:427469992efe 34 x_axis_ = new AnalogIn(x_axis_pin);
avi23 0:427469992efe 35 y_axis_ = new AnalogIn(y_axis_pin);
avi23 0:427469992efe 36 button_ = new InterruptIn(button_pin);
avi23 0:427469992efe 37 }
avi23 0:427469992efe 38
avi23 0:427469992efe 39 //Initalises the Joystick
avi23 0:427469992efe 40 //Sets up the ISRs and grabs the offsets for each axis
avi23 0:427469992efe 41 void init() {
avi23 0:427469992efe 42 //Sets up the button ISR
avi23 0:427469992efe 43 button_->mode(PullUp);
avi23 0:427469992efe 44 button_->fall(this, &Joystick::button_isr);
avi23 0:427469992efe 45
avi23 0:427469992efe 46 //Initalises the vairables and flags
avi23 0:427469992efe 47 x_offset_ = 0;
avi23 0:427469992efe 48 y_offset_ = 0;
avi23 0:427469992efe 49 g_button_flag_ = 0;
avi23 0:427469992efe 50
avi23 0:427469992efe 51 //Samples the joystick 5 times and takes an average to get the offset
avi23 0:427469992efe 52 float x_sum = 0;
avi23 0:427469992efe 53 float y_sum = 0;
avi23 0:427469992efe 54
avi23 0:427469992efe 55 for (int i = 0; i < 5; i++) {
avi23 0:427469992efe 56 x_sum += x_axis_->read();
avi23 0:427469992efe 57 y_sum += y_axis_->read();
avi23 0:427469992efe 58 }
avi23 0:427469992efe 59
avi23 0:427469992efe 60 x_offset_ = 0.5f - x_sum/5.0f;
avi23 0:427469992efe 61 y_offset_ = 0.5f - y_sum/5.0f;
avi23 0:427469992efe 62 }
avi23 0:427469992efe 63
avi23 0:427469992efe 64 //Take 5 readings and returns the average measurement, accounting for joystick offset x and y values
avi23 0:427469992efe 65 float GetXValue() {
avi23 0:427469992efe 66
avi23 0:427469992efe 67 float x_sum = 0;
avi23 0:427469992efe 68
avi23 0:427469992efe 69 for (int i = 0; i < 5; i++) {
avi23 0:427469992efe 70 x_sum += x_axis_->read();
avi23 0:427469992efe 71 }
avi23 0:427469992efe 72
avi23 0:427469992efe 73 float x_value = x_sum/5.0f + x_offset_;
avi23 0:427469992efe 74
avi23 0:427469992efe 75 //Caps the value for the POT between 0 and 1
avi23 0:427469992efe 76 if (x_value < 0.0f) {
avi23 0:427469992efe 77 return 0;
avi23 0:427469992efe 78 } else if (x_value > 1.0f) {
avi23 0:427469992efe 79 return 1;
avi23 0:427469992efe 80 } else {
avi23 0:427469992efe 81 return x_value;
avi23 0:427469992efe 82 }
avi23 0:427469992efe 83 }
avi23 0:427469992efe 84
avi23 0:427469992efe 85 float GetYValue() {
avi23 0:427469992efe 86
avi23 0:427469992efe 87 float y_sum = 0;
avi23 0:427469992efe 88
avi23 0:427469992efe 89 for (int i = 0; i < 5; i++) {
avi23 0:427469992efe 90 y_sum += y_axis_->read();
avi23 0:427469992efe 91 }
avi23 0:427469992efe 92
avi23 0:427469992efe 93 float y_value = y_sum/5.0f + y_offset_;
avi23 0:427469992efe 94
avi23 0:427469992efe 95 //Caps the value for the POT between 0 and 1
avi23 0:427469992efe 96 if (y_value < 0.0f) {
avi23 0:427469992efe 97 return 0;
avi23 0:427469992efe 98 } else if (y_value > 1.0f) {
avi23 0:427469992efe 99 return 1;
avi23 0:427469992efe 100 } else {
avi23 0:427469992efe 101 return y_value;
avi23 0:427469992efe 102 }
avi23 0:427469992efe 103 }
avi23 0:427469992efe 104
avi23 0:427469992efe 105 //Getter and setters for flags
avi23 0:427469992efe 106 int get_button_flag() {
avi23 0:427469992efe 107 return g_button_flag_;
avi23 0:427469992efe 108 }
avi23 0:427469992efe 109
avi23 0:427469992efe 110 void set_button_flag(int value) {
avi23 0:427469992efe 111 g_button_flag_ = value;
avi23 0:427469992efe 112 }
avi23 0:427469992efe 113
avi23 0:427469992efe 114 private:
avi23 0:427469992efe 115 //Button ISR Method
avi23 0:427469992efe 116 void button_isr() {
avi23 0:427469992efe 117 g_button_flag_ = 1;
avi23 0:427469992efe 118 }
avi23 0:427469992efe 119
avi23 0:427469992efe 120 private:
avi23 0:427469992efe 121 //Pin inputs
avi23 0:427469992efe 122 AnalogIn* x_axis_;
avi23 0:427469992efe 123 AnalogIn* y_axis_;
avi23 0:427469992efe 124 InterruptIn* button_;
avi23 0:427469992efe 125
avi23 0:427469992efe 126 //Stores X and Y offsets
avi23 0:427469992efe 127 float x_offset_;
avi23 0:427469992efe 128 float y_offset_;
avi23 0:427469992efe 129
avi23 0:427469992efe 130 //Stores interrupt flags
avi23 0:427469992efe 131 volatile int g_button_flag_;
avi23 0:427469992efe 132 };
avi23 0:427469992efe 133
avi23 0:427469992efe 134 // K64F on-board LEDs
avi23 0:427469992efe 135 DigitalOut r_led(LED_RED);
avi23 0:427469992efe 136 DigitalOut g_led(LED_GREEN);
avi23 0:427469992efe 137 DigitalOut b_led(LED_BLUE);
avi23 0:427469992efe 138
avi23 0:427469992efe 139 // K64F on-board switches
avi23 0:427469992efe 140 InterruptIn sw2(SW2);
avi23 0:427469992efe 141 InterruptIn sw3(SW3);
avi23 0:427469992efe 142
avi23 0:427469992efe 143 // UART connection for PC
avi23 0:427469992efe 144 Serial pc(USBTX,USBRX);
avi23 0:427469992efe 145
avi23 0:427469992efe 146 //Joystick
avi23 2:d34c95990605 147 Joystick joystick(PTB2, PTB3, PTB11);
avi23 2:d34c95990605 148
avi23 2:d34c95990605 149 //Shoot button
avi23 2:d34c95990605 150 InterruptIn shoot_button(PTB18);
avi23 0:427469992efe 151
avi23 0:427469992efe 152 //LCD object
avi23 0:427469992efe 153 // VCC, SCE, RST, D/C, MOSI, SCLK, LED
avi23 0:427469992efe 154 N5110 lcd (PTE26 , PTA0 , PTC4 , PTD0 , PTD2 , PTD1 , PTC3);
avi23 2:d34c95990605 155 Ticker update_screen;
avi23 2:d34c95990605 156
avi23 2:d34c95990605 157 //Map holding pixel data of screen
avi23 4:a99953ef9e42 158 int screen_map[84][48];
avi23 4:a99953ef9e42 159 const int empty_pixel = 0;
avi23 4:a99953ef9e42 160 const int cannon_pixel = 1;
avi23 4:a99953ef9e42 161 const int first_barrier_pixel = 2;
avi23 4:a99953ef9e42 162 const int first_large_invader_pixel = 5;
avi23 4:a99953ef9e42 163 const int first_medium_invader_pixel = 10;
avi23 4:a99953ef9e42 164 const int first_small_invader_pixel = 15;
avi23 4:a99953ef9e42 165 const int ufo_pixel = 20;
avi23 4:a99953ef9e42 166 const int cannon_shot_pixel = 21;
avi23 0:427469992efe 167
avi23 0:427469992efe 168 //Ship bit-map and location
avi23 1:b300d052d549 169 int cannon_xpos = 24;
avi23 1:b300d052d549 170 const int cannon_ypos = 43;
avi23 1:b300d052d549 171 Ticker move_cannon;
avi23 1:b300d052d549 172 const bool cannon_bitmap[5][9] = {
avi23 0:427469992efe 173 {0, 0, 0, 0, 1, 0, 0, 0, 0},
avi23 0:427469992efe 174 {0, 0, 0, 1, 1, 1, 0, 0, 0},
avi23 0:427469992efe 175 {0, 1, 1, 1, 1, 1, 1, 1, 0},
avi23 0:427469992efe 176 {1, 1, 1, 1, 1, 1, 1, 1, 1},
avi23 0:427469992efe 177 {1, 1, 1, 1, 1, 1, 1, 1, 1}
avi23 0:427469992efe 178 };
avi23 0:427469992efe 179
avi23 2:d34c95990605 180 Ticker move_cannon_shot;
avi23 2:d34c95990605 181 bool cannon_shot_on_screen = false;
avi23 2:d34c95990605 182 int cannon_shot_x_pos = 28;
avi23 2:d34c95990605 183 int cannon_shot_y_pos = 40;
avi23 2:d34c95990605 184 bool game_over = false;
avi23 2:d34c95990605 185
avi23 0:427469992efe 186 //Enemies
avi23 0:427469992efe 187 Ticker move_enemies;
avi23 2:d34c95990605 188 bool invaders_in_state2 = true;
avi23 2:d34c95990605 189 bool invader_direction = RIGHT;
avi23 1:b300d052d549 190 //Struct to store enemy data
avi23 2:d34c95990605 191 struct Invaders {
avi23 0:427469992efe 192 int x_pos;
avi23 0:427469992efe 193 int y_pos;
avi23 0:427469992efe 194 bool is_alive;
avi23 2:d34c95990605 195 } small_invader[5], medium_invader[5], large_invader[5];
avi23 2:d34c95990605 196 int right_column_alive = 4;
avi23 2:d34c95990605 197 int left_column_alive = 0;
avi23 2:d34c95990605 198 enum LowestInvaderRow {small, medium, large};
avi23 2:d34c95990605 199 LowestInvaderRow lowest_invader_row_alive = large;
avi23 2:d34c95990605 200 //Limits the first invader can travel
avi23 2:d34c95990605 201 int minimum_invader_x_pos = 0;
avi23 2:d34c95990605 202 int maximum_invader_x_pos = 20;
avi23 1:b300d052d549 203 //Bitmaps for small invaders
avi23 0:427469992efe 204 const bool small_invader_bitmap_1[6][8] = {
avi23 0:427469992efe 205 {0, 0, 0, 1, 1, 0, 0, 0},
avi23 0:427469992efe 206 {0, 1, 1, 1, 1, 1, 1, 0},
avi23 0:427469992efe 207 {1, 1, 0, 1, 1, 0, 1, 1},
avi23 0:427469992efe 208 {1, 1, 1, 1, 1, 1, 1, 1},
avi23 0:427469992efe 209 {0, 1, 0, 1, 1, 0, 1, 0},
avi23 0:427469992efe 210 {1, 0, 1, 0, 0, 1, 0, 1}
avi23 0:427469992efe 211 };
avi23 0:427469992efe 212
avi23 0:427469992efe 213 const bool small_invader_bitmap_2[6][8] = {
avi23 0:427469992efe 214 {0, 0, 0, 1, 1, 0, 0, 0},
avi23 0:427469992efe 215 {0, 1, 1, 1, 1, 1, 1, 0},
avi23 0:427469992efe 216 {1, 1, 0, 1, 1, 0, 1, 1},
avi23 0:427469992efe 217 {1, 1, 1, 1, 1, 1, 1, 1},
avi23 0:427469992efe 218 {1, 0, 0, 0, 0, 0, 0, 1},
avi23 0:427469992efe 219 {0, 1, 0, 0, 0, 0, 1, 0}
avi23 0:427469992efe 220 };
avi23 1:b300d052d549 221 //Bitmaps for medium invaders
avi23 1:b300d052d549 222 const bool medium_invader_bitmap_1[6][10] = {
avi23 1:b300d052d549 223 {1, 0, 0, 1, 0, 0, 1, 0, 0, 1},
avi23 1:b300d052d549 224 {1, 0, 1, 1, 1, 1, 1, 1, 0, 1},
avi23 1:b300d052d549 225 {1, 1, 1, 0, 1, 1, 0, 1, 1, 1},
avi23 1:b300d052d549 226 {0, 1, 1, 1, 1, 1, 1, 1, 1, 0},
avi23 1:b300d052d549 227 {0, 0, 1, 0, 0, 0, 0, 1, 0, 0},
avi23 1:b300d052d549 228 {0, 1, 0, 0, 0, 0, 0, 0, 1, 0}
avi23 1:b300d052d549 229 };
avi23 1:b300d052d549 230
avi23 1:b300d052d549 231 const bool medium_invader_bitmap_2[6][10] = {
avi23 1:b300d052d549 232 {0, 0, 0, 1, 0, 0, 1, 0, 0, 0},
avi23 1:b300d052d549 233 {0, 0, 1, 1, 1, 1, 1, 1, 0, 0},
avi23 1:b300d052d549 234 {0, 1, 1, 0, 1, 1, 0, 1, 1, 0},
avi23 1:b300d052d549 235 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
avi23 1:b300d052d549 236 {1, 0, 1, 0, 0, 0, 0, 1, 0, 1},
avi23 1:b300d052d549 237 {0, 0, 0, 1, 1, 1, 1, 0, 0, 0}
avi23 1:b300d052d549 238 };
avi23 1:b300d052d549 239 //Bitmaps for large invaders
avi23 1:b300d052d549 240 const bool large_invader_bitmap_1[6][12] = {
avi23 2:d34c95990605 241 {0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0},
avi23 1:b300d052d549 242 {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},
avi23 1:b300d052d549 243 {1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1},
avi23 1:b300d052d549 244 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
avi23 1:b300d052d549 245 {0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0},
avi23 1:b300d052d549 246 {0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0}
avi23 1:b300d052d549 247 };
avi23 1:b300d052d549 248
avi23 1:b300d052d549 249 const bool large_invader_bitmap_2[6][12] = {
avi23 2:d34c95990605 250 {0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0},
avi23 1:b300d052d549 251 {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},
avi23 1:b300d052d549 252 {1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1},
avi23 1:b300d052d549 253 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
avi23 1:b300d052d549 254 {0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0},
avi23 1:b300d052d549 255 {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1}
avi23 1:b300d052d549 256 };
avi23 1:b300d052d549 257
avi23 2:d34c95990605 258 //Barriers
avi23 2:d34c95990605 259 struct Barriers {
avi23 2:d34c95990605 260 int x_pos;
avi23 2:d34c95990605 261 int y_pos;
avi23 2:d34c95990605 262 bool before_bitmap[8][14];
avi23 2:d34c95990605 263 bool after_bitmap[8][14];
avi23 2:d34c95990605 264 } barrier[3];
avi23 2:d34c95990605 265 int no_of_barriers = 3;
avi23 2:d34c95990605 266 const bool barrier_bitmap[8][14] = {
avi23 2:d34c95990605 267 {0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0},
avi23 2:d34c95990605 268 {0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0},
avi23 2:d34c95990605 269 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
avi23 2:d34c95990605 270 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
avi23 2:d34c95990605 271 {1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1},
avi23 2:d34c95990605 272 {1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1},
avi23 2:d34c95990605 273 {1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1},
avi23 2:d34c95990605 274 {1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1}
avi23 2:d34c95990605 275 };
avi23 2:d34c95990605 276
avi23 2:d34c95990605 277 //TEST FOR SPEC UFO
avi23 2:d34c95990605 278 const bool ufo_bitmap[5][14] = {
avi23 2:d34c95990605 279 {0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0},
avi23 2:d34c95990605 280 {0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0},
avi23 2:d34c95990605 281 {0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0},
avi23 2:d34c95990605 282 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
avi23 2:d34c95990605 283 {0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0}
avi23 2:d34c95990605 284 };
avi23 2:d34c95990605 285
avi23 2:d34c95990605 286 int row_no = 5;
avi23 2:d34c95990605 287 int col_no = 14;
avi23 0:427469992efe 288
avi23 0:427469992efe 289 //ISR Flags
avi23 2:d34c95990605 290 volatile bool g_update_screen_flag = true;
avi23 2:d34c95990605 291 volatile bool g_move_cannon_flag = true;
avi23 2:d34c95990605 292 volatile bool g_shoot_pressed_flag = false;
avi23 2:d34c95990605 293 volatile bool g_move_cannon_shot_flag = false;
avi23 0:427469992efe 294 volatile bool g_move_enemies_flag = true;
avi23 0:427469992efe 295
avi23 0:427469992efe 296 // function prototypes
avi23 0:427469992efe 297 // error function hangs flashing an LED
avi23 0:427469992efe 298 void error();
avi23 0:427469992efe 299 // setup serial port
avi23 0:427469992efe 300 void init_serial();
avi23 0:427469992efe 301 // set-up the on-board LEDs and switches
avi23 0:427469992efe 302 void init_K64F();
avi23 2:d34c95990605 303 //Init shoot button
avi23 2:d34c95990605 304 void init_shoot();
avi23 0:427469992efe 305 // Added functions
avi23 2:d34c95990605 306 void MoveCannon();
avi23 0:427469992efe 307 void InitSmallInvaders();
avi23 2:d34c95990605 308 void ClearSmallInvaders();
avi23 0:427469992efe 309 void DrawSmallInvaders();
avi23 2:d34c95990605 310 void ClearMediumInvaders();
avi23 1:b300d052d549 311 void InitMediumInvaders();
avi23 1:b300d052d549 312 void DrawMediumInvaders();
avi23 1:b300d052d549 313 void InitLargeInvaders();
avi23 2:d34c95990605 314 void CLearLargeInvaders();
avi23 1:b300d052d549 315 void DrawLargeInvaders();
avi23 2:d34c95990605 316 void InitBarriers();
avi23 2:d34c95990605 317 void DrawBarriers();
avi23 2:d34c95990605 318 void ShiftInvaderXPositions();
avi23 2:d34c95990605 319 void ShiftInvaderYPositions(bool new_direction);
avi23 2:d34c95990605 320 //void InitUFO();
avi23 2:d34c95990605 321 void DrawUFO();
avi23 2:d34c95990605 322 //void DrawEnemies(struct Invaders invader[], int no_of_invaders);
avi23 2:d34c95990605 323
avi23 0:427469992efe 324 //ISR's
avi23 2:d34c95990605 325 void update_screen_isr();
avi23 2:d34c95990605 326 void move_cannon_isr();
avi23 0:427469992efe 327 void move_enemies_isr();
avi23 2:d34c95990605 328 void shoot_pressed_isr();
avi23 2:d34c95990605 329 void move_cannon_shot_isr();
avi23 0:427469992efe 330
avi23 2:d34c95990605 331 int down_count = 0;
avi23 0:427469992efe 332
avi23 0:427469992efe 333 int main()
avi23 0:427469992efe 334 {
avi23 0:427469992efe 335 //Initalises the board and perhiperals
avi23 0:427469992efe 336 init_K64F();
avi23 0:427469992efe 337 init_serial();
avi23 2:d34c95990605 338 init_shoot();
avi23 0:427469992efe 339 lcd.init();
avi23 0:427469992efe 340 lcd.clear();
avi23 0:427469992efe 341
avi23 2:d34c95990605 342 update_screen.attach(&update_screen_isr, 0.05);
avi23 2:d34c95990605 343 move_cannon.attach(&move_cannon_isr, 0.05);
avi23 4:a99953ef9e42 344 move_enemies.attach(&move_enemies_isr, 0.5);
avi23 0:427469992efe 345
avi23 0:427469992efe 346 InitSmallInvaders();
avi23 1:b300d052d549 347 InitMediumInvaders();
avi23 1:b300d052d549 348 InitLargeInvaders();
avi23 2:d34c95990605 349 InitBarriers();
avi23 1:b300d052d549 350
avi23 2:d34c95990605 351 lcd.refresh();
avi23 2:d34c95990605 352
avi23 2:d34c95990605 353 while (true) {
avi23 2:d34c95990605 354 //IF the game is over detach all the tickers
avi23 2:d34c95990605 355 if (game_over) {
avi23 2:d34c95990605 356 move_cannon.detach();
avi23 2:d34c95990605 357 move_enemies.detach();
avi23 1:b300d052d549 358
avi23 2:d34c95990605 359 lcd.clear();
avi23 2:d34c95990605 360 lcd.printString("Game Over", 1, 2);
avi23 2:d34c95990605 361 } else {
avi23 2:d34c95990605 362 //Updates pixels on the screen
avi23 2:d34c95990605 363 if (g_update_screen_flag) {
avi23 2:d34c95990605 364 g_update_screen_flag = false;
avi23 2:d34c95990605 365
avi23 2:d34c95990605 366 //Loops through the screen map and sets pixels on the LCD
avi23 2:d34c95990605 367 for (int col = 0; col < 84; col++) {
avi23 2:d34c95990605 368 for (int row = 0; row < 48; row++) {
avi23 2:d34c95990605 369 if (screen_map[col][row]) {
avi23 2:d34c95990605 370 lcd.setPixel(col, row);
avi23 2:d34c95990605 371 } else {
avi23 2:d34c95990605 372 lcd.clearPixel(col, row);
avi23 2:d34c95990605 373 }
avi23 1:b300d052d549 374 }
avi23 1:b300d052d549 375 }
avi23 1:b300d052d549 376 }
avi23 2:d34c95990605 377 //Controls cannon movement
avi23 2:d34c95990605 378 if (g_move_cannon_flag) {
avi23 2:d34c95990605 379 g_move_cannon_flag = false;
avi23 2:d34c95990605 380
avi23 2:d34c95990605 381 MoveCannon();
avi23 2:d34c95990605 382 DrawBarriers();
avi23 2:d34c95990605 383
avi23 2:d34c95990605 384 lcd.refresh();
avi23 2:d34c95990605 385 }
avi23 2:d34c95990605 386 //Spawns a player bullet if the shoot button is pressed and there isn't a bullet on the screen
avi23 2:d34c95990605 387 if (g_shoot_pressed_flag) {
avi23 2:d34c95990605 388 g_shoot_pressed_flag = false;
avi23 2:d34c95990605 389
avi23 3:544b59d60ab8 390 if (!cannon_shot_on_screen) {
avi23 3:544b59d60ab8 391 cannon_shot_on_screen = true;
avi23 3:544b59d60ab8 392
avi23 3:544b59d60ab8 393 pc.printf("Shot Fired\n");
avi23 2:d34c95990605 394
avi23 3:544b59d60ab8 395 //Add 4 to cannon x_pos to get shot x_pos
avi23 3:544b59d60ab8 396 cannon_shot_x_pos = cannon_xpos + 4;
avi23 3:544b59d60ab8 397 cannon_shot_y_pos = 40;
avi23 4:a99953ef9e42 398 move_cannon_shot.attach(&move_cannon_shot_isr, 0.05);
avi23 3:544b59d60ab8 399 }
avi23 2:d34c95990605 400 }
avi23 2:d34c95990605 401 //Move the cannon's shot
avi23 2:d34c95990605 402 if (g_move_cannon_shot_flag) {
avi23 2:d34c95990605 403 g_move_cannon_shot_flag = false;
avi23 2:d34c95990605 404
avi23 2:d34c95990605 405 //Checks bullet will not go beyond the bounds of the screen map
avi23 2:d34c95990605 406 if (cannon_shot_y_pos > -1) {
avi23 3:544b59d60ab8 407 //Loops throught the shot bitmap and clears the pixels in the screen map
avi23 2:d34c95990605 408 for (int row = 0; row < 3; row++) {
avi23 2:d34c95990605 409 //Clears the position where the bullet was
avi23 4:a99953ef9e42 410 screen_map[cannon_shot_x_pos][cannon_shot_y_pos + row] = empty_pixel;
avi23 2:d34c95990605 411 }
avi23 2:d34c95990605 412
avi23 2:d34c95990605 413 //Increments the shot going up the screen
avi23 2:d34c95990605 414 cannon_shot_y_pos--;
avi23 2:d34c95990605 415
avi23 3:544b59d60ab8 416 //Checks to see what the shot hits. If it hits nothing the shot gets pushed to the screen map
avi23 2:d34c95990605 417 for (int row = 0; row < 3; row++) {
avi23 4:a99953ef9e42 418 int object_no;
avi23 4:a99953ef9e42 419 if (screen_map[cannon_shot_x_pos][cannon_shot_y_pos + row] >= first_small_invader_pixel && screen_map[cannon_shot_x_pos][cannon_shot_y_pos + row] < (first_small_invader_pixel + 5))
avi23 3:544b59d60ab8 420 {
avi23 4:a99953ef9e42 421 object_no = screen_map[cannon_shot_x_pos][cannon_shot_y_pos + row] - first_small_invader_pixel;
avi23 4:a99953ef9e42 422 small_invader[object_no].is_alive = false;
avi23 4:a99953ef9e42 423 pc.printf("Small (%d) Hit\n", object_no);
avi23 3:544b59d60ab8 424 cannon_shot_on_screen = false;
avi23 3:544b59d60ab8 425 move_cannon_shot.detach();
avi23 3:544b59d60ab8 426 break;
avi23 4:a99953ef9e42 427 } else if (screen_map[cannon_shot_x_pos][cannon_shot_y_pos + row] >= first_medium_invader_pixel && screen_map[cannon_shot_x_pos][cannon_shot_y_pos + row] < (first_medium_invader_pixel + 5)) {
avi23 4:a99953ef9e42 428 object_no = screen_map[cannon_shot_x_pos][cannon_shot_y_pos + row] - first_medium_invader_pixel;
avi23 4:a99953ef9e42 429 medium_invader[object_no].is_alive = false;
avi23 4:a99953ef9e42 430 pc.printf("Medium (%d) Hit\n", object_no);
avi23 3:544b59d60ab8 431 cannon_shot_on_screen = false;
avi23 3:544b59d60ab8 432 move_cannon_shot.detach();
avi23 3:544b59d60ab8 433 break;
avi23 4:a99953ef9e42 434 } else if (screen_map[cannon_shot_x_pos][cannon_shot_y_pos + row] >= first_large_invader_pixel && screen_map[cannon_shot_x_pos][cannon_shot_y_pos + row] < (first_large_invader_pixel + 5)) {
avi23 4:a99953ef9e42 435 object_no = screen_map[cannon_shot_x_pos][cannon_shot_y_pos + row] - first_large_invader_pixel;
avi23 4:a99953ef9e42 436 large_invader[object_no].is_alive = false;
avi23 4:a99953ef9e42 437 pc.printf("Large (%d) Hit\n", object_no);
avi23 3:544b59d60ab8 438 cannon_shot_on_screen = false;
avi23 3:544b59d60ab8 439 move_cannon_shot.detach();
avi23 3:544b59d60ab8 440 break;
avi23 4:a99953ef9e42 441 } else if (screen_map[cannon_shot_x_pos][cannon_shot_y_pos + row] >= first_barrier_pixel && screen_map[cannon_shot_x_pos][cannon_shot_y_pos + row] < (first_barrier_pixel + 3)) {
avi23 4:a99953ef9e42 442 object_no = screen_map[cannon_shot_x_pos][cannon_shot_y_pos + row] - first_barrier_pixel;
avi23 4:a99953ef9e42 443 pc.printf("Barrier (%d) Hit\n", object_no);
avi23 4:a99953ef9e42 444 cannon_shot_on_screen = false;
avi23 4:a99953ef9e42 445 move_cannon_shot.detach();
avi23 4:a99953ef9e42 446 break;
avi23 4:a99953ef9e42 447 } else if (screen_map[cannon_shot_x_pos][cannon_shot_y_pos + row] == ufo_pixel) {
avi23 3:544b59d60ab8 448 pc.printf("UFO Hit\n");
avi23 3:544b59d60ab8 449 cannon_shot_on_screen = false;
avi23 3:544b59d60ab8 450 move_cannon_shot.detach();
avi23 3:544b59d60ab8 451 break;
avi23 3:544b59d60ab8 452 } else {
avi23 4:a99953ef9e42 453 screen_map[cannon_shot_x_pos][cannon_shot_y_pos + row] = cannon_shot_pixel;
avi23 2:d34c95990605 454 }
avi23 3:544b59d60ab8 455 }
avi23 3:544b59d60ab8 456 } else {
avi23 3:544b59d60ab8 457 //Loops throught the shot bitmap and clears the pixels in the screen map
avi23 3:544b59d60ab8 458 for (int row = 1; row < 3; row++) {
avi23 3:544b59d60ab8 459 //Clears the position where the bullet was
avi23 4:a99953ef9e42 460 screen_map[cannon_shot_x_pos][cannon_shot_y_pos + row] = empty_pixel;
avi23 1:b300d052d549 461 }
avi23 3:544b59d60ab8 462 cannon_shot_on_screen = false;
avi23 1:b300d052d549 463 }
avi23 1:b300d052d549 464 }
avi23 1:b300d052d549 465 }
avi23 2:d34c95990605 466 //Controls enemy movement
avi23 0:427469992efe 467 if (g_move_enemies_flag) {
avi23 0:427469992efe 468 g_move_enemies_flag = false;
avi23 0:427469992efe 469
avi23 2:d34c95990605 470 //Added stuff to move to function
avi23 2:d34c95990605 471 //Checks which columns of invaders are alive on the right and left sides and changes the limits of the first invader
avi23 2:d34c95990605 472 //MOVE TO COLLISION DETECTION WHEN IT'S DONE
avi23 2:d34c95990605 473 //Checking the left side
avi23 2:d34c95990605 474 for (int i = 0; i < 5; i++) {
avi23 2:d34c95990605 475 if (small_invader[i].is_alive || medium_invader[i].is_alive || large_invader[i].is_alive) {
avi23 2:d34c95990605 476 left_column_alive = i;
avi23 2:d34c95990605 477 break;
avi23 2:d34c95990605 478 }
avi23 2:d34c95990605 479 }
avi23 2:d34c95990605 480 minimum_invader_x_pos = 0 - left_column_alive*13;
avi23 2:d34c95990605 481 //Checking the right side
avi23 2:d34c95990605 482 for (int j = 4; j >= 0; j--) {
avi23 2:d34c95990605 483 if (small_invader[j].is_alive || medium_invader[j].is_alive || large_invader[j].is_alive) {
avi23 2:d34c95990605 484 right_column_alive = j;
avi23 2:d34c95990605 485 break;
avi23 2:d34c95990605 486 }
avi23 2:d34c95990605 487 }
avi23 2:d34c95990605 488 maximum_invader_x_pos = 72 - right_column_alive*13;
avi23 2:d34c95990605 489
avi23 2:d34c95990605 490 //End of block
avi23 2:d34c95990605 491
avi23 2:d34c95990605 492 //Clears the old bitmaps
avi23 2:d34c95990605 493 ClearSmallInvaders();
avi23 2:d34c95990605 494 ClearMediumInvaders();
avi23 2:d34c95990605 495 CLearLargeInvaders();
avi23 2:d34c95990605 496
avi23 2:d34c95990605 497 ShiftInvaderXPositions();
avi23 2:d34c95990605 498
avi23 4:a99953ef9e42 499
avi23 0:427469992efe 500 DrawSmallInvaders();
avi23 1:b300d052d549 501 DrawMediumInvaders();
avi23 1:b300d052d549 502 DrawLargeInvaders();
avi23 4:a99953ef9e42 503 //DrawUFO();
avi23 1:b300d052d549 504
avi23 2:d34c95990605 505 invaders_in_state2 = !invaders_in_state2;
avi23 0:427469992efe 506
avi23 0:427469992efe 507 lcd.refresh();
avi23 2:d34c95990605 508
avi23 2:d34c95990605 509 //TEST CODE
avi23 2:d34c95990605 510
avi23 2:d34c95990605 511 //END
avi23 0:427469992efe 512 }
avi23 2:d34c95990605 513
avi23 0:427469992efe 514 sleep();
avi23 0:427469992efe 515 }
avi23 0:427469992efe 516 }
avi23 0:427469992efe 517
avi23 0:427469992efe 518 void init_K64F()
avi23 0:427469992efe 519 {
avi23 0:427469992efe 520 // on-board LEDs are active-low, so set pin high to turn them off.
avi23 0:427469992efe 521 r_led = 1;
avi23 0:427469992efe 522 g_led = 1;
avi23 0:427469992efe 523 b_led = 1;
avi23 0:427469992efe 524
avi23 0:427469992efe 525 // since the on-board switches have external pull-ups, we should disable the internal pull-down
avi23 0:427469992efe 526 // resistors that are enabled by default using InterruptIn
avi23 0:427469992efe 527 sw2.mode(PullNone);
avi23 0:427469992efe 528 sw3.mode(PullNone);
avi23 0:427469992efe 529
avi23 0:427469992efe 530 }
avi23 0:427469992efe 531
avi23 0:427469992efe 532 void error()
avi23 0:427469992efe 533 {
avi23 0:427469992efe 534 while(1) { // if error, hang while flashing error message
avi23 0:427469992efe 535 r_led = 0;
avi23 0:427469992efe 536 wait(0.2);
avi23 0:427469992efe 537 r_led = 1;
avi23 0:427469992efe 538 wait(0.2);
avi23 0:427469992efe 539 }
avi23 0:427469992efe 540 }
avi23 0:427469992efe 541
avi23 0:427469992efe 542 void init_serial()
avi23 0:427469992efe 543 {
avi23 0:427469992efe 544 // set to highest baud - ensure terminal software matches
avi23 0:427469992efe 545 pc.baud(115200);
avi23 0:427469992efe 546 }
avi23 0:427469992efe 547
avi23 2:d34c95990605 548 void init_shoot()
avi23 0:427469992efe 549 {
avi23 2:d34c95990605 550 shoot_button.mode(PullUp);
avi23 2:d34c95990605 551 shoot_button.fall(&shoot_pressed_isr);
avi23 2:d34c95990605 552
avi23 2:d34c95990605 553 }
avi23 2:d34c95990605 554
avi23 2:d34c95990605 555 void update_screen_isr()
avi23 2:d34c95990605 556 {
avi23 2:d34c95990605 557 g_update_screen_flag = true;
avi23 0:427469992efe 558 }
avi23 0:427469992efe 559
avi23 2:d34c95990605 560 void shoot_pressed_isr()
avi23 2:d34c95990605 561 {
avi23 2:d34c95990605 562 g_shoot_pressed_flag = true;
avi23 2:d34c95990605 563 }
avi23 2:d34c95990605 564
avi23 2:d34c95990605 565 void move_cannon_shot_isr()
avi23 2:d34c95990605 566 {
avi23 2:d34c95990605 567 g_move_cannon_shot_flag = true;
avi23 2:d34c95990605 568 }
avi23 2:d34c95990605 569
avi23 2:d34c95990605 570 void move_cannon_isr()
avi23 2:d34c95990605 571 {
avi23 2:d34c95990605 572 g_move_cannon_flag = true;
avi23 2:d34c95990605 573 }
avi23 2:d34c95990605 574
avi23 2:d34c95990605 575 void MoveCannon()
avi23 0:427469992efe 576 {
avi23 0:427469992efe 577 //Clears the ship
avi23 0:427469992efe 578 for (int col = 0; col < 9; col++) {
avi23 0:427469992efe 579 for (int row = 0; row < 5; row++) {
avi23 1:b300d052d549 580 if(cannon_bitmap[row][col]) {
avi23 2:d34c95990605 581 //lcd.clearPixel(cannon_xpos+col, cannon_ypos+row);
avi23 4:a99953ef9e42 582 screen_map[cannon_xpos+col][cannon_ypos+row] = empty_pixel;
avi23 0:427469992efe 583 }
avi23 0:427469992efe 584 }
avi23 0:427469992efe 585 }
avi23 0:427469992efe 586
avi23 0:427469992efe 587 //Changes the position of the ship when the joystick is moved, capping at 0 and 75 so it always fits on the screen
avi23 0:427469992efe 588 if (joystick.GetXValue() < 0.25f) {
avi23 1:b300d052d549 589 cannon_xpos--;
avi23 1:b300d052d549 590 if (cannon_xpos < 0) {
avi23 1:b300d052d549 591 cannon_xpos = 0;
avi23 0:427469992efe 592 }
avi23 0:427469992efe 593 } else if (joystick.GetXValue() > 0.75f) {
avi23 1:b300d052d549 594 cannon_xpos++;
avi23 1:b300d052d549 595 if (cannon_xpos > 75) {
avi23 1:b300d052d549 596 cannon_xpos = 75;
avi23 0:427469992efe 597 }
avi23 0:427469992efe 598 }
avi23 0:427469992efe 599
avi23 0:427469992efe 600 //Redraws the ship
avi23 0:427469992efe 601 for (int col = 0; col < 9; col++) {
avi23 0:427469992efe 602 for (int row = 0; row < 5; row++) {
avi23 1:b300d052d549 603 if(cannon_bitmap[row][col]) {
avi23 2:d34c95990605 604 //lcd.setPixel(cannon_xpos+col, cannon_ypos+row);
avi23 4:a99953ef9e42 605 screen_map[cannon_xpos+col][cannon_ypos+row] = cannon_pixel;
avi23 0:427469992efe 606 }
avi23 0:427469992efe 607 }
avi23 0:427469992efe 608 }
avi23 0:427469992efe 609 }
avi23 0:427469992efe 610
avi23 0:427469992efe 611 void move_enemies_isr()
avi23 0:427469992efe 612 {
avi23 0:427469992efe 613 g_move_enemies_flag = true;
avi23 0:427469992efe 614 }
avi23 0:427469992efe 615
avi23 0:427469992efe 616 //Sets the position and aliveness of the small invaders
avi23 0:427469992efe 617 void InitSmallInvaders()
avi23 0:427469992efe 618 {
avi23 2:d34c95990605 619 for (int i = 0; i < 5; i++) {
avi23 1:b300d052d549 620 small_invader[i].x_pos = 2+ (i*13);
avi23 2:d34c95990605 621 small_invader[i].y_pos = 1;
avi23 0:427469992efe 622 small_invader[i].is_alive = true;
avi23 0:427469992efe 623 }
avi23 0:427469992efe 624 }
avi23 0:427469992efe 625
avi23 2:d34c95990605 626 void ClearSmallInvaders()
avi23 2:d34c95990605 627 {
avi23 2:d34c95990605 628 for (int i = 0; i < 5; i++) {
avi23 2:d34c95990605 629 if (!invaders_in_state2) {
avi23 2:d34c95990605 630 for (int col = 0; col < 8; col++) {
avi23 2:d34c95990605 631 for (int row = 0; row < 6; row++) {
avi23 4:a99953ef9e42 632 if(small_invader_bitmap_1[row][col] && small_invader[i].x_pos + col >= 0 && small_invader[i].x_pos + col < 84) {
avi23 2:d34c95990605 633 //lcd.clearPixel(small_invader[i].x_pos + col, small_invader[i].y_pos + row);
avi23 4:a99953ef9e42 634 screen_map[small_invader[i].x_pos + col][small_invader[i].y_pos + row] = empty_pixel;
avi23 2:d34c95990605 635 }
avi23 2:d34c95990605 636 }
avi23 2:d34c95990605 637 }
avi23 2:d34c95990605 638 } else {
avi23 2:d34c95990605 639 for (int col = 0; col < 8; col++) {
avi23 2:d34c95990605 640 for (int row = 0; row < 6; row++) {
avi23 4:a99953ef9e42 641 if(small_invader_bitmap_2[row][col] && small_invader[i].x_pos + col >= 0 && small_invader[i].x_pos + col < 84) {
avi23 2:d34c95990605 642 //lcd.clearPixel(small_invader[i].x_pos + col, small_invader[i].y_pos + row);
avi23 4:a99953ef9e42 643 screen_map[small_invader[i].x_pos + col][small_invader[i].y_pos + row] = empty_pixel;
avi23 2:d34c95990605 644 }
avi23 2:d34c95990605 645 }
avi23 2:d34c95990605 646 }
avi23 2:d34c95990605 647 }
avi23 2:d34c95990605 648 }
avi23 2:d34c95990605 649 }
avi23 2:d34c95990605 650
avi23 0:427469992efe 651 void DrawSmallInvaders()
avi23 0:427469992efe 652 {
avi23 0:427469992efe 653 //For each small invader clear and redraws them if they're alive
avi23 2:d34c95990605 654 for (int i = 0; i < 5; i++) {
avi23 0:427469992efe 655 //Checks if the invader is alive
avi23 0:427469992efe 656 if (small_invader[i].is_alive) {
avi23 0:427469992efe 657 //Reads off the bitmap and sets the allowed pixels
avi23 2:d34c95990605 658 if (invaders_in_state2) {
avi23 2:d34c95990605 659 for (int col = 0; col < 8; col++) {
avi23 2:d34c95990605 660 for (int row = 0; row < 6; row++) {
avi23 0:427469992efe 661 if(small_invader_bitmap_1[row][col]) {
avi23 2:d34c95990605 662 //lcd.setPixel(small_invader[i].x_pos + col, small_invader[i].y_pos + row);
avi23 4:a99953ef9e42 663 screen_map[small_invader[i].x_pos + col][small_invader[i].y_pos + row] = first_small_invader_pixel + i;
avi23 0:427469992efe 664 }
avi23 0:427469992efe 665 }
avi23 0:427469992efe 666 }
avi23 0:427469992efe 667 } else {
avi23 2:d34c95990605 668 for (int col = 0; col < 8; col++) {
avi23 2:d34c95990605 669 for (int row = 0; row < 6; row++) {
avi23 0:427469992efe 670 if(small_invader_bitmap_2[row][col]) {
avi23 2:d34c95990605 671 //lcd.setPixel(small_invader[i].x_pos + col, small_invader[i].y_pos + row);
avi23 4:a99953ef9e42 672 screen_map[small_invader[i].x_pos + col][small_invader[i].y_pos + row] = first_small_invader_pixel + i;
avi23 0:427469992efe 673 }
avi23 0:427469992efe 674 }
avi23 0:427469992efe 675 }
avi23 0:427469992efe 676 }
avi23 0:427469992efe 677 }
avi23 0:427469992efe 678 }
avi23 1:b300d052d549 679 }
avi23 1:b300d052d549 680
avi23 1:b300d052d549 681 //Sets the position and aliveness of the medium invaders
avi23 1:b300d052d549 682 void InitMediumInvaders()
avi23 1:b300d052d549 683 {
avi23 2:d34c95990605 684 for (int i = 0; i < 5; i++) {
avi23 1:b300d052d549 685 medium_invader[i].x_pos = 1 + (i*13);
avi23 2:d34c95990605 686 medium_invader[i].y_pos = 8;
avi23 1:b300d052d549 687 medium_invader[i].is_alive = true;
avi23 1:b300d052d549 688 }
avi23 1:b300d052d549 689 }
avi23 1:b300d052d549 690
avi23 2:d34c95990605 691 void ClearMediumInvaders()
avi23 2:d34c95990605 692 {
avi23 2:d34c95990605 693 for (int i = 0; i < 5; i++) {
avi23 2:d34c95990605 694 if (!invaders_in_state2) {
avi23 2:d34c95990605 695 for (int col = 0; col < 10; col++) {
avi23 2:d34c95990605 696 for (int row = 0; row < 6; row++) {
avi23 4:a99953ef9e42 697 if(medium_invader_bitmap_1[row][col] && medium_invader[i].x_pos + col >= 0 && medium_invader[i].x_pos + col < 84) {
avi23 2:d34c95990605 698 //lcd.clearPixel(medium_invader[i].x_pos + col, medium_invader[i].y_pos + row);
avi23 4:a99953ef9e42 699 screen_map[medium_invader[i].x_pos + col][medium_invader[i].y_pos + row] = empty_pixel;
avi23 2:d34c95990605 700 }
avi23 2:d34c95990605 701 }
avi23 2:d34c95990605 702 }
avi23 2:d34c95990605 703 } else {
avi23 2:d34c95990605 704 for (int col = 0; col < 10; col++) {
avi23 2:d34c95990605 705 for (int row = 0; row < 6; row++) {
avi23 4:a99953ef9e42 706 if(medium_invader_bitmap_2[row][col] && medium_invader[i].x_pos + col >= 0 && medium_invader[i].x_pos + col < 84) {
avi23 2:d34c95990605 707 //lcd.clearPixel(medium_invader[i].x_pos + col, medium_invader[i].y_pos + row);
avi23 4:a99953ef9e42 708 screen_map[medium_invader[i].x_pos + col][medium_invader[i].y_pos + row] = empty_pixel;
avi23 2:d34c95990605 709 }
avi23 2:d34c95990605 710 }
avi23 2:d34c95990605 711 }
avi23 2:d34c95990605 712 }
avi23 2:d34c95990605 713 }
avi23 2:d34c95990605 714 }
avi23 2:d34c95990605 715
avi23 1:b300d052d549 716 void DrawMediumInvaders()
avi23 1:b300d052d549 717 {
avi23 1:b300d052d549 718 //For each small invader clear and redraws them if they're alive
avi23 2:d34c95990605 719 for (int i = 0; i < 5; i++) {
avi23 1:b300d052d549 720 //Checks if the invader is alive
avi23 1:b300d052d549 721 if (medium_invader[i].is_alive) {
avi23 1:b300d052d549 722 //Reads off the bitmap and sets the allowed pixels
avi23 2:d34c95990605 723 if (invaders_in_state2) {
avi23 2:d34c95990605 724 for (int col = 0; col < 10; col++) {
avi23 2:d34c95990605 725 for (int row = 0; row < 6; row++) {
avi23 1:b300d052d549 726 if(medium_invader_bitmap_1[row][col]) {
avi23 2:d34c95990605 727 //lcd.setPixel(medium_invader[i].x_pos + col, medium_invader[i].y_pos + row);
avi23 4:a99953ef9e42 728 screen_map[medium_invader[i].x_pos + col][medium_invader[i].y_pos + row] = first_medium_invader_pixel + i;
avi23 1:b300d052d549 729 }
avi23 1:b300d052d549 730 }
avi23 1:b300d052d549 731 }
avi23 1:b300d052d549 732 } else {
avi23 2:d34c95990605 733 for (int col = 0; col < 10; col++) {
avi23 2:d34c95990605 734 for (int row = 0; row < 6; row++) {
avi23 1:b300d052d549 735 if(medium_invader_bitmap_2[row][col]) {
avi23 2:d34c95990605 736 //lcd.setPixel(medium_invader[i].x_pos + col, medium_invader[i].y_pos + row);
avi23 4:a99953ef9e42 737 screen_map[medium_invader[i].x_pos + col][medium_invader[i].y_pos + row] = first_medium_invader_pixel + i;
avi23 1:b300d052d549 738 }
avi23 1:b300d052d549 739 }
avi23 1:b300d052d549 740 }
avi23 1:b300d052d549 741 }
avi23 1:b300d052d549 742 }
avi23 1:b300d052d549 743 }
avi23 1:b300d052d549 744 }
avi23 1:b300d052d549 745
avi23 1:b300d052d549 746 //Sets the position and aliveness of the large invaders
avi23 1:b300d052d549 747 void InitLargeInvaders()
avi23 1:b300d052d549 748 {
avi23 2:d34c95990605 749 for (int i = 0; i < 5; i++) {
avi23 1:b300d052d549 750 large_invader[i].x_pos = 0 + (i*13);
avi23 2:d34c95990605 751 large_invader[i].y_pos = 15;
avi23 1:b300d052d549 752 large_invader[i].is_alive = true;
avi23 1:b300d052d549 753 }
avi23 1:b300d052d549 754 }
avi23 1:b300d052d549 755
avi23 2:d34c95990605 756 void CLearLargeInvaders()
avi23 2:d34c95990605 757 {
avi23 2:d34c95990605 758 for (int i = 0; i < 5; i++) {
avi23 2:d34c95990605 759 //Reads off the bitmap and sets the allowed pixels
avi23 2:d34c95990605 760 if (!invaders_in_state2) {
avi23 2:d34c95990605 761 for (int col = 0; col < 12; col++) {
avi23 2:d34c95990605 762 for (int row = 0; row < 6; row++) {
avi23 4:a99953ef9e42 763 if(large_invader_bitmap_1[row][col] && large_invader[i].x_pos + col >= 0 && large_invader[i].x_pos + col < 84) {
avi23 2:d34c95990605 764 ///lcd.clearPixel(large_invader[i].x_pos + col, large_invader[i].y_pos + row);
avi23 4:a99953ef9e42 765 screen_map[large_invader[i].x_pos + col][large_invader[i].y_pos + row] = empty_pixel;
avi23 2:d34c95990605 766 }
avi23 2:d34c95990605 767 }
avi23 2:d34c95990605 768 }
avi23 2:d34c95990605 769 } else {
avi23 2:d34c95990605 770 for (int col = 0; col < 12; col++) {
avi23 2:d34c95990605 771 for (int row = 0; row < 6; row++) {
avi23 4:a99953ef9e42 772 if(large_invader_bitmap_2[row][col] && large_invader[i].x_pos + col >= 0 && large_invader[i].x_pos + col < 84) {
avi23 2:d34c95990605 773 //lcd.clearPixel(large_invader[i].x_pos + col, large_invader[i].y_pos + row);
avi23 4:a99953ef9e42 774 screen_map[large_invader[i].x_pos + col][large_invader[i].y_pos + row] = empty_pixel;
avi23 2:d34c95990605 775 }
avi23 2:d34c95990605 776 }
avi23 2:d34c95990605 777 }
avi23 2:d34c95990605 778 }
avi23 2:d34c95990605 779 }
avi23 2:d34c95990605 780 }
avi23 2:d34c95990605 781
avi23 1:b300d052d549 782 void DrawLargeInvaders()
avi23 1:b300d052d549 783 {
avi23 1:b300d052d549 784 //For each small invader clear and redraws them if they're alive
avi23 2:d34c95990605 785 for (int i = 0; i < 5; i++) {
avi23 2:d34c95990605 786 //Checks if the invader is alive
avi23 2:d34c95990605 787 if (large_invader[i].is_alive) {
avi23 2:d34c95990605 788 //Reads off the bitmap and sets the allowed pixels
avi23 2:d34c95990605 789 if (invaders_in_state2) {
avi23 2:d34c95990605 790 for (int col = 0; col < 12; col++) {
avi23 2:d34c95990605 791 for (int row = 0; row < 6; row++) {
avi23 2:d34c95990605 792 if(large_invader_bitmap_1[row][col]) {
avi23 2:d34c95990605 793 //lcd.setPixel(large_invader[i].x_pos + col, large_invader[i].y_pos + row);
avi23 4:a99953ef9e42 794 screen_map[large_invader[i].x_pos + col][large_invader[i].y_pos + row] = first_large_invader_pixel + i;
avi23 2:d34c95990605 795 }
avi23 2:d34c95990605 796 }
avi23 2:d34c95990605 797 }
avi23 2:d34c95990605 798 } else {
avi23 2:d34c95990605 799 for (int col = 0; col < 12; col++) {
avi23 2:d34c95990605 800 for (int row = 0; row < 6; row++) {
avi23 2:d34c95990605 801 if(large_invader_bitmap_2[row][col]) {
avi23 2:d34c95990605 802 //lcd.setPixel(large_invader[i].x_pos + col, large_invader[i].y_pos + row);
avi23 4:a99953ef9e42 803 screen_map[large_invader[i].x_pos + col][large_invader[i].y_pos + row] = first_large_invader_pixel + i;
avi23 2:d34c95990605 804 }
avi23 2:d34c95990605 805 }
avi23 2:d34c95990605 806 }
avi23 2:d34c95990605 807 }
avi23 2:d34c95990605 808 }
avi23 2:d34c95990605 809 }
avi23 2:d34c95990605 810 }
avi23 2:d34c95990605 811 /*
avi23 2:d34c95990605 812 void DrawInvaders(struct Invaders invader[], int no_of_invaders, bool bitmap[][])
avi23 2:d34c95990605 813 {
avi23 2:d34c95990605 814 //For each small invader clear and redraws them if they're alive
avi23 2:d34c95990605 815 for (int i = 0; i < no_of_invaders; i++) {
avi23 1:b300d052d549 816 //Clears the enemy position
avi23 2:d34c95990605 817 lcd.drawRect(invader[i].x_pos, invader[i].y_pos, 12, 6, 2);
avi23 1:b300d052d549 818
avi23 1:b300d052d549 819 //Checks if the invader is alive
avi23 2:d34c95990605 820 if (invader[i].is_alive) {
avi23 1:b300d052d549 821 //Reads off the bitmap and sets the allowed pixels
avi23 1:b300d052d549 822 int col = 0;
avi23 1:b300d052d549 823 int row = 0;
avi23 1:b300d052d549 824 //Flips the bitmap everytime the function is called
avi23 2:d34c95990605 825 if (invaders_in_state2) {
avi23 1:b300d052d549 826 for (col = 0; col < 12; col++) {
avi23 1:b300d052d549 827 for (row = 0; row < 6; row++) {
avi23 1:b300d052d549 828 if(large_invader_bitmap_1[row][col]) {
avi23 1:b300d052d549 829 lcd.setPixel(large_invader[i].x_pos + col, large_invader[i].y_pos + row);
avi23 1:b300d052d549 830 }
avi23 1:b300d052d549 831 }
avi23 1:b300d052d549 832 }
avi23 1:b300d052d549 833 } else {
avi23 1:b300d052d549 834 for (col = 0; col < 12; col++) {
avi23 1:b300d052d549 835 for (row = 0; row < 6; row++) {
avi23 1:b300d052d549 836 if(large_invader_bitmap_2[row][col]) {
avi23 1:b300d052d549 837 lcd.setPixel(large_invader[i].x_pos + col, large_invader[i].y_pos + row);
avi23 1:b300d052d549 838 }
avi23 1:b300d052d549 839 }
avi23 1:b300d052d549 840 }
avi23 1:b300d052d549 841 }
avi23 1:b300d052d549 842 }
avi23 1:b300d052d549 843 }
avi23 2:d34c95990605 844 }
avi23 2:d34c95990605 845 */
avi23 2:d34c95990605 846
avi23 2:d34c95990605 847
avi23 2:d34c95990605 848 void InitBarriers()
avi23 2:d34c95990605 849 {
avi23 2:d34c95990605 850 for (int i = 0; i < no_of_barriers; i++) {
avi23 2:d34c95990605 851 barrier[i].x_pos = 10 + (i*25);
avi23 2:d34c95990605 852 barrier[i].y_pos = 33;
avi23 2:d34c95990605 853 //Copies the bitmap into the structs
avi23 2:d34c95990605 854 memcpy(barrier[i].before_bitmap, barrier_bitmap, sizeof(barrier_bitmap));
avi23 2:d34c95990605 855 memcpy(barrier[i].after_bitmap, barrier_bitmap, sizeof(barrier_bitmap));
avi23 2:d34c95990605 856 }
avi23 2:d34c95990605 857 }
avi23 2:d34c95990605 858
avi23 2:d34c95990605 859 void DrawBarriers()
avi23 2:d34c95990605 860 {
avi23 2:d34c95990605 861 //Clears the barrier and redraws it with damage applied
avi23 2:d34c95990605 862 for (int i = 0; i < no_of_barriers; i++) {
avi23 2:d34c95990605 863 for (int col = 0; col < 14; col++) {
avi23 2:d34c95990605 864 for (int row = 0; row < 8; row++) {
avi23 2:d34c95990605 865 if (barrier[i].before_bitmap[row][col]) {
avi23 2:d34c95990605 866 //lcd.clearPixel(barrier[i].x_pos + col, barrier[i].y_pos + row);
avi23 4:a99953ef9e42 867 screen_map[barrier[i].x_pos + col][barrier[i].y_pos + row] = empty_pixel;
avi23 2:d34c95990605 868 }
avi23 2:d34c95990605 869 if (barrier[i].after_bitmap[row][col]) {
avi23 2:d34c95990605 870 //lcd.setPixel(barrier[i].x_pos + col, barrier[i].y_pos + row);
avi23 4:a99953ef9e42 871 screen_map[barrier[i].x_pos + col][barrier[i].y_pos + row] = first_barrier_pixel + i;
avi23 2:d34c95990605 872 }
avi23 2:d34c95990605 873 }
avi23 2:d34c95990605 874 }
avi23 2:d34c95990605 875 //Copies the after array to the before array
avi23 2:d34c95990605 876 memcpy(barrier[i].before_bitmap, barrier[i].after_bitmap, sizeof(barrier[i].after_bitmap));
avi23 2:d34c95990605 877 }
avi23 2:d34c95990605 878 }
avi23 2:d34c95990605 879
avi23 2:d34c95990605 880 void ShiftInvaderXPositions()
avi23 2:d34c95990605 881 {
avi23 2:d34c95990605 882 if (invader_direction == RIGHT) {
avi23 2:d34c95990605 883 //Checks the first large invader to see if it can travel anymore
avi23 2:d34c95990605 884 if (large_invader[0].x_pos < maximum_invader_x_pos) {
avi23 2:d34c95990605 885 for (int i = 0; i < 5; i++) {
avi23 2:d34c95990605 886 small_invader[i].x_pos += 2;
avi23 2:d34c95990605 887 medium_invader[i].x_pos += 2;
avi23 2:d34c95990605 888 large_invader[i].x_pos += 2;
avi23 2:d34c95990605 889 }
avi23 2:d34c95990605 890 } else {
avi23 2:d34c95990605 891 ShiftInvaderYPositions(LEFT);
avi23 2:d34c95990605 892 }
avi23 2:d34c95990605 893 } else {
avi23 2:d34c95990605 894 //Checks the first large invader to see if it can travel anymore
avi23 2:d34c95990605 895 if (large_invader[0].x_pos > minimum_invader_x_pos) {
avi23 2:d34c95990605 896 for (int i = 0; i < 5; i++) {
avi23 2:d34c95990605 897 small_invader[i].x_pos -= 2;
avi23 2:d34c95990605 898 medium_invader[i].x_pos -= 2;
avi23 2:d34c95990605 899 large_invader[i].x_pos -= 2;
avi23 2:d34c95990605 900 }
avi23 2:d34c95990605 901 } else {
avi23 2:d34c95990605 902 ShiftInvaderYPositions(RIGHT);
avi23 2:d34c95990605 903 }
avi23 2:d34c95990605 904 }
avi23 2:d34c95990605 905 }
avi23 2:d34c95990605 906
avi23 2:d34c95990605 907 void ShiftInvaderYPositions(bool new_direction)
avi23 2:d34c95990605 908 {
avi23 2:d34c95990605 909 //Checks to see which row of invaders are still alive to work out maximum y positions
avi23 2:d34c95990605 910 if (large_invader[0].is_alive || large_invader[1].is_alive || large_invader[2].is_alive || large_invader[3].is_alive || large_invader[4].is_alive) {
avi23 2:d34c95990605 911 lowest_invader_row_alive = large;
avi23 2:d34c95990605 912 } else if (medium_invader[0].is_alive || medium_invader[1].is_alive || medium_invader[2].is_alive || medium_invader[3].is_alive || medium_invader[4].is_alive) {
avi23 2:d34c95990605 913 lowest_invader_row_alive = medium;
avi23 2:d34c95990605 914 } else {
avi23 2:d34c95990605 915 lowest_invader_row_alive = small;
avi23 2:d34c95990605 916 }
avi23 2:d34c95990605 917 //If an invader touches the bottom the game ends, otherwise the invaders descend
avi23 2:d34c95990605 918 if (small_invader[0].y_pos < 39 - (7*lowest_invader_row_alive)) {
avi23 2:d34c95990605 919 for (int i = 0; i < 5; i++) {
avi23 2:d34c95990605 920 small_invader[i].y_pos += 3;
avi23 2:d34c95990605 921 medium_invader[i].y_pos += 3;
avi23 2:d34c95990605 922 large_invader[i].y_pos += 3;
avi23 2:d34c95990605 923 invader_direction = new_direction;
avi23 2:d34c95990605 924 }
avi23 2:d34c95990605 925 } else {
avi23 2:d34c95990605 926 game_over = true;
avi23 2:d34c95990605 927 }
avi23 2:d34c95990605 928
avi23 2:d34c95990605 929 //TEST CODE
avi23 2:d34c95990605 930 down_count++;
avi23 2:d34c95990605 931 }
avi23 2:d34c95990605 932
avi23 2:d34c95990605 933 /*
avi23 2:d34c95990605 934 void InitUFO()
avi23 2:d34c95990605 935 {
avi23 2:d34c95990605 936
avi23 2:d34c95990605 937 }
avi23 2:d34c95990605 938 */
avi23 2:d34c95990605 939
avi23 2:d34c95990605 940 void DrawUFO()
avi23 2:d34c95990605 941 {
avi23 2:d34c95990605 942 //Draws the UFO
avi23 2:d34c95990605 943 int x_pos = 20;
avi23 2:d34c95990605 944 int y_pos = 25;
avi23 2:d34c95990605 945 for (int col = 0; col < col_no; col++) {
avi23 2:d34c95990605 946 for (int row = 0; row < row_no; row++) {
avi23 2:d34c95990605 947 if(ufo_bitmap[row][col]) {
avi23 2:d34c95990605 948 //lcd.setPixel(x_pos + col, y_pos + row);
avi23 4:a99953ef9e42 949 screen_map[x_pos + col][y_pos + row] = ufo_pixel;
avi23 2:d34c95990605 950 }
avi23 2:d34c95990605 951 }
avi23 2:d34c95990605 952 }
avi23 0:427469992efe 953 }