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

Dependencies:   Joystick N5110 SDFileSystem mbed

Committer:
avi23
Date:
Sun Mar 27 18:47:07 2016 +0000
Revision:
3:544b59d60ab8
Parent:
2:d34c95990605
Child:
4:a99953ef9e42
Cannon shot actually fades out

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