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

Dependencies:   Joystick N5110 SDFileSystem mbed

Committer:
avi23
Date:
Sun Mar 27 17:30:13 2016 +0000
Revision:
2:d34c95990605
Parent:
1:b300d052d549
Child:
3:544b59d60ab8
COLLISION DETECTION WORKS!!!

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 2:d34c95990605 380 pc.printf("Shot Fired\n");
avi23 2:d34c95990605 381
avi23 2:d34c95990605 382 //Add 4 to cannon x_pos to get shot x_pos
avi23 2:d34c95990605 383 cannon_shot_x_pos = cannon_xpos + 4;
avi23 2:d34c95990605 384 cannon_shot_y_pos = 40;
avi23 2:d34c95990605 385 cannon_shot_on_screen = true;
avi23 2:d34c95990605 386 move_cannon_shot.attach(&move_cannon_shot_isr, 0.1);
avi23 2:d34c95990605 387 }
avi23 2:d34c95990605 388 //Move the cannon's shot
avi23 2:d34c95990605 389 if (g_move_cannon_shot_flag) {
avi23 2:d34c95990605 390 g_move_cannon_shot_flag = false;
avi23 2:d34c95990605 391
avi23 2:d34c95990605 392 //Checks bullet will not go beyond the bounds of the screen map
avi23 2:d34c95990605 393 if (cannon_shot_y_pos > -1) {
avi23 2:d34c95990605 394 //Loops throught the shot bitmap and sets the pixels in the screen map
avi23 2:d34c95990605 395 for (int row = 0; row < 3; row++) {
avi23 2:d34c95990605 396 //Clears the position where the bullet was
avi23 2:d34c95990605 397 screen_map[cannon_shot_x_pos][cannon_shot_y_pos + row] = EMPTY;
avi23 2:d34c95990605 398 }
avi23 2:d34c95990605 399
avi23 2:d34c95990605 400 //Increments the shot going up the screen
avi23 2:d34c95990605 401 cannon_shot_y_pos--;
avi23 2:d34c95990605 402
avi23 2:d34c95990605 403 for (int row = 0; row < 3; row++) {
avi23 2:d34c95990605 404 switch (screen_map[cannon_shot_x_pos][cannon_shot_y_pos + row]) {
avi23 2:d34c95990605 405 case SMALL:
avi23 2:d34c95990605 406 pc.printf("Small Hit\n");
avi23 2:d34c95990605 407 cannon_shot_on_screen = false;
avi23 2:d34c95990605 408 move_cannon_shot.detach();
avi23 2:d34c95990605 409 break;
avi23 2:d34c95990605 410 case MEDIUM:
avi23 2:d34c95990605 411 pc.printf("Medium Hit\n");
avi23 2:d34c95990605 412 cannon_shot_on_screen = false;
avi23 2:d34c95990605 413 move_cannon_shot.detach();
avi23 2:d34c95990605 414 break;
avi23 2:d34c95990605 415 case LARGE:
avi23 2:d34c95990605 416 pc.printf("Large Hit\n");
avi23 2:d34c95990605 417 cannon_shot_on_screen = false;
avi23 2:d34c95990605 418 move_cannon_shot.detach();
avi23 2:d34c95990605 419 break;
avi23 2:d34c95990605 420 case BARRIER:
avi23 2:d34c95990605 421 pc.printf("Barrier Hit\n");
avi23 2:d34c95990605 422 cannon_shot_on_screen = false;
avi23 2:d34c95990605 423 move_cannon_shot.detach();
avi23 2:d34c95990605 424 break;
avi23 2:d34c95990605 425 case UFO:
avi23 2:d34c95990605 426 pc.printf("UFO Hit\n");
avi23 2:d34c95990605 427 cannon_shot_on_screen = false;
avi23 2:d34c95990605 428 move_cannon_shot.detach();
avi23 2:d34c95990605 429 break;
avi23 2:d34c95990605 430 default:
avi23 2:d34c95990605 431 screen_map[cannon_shot_x_pos][cannon_shot_y_pos + row] = CANNON_SHOT;
avi23 2:d34c95990605 432 }
avi23 1:b300d052d549 433 }
avi23 1:b300d052d549 434 }
avi23 1:b300d052d549 435 }
avi23 1:b300d052d549 436 }
avi23 2:d34c95990605 437 //Controls enemy movement
avi23 0:427469992efe 438 if (g_move_enemies_flag) {
avi23 0:427469992efe 439 g_move_enemies_flag = false;
avi23 0:427469992efe 440
avi23 2:d34c95990605 441 //Added stuff to move to function
avi23 2:d34c95990605 442 //Checks which columns of invaders are alive on the right and left sides and changes the limits of the first invader
avi23 2:d34c95990605 443 //MOVE TO COLLISION DETECTION WHEN IT'S DONE
avi23 2:d34c95990605 444 //Checking the left side
avi23 2:d34c95990605 445 for (int i = 0; i < 5; i++) {
avi23 2:d34c95990605 446 if (small_invader[i].is_alive || medium_invader[i].is_alive || large_invader[i].is_alive) {
avi23 2:d34c95990605 447 left_column_alive = i;
avi23 2:d34c95990605 448 break;
avi23 2:d34c95990605 449 }
avi23 2:d34c95990605 450 }
avi23 2:d34c95990605 451 minimum_invader_x_pos = 0 - left_column_alive*13;
avi23 2:d34c95990605 452 //Checking the right side
avi23 2:d34c95990605 453 for (int j = 4; j >= 0; j--) {
avi23 2:d34c95990605 454 if (small_invader[j].is_alive || medium_invader[j].is_alive || large_invader[j].is_alive) {
avi23 2:d34c95990605 455 right_column_alive = j;
avi23 2:d34c95990605 456 break;
avi23 2:d34c95990605 457 }
avi23 2:d34c95990605 458 }
avi23 2:d34c95990605 459 maximum_invader_x_pos = 72 - right_column_alive*13;
avi23 2:d34c95990605 460
avi23 2:d34c95990605 461 //End of block
avi23 2:d34c95990605 462
avi23 2:d34c95990605 463 //Clears the old bitmaps
avi23 2:d34c95990605 464 ClearSmallInvaders();
avi23 2:d34c95990605 465 ClearMediumInvaders();
avi23 2:d34c95990605 466 CLearLargeInvaders();
avi23 2:d34c95990605 467
avi23 2:d34c95990605 468 ShiftInvaderXPositions();
avi23 2:d34c95990605 469
avi23 0:427469992efe 470 DrawSmallInvaders();
avi23 1:b300d052d549 471 DrawMediumInvaders();
avi23 1:b300d052d549 472 DrawLargeInvaders();
avi23 2:d34c95990605 473 DrawUFO();
avi23 1:b300d052d549 474
avi23 2:d34c95990605 475 invaders_in_state2 = !invaders_in_state2;
avi23 0:427469992efe 476
avi23 0:427469992efe 477 lcd.refresh();
avi23 2:d34c95990605 478
avi23 2:d34c95990605 479 //TEST CODE
avi23 2:d34c95990605 480
avi23 2:d34c95990605 481 //END
avi23 0:427469992efe 482 }
avi23 2:d34c95990605 483
avi23 0:427469992efe 484 sleep();
avi23 0:427469992efe 485 }
avi23 0:427469992efe 486 }
avi23 0:427469992efe 487
avi23 0:427469992efe 488 void init_K64F()
avi23 0:427469992efe 489 {
avi23 0:427469992efe 490 // on-board LEDs are active-low, so set pin high to turn them off.
avi23 0:427469992efe 491 r_led = 1;
avi23 0:427469992efe 492 g_led = 1;
avi23 0:427469992efe 493 b_led = 1;
avi23 0:427469992efe 494
avi23 0:427469992efe 495 // since the on-board switches have external pull-ups, we should disable the internal pull-down
avi23 0:427469992efe 496 // resistors that are enabled by default using InterruptIn
avi23 0:427469992efe 497 sw2.mode(PullNone);
avi23 0:427469992efe 498 sw3.mode(PullNone);
avi23 0:427469992efe 499
avi23 0:427469992efe 500 }
avi23 0:427469992efe 501
avi23 0:427469992efe 502 void error()
avi23 0:427469992efe 503 {
avi23 0:427469992efe 504 while(1) { // if error, hang while flashing error message
avi23 0:427469992efe 505 r_led = 0;
avi23 0:427469992efe 506 wait(0.2);
avi23 0:427469992efe 507 r_led = 1;
avi23 0:427469992efe 508 wait(0.2);
avi23 0:427469992efe 509 }
avi23 0:427469992efe 510 }
avi23 0:427469992efe 511
avi23 0:427469992efe 512 void init_serial()
avi23 0:427469992efe 513 {
avi23 0:427469992efe 514 // set to highest baud - ensure terminal software matches
avi23 0:427469992efe 515 pc.baud(115200);
avi23 0:427469992efe 516 }
avi23 0:427469992efe 517
avi23 2:d34c95990605 518 void init_shoot()
avi23 0:427469992efe 519 {
avi23 2:d34c95990605 520 shoot_button.mode(PullUp);
avi23 2:d34c95990605 521 shoot_button.fall(&shoot_pressed_isr);
avi23 2:d34c95990605 522
avi23 2:d34c95990605 523 }
avi23 2:d34c95990605 524
avi23 2:d34c95990605 525 void update_screen_isr()
avi23 2:d34c95990605 526 {
avi23 2:d34c95990605 527 g_update_screen_flag = true;
avi23 0:427469992efe 528 }
avi23 0:427469992efe 529
avi23 2:d34c95990605 530 void shoot_pressed_isr()
avi23 2:d34c95990605 531 {
avi23 2:d34c95990605 532 g_shoot_pressed_flag = true;
avi23 2:d34c95990605 533 }
avi23 2:d34c95990605 534
avi23 2:d34c95990605 535 void move_cannon_shot_isr()
avi23 2:d34c95990605 536 {
avi23 2:d34c95990605 537 g_move_cannon_shot_flag = true;
avi23 2:d34c95990605 538 }
avi23 2:d34c95990605 539
avi23 2:d34c95990605 540 void move_cannon_isr()
avi23 2:d34c95990605 541 {
avi23 2:d34c95990605 542 g_move_cannon_flag = true;
avi23 2:d34c95990605 543 }
avi23 2:d34c95990605 544
avi23 2:d34c95990605 545 void MoveCannon()
avi23 0:427469992efe 546 {
avi23 0:427469992efe 547 //Clears the ship
avi23 0:427469992efe 548 for (int col = 0; col < 9; col++) {
avi23 0:427469992efe 549 for (int row = 0; row < 5; row++) {
avi23 1:b300d052d549 550 if(cannon_bitmap[row][col]) {
avi23 2:d34c95990605 551 //lcd.clearPixel(cannon_xpos+col, cannon_ypos+row);
avi23 2:d34c95990605 552 screen_map[cannon_xpos+col][cannon_ypos+row] = EMPTY;
avi23 0:427469992efe 553 }
avi23 0:427469992efe 554 }
avi23 0:427469992efe 555 }
avi23 0:427469992efe 556
avi23 0:427469992efe 557 //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 558 if (joystick.GetXValue() < 0.25f) {
avi23 1:b300d052d549 559 cannon_xpos--;
avi23 1:b300d052d549 560 if (cannon_xpos < 0) {
avi23 1:b300d052d549 561 cannon_xpos = 0;
avi23 0:427469992efe 562 }
avi23 0:427469992efe 563 } else if (joystick.GetXValue() > 0.75f) {
avi23 1:b300d052d549 564 cannon_xpos++;
avi23 1:b300d052d549 565 if (cannon_xpos > 75) {
avi23 1:b300d052d549 566 cannon_xpos = 75;
avi23 0:427469992efe 567 }
avi23 0:427469992efe 568 }
avi23 0:427469992efe 569
avi23 0:427469992efe 570 //Redraws the ship
avi23 0:427469992efe 571 for (int col = 0; col < 9; col++) {
avi23 0:427469992efe 572 for (int row = 0; row < 5; row++) {
avi23 1:b300d052d549 573 if(cannon_bitmap[row][col]) {
avi23 2:d34c95990605 574 //lcd.setPixel(cannon_xpos+col, cannon_ypos+row);
avi23 2:d34c95990605 575 screen_map[cannon_xpos+col][cannon_ypos+row] = CANNON;
avi23 0:427469992efe 576 }
avi23 0:427469992efe 577 }
avi23 0:427469992efe 578 }
avi23 0:427469992efe 579 }
avi23 0:427469992efe 580
avi23 0:427469992efe 581 void move_enemies_isr()
avi23 0:427469992efe 582 {
avi23 0:427469992efe 583 g_move_enemies_flag = true;
avi23 0:427469992efe 584 }
avi23 0:427469992efe 585
avi23 0:427469992efe 586 //Sets the position and aliveness of the small invaders
avi23 0:427469992efe 587 void InitSmallInvaders()
avi23 0:427469992efe 588 {
avi23 2:d34c95990605 589 for (int i = 0; i < 5; i++) {
avi23 1:b300d052d549 590 small_invader[i].x_pos = 2+ (i*13);
avi23 2:d34c95990605 591 small_invader[i].y_pos = 1;
avi23 0:427469992efe 592 small_invader[i].is_alive = true;
avi23 0:427469992efe 593 }
avi23 0:427469992efe 594 }
avi23 0:427469992efe 595
avi23 2:d34c95990605 596 void ClearSmallInvaders()
avi23 2:d34c95990605 597 {
avi23 2:d34c95990605 598 for (int i = 0; i < 5; i++) {
avi23 2:d34c95990605 599 if (!invaders_in_state2) {
avi23 2:d34c95990605 600 for (int col = 0; col < 8; col++) {
avi23 2:d34c95990605 601 for (int row = 0; row < 6; row++) {
avi23 2:d34c95990605 602 if(small_invader_bitmap_1[row][col]) {
avi23 2:d34c95990605 603 //lcd.clearPixel(small_invader[i].x_pos + col, small_invader[i].y_pos + row);
avi23 2:d34c95990605 604 screen_map[small_invader[i].x_pos + col][small_invader[i].y_pos + row] = EMPTY;
avi23 2:d34c95990605 605 }
avi23 2:d34c95990605 606 }
avi23 2:d34c95990605 607 }
avi23 2:d34c95990605 608 } else {
avi23 2:d34c95990605 609 for (int col = 0; col < 8; col++) {
avi23 2:d34c95990605 610 for (int row = 0; row < 6; row++) {
avi23 2:d34c95990605 611 if(small_invader_bitmap_2[row][col]) {
avi23 2:d34c95990605 612 //lcd.clearPixel(small_invader[i].x_pos + col, small_invader[i].y_pos + row);
avi23 2:d34c95990605 613 screen_map[small_invader[i].x_pos + col][small_invader[i].y_pos + row] = EMPTY;
avi23 2:d34c95990605 614 }
avi23 2:d34c95990605 615 }
avi23 2:d34c95990605 616 }
avi23 2:d34c95990605 617 }
avi23 2:d34c95990605 618 }
avi23 2:d34c95990605 619 }
avi23 2:d34c95990605 620
avi23 0:427469992efe 621 void DrawSmallInvaders()
avi23 0:427469992efe 622 {
avi23 0:427469992efe 623 //For each small invader clear and redraws them if they're alive
avi23 2:d34c95990605 624 for (int i = 0; i < 5; i++) {
avi23 0:427469992efe 625 //Checks if the invader is alive
avi23 0:427469992efe 626 if (small_invader[i].is_alive) {
avi23 0:427469992efe 627 //Reads off the bitmap and sets the allowed pixels
avi23 2:d34c95990605 628 if (invaders_in_state2) {
avi23 2:d34c95990605 629 for (int col = 0; col < 8; col++) {
avi23 2:d34c95990605 630 for (int row = 0; row < 6; row++) {
avi23 0:427469992efe 631 if(small_invader_bitmap_1[row][col]) {
avi23 2:d34c95990605 632 //lcd.setPixel(small_invader[i].x_pos + col, small_invader[i].y_pos + row);
avi23 2:d34c95990605 633 screen_map[small_invader[i].x_pos + col][small_invader[i].y_pos + row] = SMALL;
avi23 0:427469992efe 634 }
avi23 0:427469992efe 635 }
avi23 0:427469992efe 636 }
avi23 0:427469992efe 637 } else {
avi23 2:d34c95990605 638 for (int col = 0; col < 8; col++) {
avi23 2:d34c95990605 639 for (int row = 0; row < 6; row++) {
avi23 0:427469992efe 640 if(small_invader_bitmap_2[row][col]) {
avi23 2:d34c95990605 641 //lcd.setPixel(small_invader[i].x_pos + col, small_invader[i].y_pos + row);
avi23 2:d34c95990605 642 screen_map[small_invader[i].x_pos + col][small_invader[i].y_pos + row] = SMALL;
avi23 0:427469992efe 643 }
avi23 0:427469992efe 644 }
avi23 0:427469992efe 645 }
avi23 0:427469992efe 646 }
avi23 0:427469992efe 647 }
avi23 0:427469992efe 648 }
avi23 1:b300d052d549 649 }
avi23 1:b300d052d549 650
avi23 1:b300d052d549 651 //Sets the position and aliveness of the medium invaders
avi23 1:b300d052d549 652 void InitMediumInvaders()
avi23 1:b300d052d549 653 {
avi23 2:d34c95990605 654 for (int i = 0; i < 5; i++) {
avi23 1:b300d052d549 655 medium_invader[i].x_pos = 1 + (i*13);
avi23 2:d34c95990605 656 medium_invader[i].y_pos = 8;
avi23 1:b300d052d549 657 medium_invader[i].is_alive = true;
avi23 1:b300d052d549 658 }
avi23 1:b300d052d549 659 }
avi23 1:b300d052d549 660
avi23 2:d34c95990605 661 void ClearMediumInvaders()
avi23 2:d34c95990605 662 {
avi23 2:d34c95990605 663 for (int i = 0; i < 5; i++) {
avi23 2:d34c95990605 664 if (!invaders_in_state2) {
avi23 2:d34c95990605 665 for (int col = 0; col < 10; col++) {
avi23 2:d34c95990605 666 for (int row = 0; row < 6; row++) {
avi23 2:d34c95990605 667 if(medium_invader_bitmap_1[row][col]) {
avi23 2:d34c95990605 668 //lcd.clearPixel(medium_invader[i].x_pos + col, medium_invader[i].y_pos + row);
avi23 2:d34c95990605 669 screen_map[medium_invader[i].x_pos + col][medium_invader[i].y_pos + row] = EMPTY;
avi23 2:d34c95990605 670 }
avi23 2:d34c95990605 671 }
avi23 2:d34c95990605 672 }
avi23 2:d34c95990605 673 } else {
avi23 2:d34c95990605 674 for (int col = 0; col < 10; col++) {
avi23 2:d34c95990605 675 for (int row = 0; row < 6; row++) {
avi23 2:d34c95990605 676 if(medium_invader_bitmap_2[row][col]) {
avi23 2:d34c95990605 677 //lcd.clearPixel(medium_invader[i].x_pos + col, medium_invader[i].y_pos + row);
avi23 2:d34c95990605 678 screen_map[medium_invader[i].x_pos + col][medium_invader[i].y_pos + row] = EMPTY;
avi23 2:d34c95990605 679 }
avi23 2:d34c95990605 680 }
avi23 2:d34c95990605 681 }
avi23 2:d34c95990605 682 }
avi23 2:d34c95990605 683 }
avi23 2:d34c95990605 684 }
avi23 2:d34c95990605 685
avi23 1:b300d052d549 686 void DrawMediumInvaders()
avi23 1:b300d052d549 687 {
avi23 1:b300d052d549 688 //For each small invader clear and redraws them if they're alive
avi23 2:d34c95990605 689 for (int i = 0; i < 5; i++) {
avi23 1:b300d052d549 690 //Checks if the invader is alive
avi23 1:b300d052d549 691 if (medium_invader[i].is_alive) {
avi23 1:b300d052d549 692 //Reads off the bitmap and sets the allowed pixels
avi23 2:d34c95990605 693 if (invaders_in_state2) {
avi23 2:d34c95990605 694 for (int col = 0; col < 10; col++) {
avi23 2:d34c95990605 695 for (int row = 0; row < 6; row++) {
avi23 1:b300d052d549 696 if(medium_invader_bitmap_1[row][col]) {
avi23 2:d34c95990605 697 //lcd.setPixel(medium_invader[i].x_pos + col, medium_invader[i].y_pos + row);
avi23 2:d34c95990605 698 screen_map[medium_invader[i].x_pos + col][medium_invader[i].y_pos + row] = MEDIUM;
avi23 1:b300d052d549 699 }
avi23 1:b300d052d549 700 }
avi23 1:b300d052d549 701 }
avi23 1:b300d052d549 702 } else {
avi23 2:d34c95990605 703 for (int col = 0; col < 10; col++) {
avi23 2:d34c95990605 704 for (int row = 0; row < 6; row++) {
avi23 1:b300d052d549 705 if(medium_invader_bitmap_2[row][col]) {
avi23 2:d34c95990605 706 //lcd.setPixel(medium_invader[i].x_pos + col, medium_invader[i].y_pos + row);
avi23 2:d34c95990605 707 screen_map[medium_invader[i].x_pos + col][medium_invader[i].y_pos + row] = MEDIUM;
avi23 1:b300d052d549 708 }
avi23 1:b300d052d549 709 }
avi23 1:b300d052d549 710 }
avi23 1:b300d052d549 711 }
avi23 1:b300d052d549 712 }
avi23 1:b300d052d549 713 }
avi23 1:b300d052d549 714 }
avi23 1:b300d052d549 715
avi23 1:b300d052d549 716 //Sets the position and aliveness of the large invaders
avi23 1:b300d052d549 717 void InitLargeInvaders()
avi23 1:b300d052d549 718 {
avi23 2:d34c95990605 719 for (int i = 0; i < 5; i++) {
avi23 1:b300d052d549 720 large_invader[i].x_pos = 0 + (i*13);
avi23 2:d34c95990605 721 large_invader[i].y_pos = 15;
avi23 1:b300d052d549 722 large_invader[i].is_alive = true;
avi23 1:b300d052d549 723 }
avi23 1:b300d052d549 724 }
avi23 1:b300d052d549 725
avi23 2:d34c95990605 726 void CLearLargeInvaders()
avi23 2:d34c95990605 727 {
avi23 2:d34c95990605 728 for (int i = 0; i < 5; i++) {
avi23 2:d34c95990605 729 //Reads off the bitmap and sets the allowed pixels
avi23 2:d34c95990605 730 if (!invaders_in_state2) {
avi23 2:d34c95990605 731 for (int col = 0; col < 12; col++) {
avi23 2:d34c95990605 732 for (int row = 0; row < 6; row++) {
avi23 2:d34c95990605 733 if(large_invader_bitmap_1[row][col]) {
avi23 2:d34c95990605 734 ///lcd.clearPixel(large_invader[i].x_pos + col, large_invader[i].y_pos + row);
avi23 2:d34c95990605 735 screen_map[large_invader[i].x_pos + col][large_invader[i].y_pos + row] = EMPTY;
avi23 2:d34c95990605 736 }
avi23 2:d34c95990605 737 }
avi23 2:d34c95990605 738 }
avi23 2:d34c95990605 739 } else {
avi23 2:d34c95990605 740 for (int col = 0; col < 12; col++) {
avi23 2:d34c95990605 741 for (int row = 0; row < 6; row++) {
avi23 2:d34c95990605 742 if(large_invader_bitmap_2[row][col]) {
avi23 2:d34c95990605 743 //lcd.clearPixel(large_invader[i].x_pos + col, large_invader[i].y_pos + row);
avi23 2:d34c95990605 744 screen_map[large_invader[i].x_pos + col][large_invader[i].y_pos + row] = EMPTY;
avi23 2:d34c95990605 745 }
avi23 2:d34c95990605 746 }
avi23 2:d34c95990605 747 }
avi23 2:d34c95990605 748 }
avi23 2:d34c95990605 749 }
avi23 2:d34c95990605 750 }
avi23 2:d34c95990605 751
avi23 1:b300d052d549 752 void DrawLargeInvaders()
avi23 1:b300d052d549 753 {
avi23 1:b300d052d549 754 //For each small invader clear and redraws them if they're alive
avi23 2:d34c95990605 755 for (int i = 0; i < 5; i++) {
avi23 2:d34c95990605 756 //Checks if the invader is alive
avi23 2:d34c95990605 757 if (large_invader[i].is_alive) {
avi23 2:d34c95990605 758 //Reads off the bitmap and sets the allowed pixels
avi23 2:d34c95990605 759 if (invaders_in_state2) {
avi23 2:d34c95990605 760 for (int col = 0; col < 12; col++) {
avi23 2:d34c95990605 761 for (int row = 0; row < 6; row++) {
avi23 2:d34c95990605 762 if(large_invader_bitmap_1[row][col]) {
avi23 2:d34c95990605 763 //lcd.setPixel(large_invader[i].x_pos + col, large_invader[i].y_pos + row);
avi23 2:d34c95990605 764 screen_map[large_invader[i].x_pos + col][large_invader[i].y_pos + row] = LARGE;
avi23 2:d34c95990605 765 }
avi23 2:d34c95990605 766 }
avi23 2:d34c95990605 767 }
avi23 2:d34c95990605 768 } else {
avi23 2:d34c95990605 769 for (int col = 0; col < 12; col++) {
avi23 2:d34c95990605 770 for (int row = 0; row < 6; row++) {
avi23 2:d34c95990605 771 if(large_invader_bitmap_2[row][col]) {
avi23 2:d34c95990605 772 //lcd.setPixel(large_invader[i].x_pos + col, large_invader[i].y_pos + row);
avi23 2:d34c95990605 773 screen_map[large_invader[i].x_pos + col][large_invader[i].y_pos + row] = LARGE;
avi23 2:d34c95990605 774 }
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 2:d34c95990605 782 void DrawInvaders(struct Invaders invader[], int no_of_invaders, bool bitmap[][])
avi23 2:d34c95990605 783 {
avi23 2:d34c95990605 784 //For each small invader clear and redraws them if they're alive
avi23 2:d34c95990605 785 for (int i = 0; i < no_of_invaders; i++) {
avi23 1:b300d052d549 786 //Clears the enemy position
avi23 2:d34c95990605 787 lcd.drawRect(invader[i].x_pos, invader[i].y_pos, 12, 6, 2);
avi23 1:b300d052d549 788
avi23 1:b300d052d549 789 //Checks if the invader is alive
avi23 2:d34c95990605 790 if (invader[i].is_alive) {
avi23 1:b300d052d549 791 //Reads off the bitmap and sets the allowed pixels
avi23 1:b300d052d549 792 int col = 0;
avi23 1:b300d052d549 793 int row = 0;
avi23 1:b300d052d549 794 //Flips the bitmap everytime the function is called
avi23 2:d34c95990605 795 if (invaders_in_state2) {
avi23 1:b300d052d549 796 for (col = 0; col < 12; col++) {
avi23 1:b300d052d549 797 for (row = 0; row < 6; row++) {
avi23 1:b300d052d549 798 if(large_invader_bitmap_1[row][col]) {
avi23 1:b300d052d549 799 lcd.setPixel(large_invader[i].x_pos + col, large_invader[i].y_pos + row);
avi23 1:b300d052d549 800 }
avi23 1:b300d052d549 801 }
avi23 1:b300d052d549 802 }
avi23 1:b300d052d549 803 } else {
avi23 1:b300d052d549 804 for (col = 0; col < 12; col++) {
avi23 1:b300d052d549 805 for (row = 0; row < 6; row++) {
avi23 1:b300d052d549 806 if(large_invader_bitmap_2[row][col]) {
avi23 1:b300d052d549 807 lcd.setPixel(large_invader[i].x_pos + col, large_invader[i].y_pos + row);
avi23 1:b300d052d549 808 }
avi23 1:b300d052d549 809 }
avi23 1:b300d052d549 810 }
avi23 1:b300d052d549 811 }
avi23 1:b300d052d549 812 }
avi23 1:b300d052d549 813 }
avi23 2:d34c95990605 814 }
avi23 2:d34c95990605 815 */
avi23 2:d34c95990605 816
avi23 2:d34c95990605 817
avi23 2:d34c95990605 818 void InitBarriers()
avi23 2:d34c95990605 819 {
avi23 2:d34c95990605 820 for (int i = 0; i < no_of_barriers; i++) {
avi23 2:d34c95990605 821 barrier[i].x_pos = 10 + (i*25);
avi23 2:d34c95990605 822 barrier[i].y_pos = 33;
avi23 2:d34c95990605 823 //Copies the bitmap into the structs
avi23 2:d34c95990605 824 memcpy(barrier[i].before_bitmap, barrier_bitmap, sizeof(barrier_bitmap));
avi23 2:d34c95990605 825 memcpy(barrier[i].after_bitmap, barrier_bitmap, sizeof(barrier_bitmap));
avi23 2:d34c95990605 826 }
avi23 2:d34c95990605 827 }
avi23 2:d34c95990605 828
avi23 2:d34c95990605 829 void DrawBarriers()
avi23 2:d34c95990605 830 {
avi23 2:d34c95990605 831 //Clears the barrier and redraws it with damage applied
avi23 2:d34c95990605 832 for (int i = 0; i < no_of_barriers; i++) {
avi23 2:d34c95990605 833 for (int col = 0; col < 14; col++) {
avi23 2:d34c95990605 834 for (int row = 0; row < 8; row++) {
avi23 2:d34c95990605 835 if (barrier[i].before_bitmap[row][col]) {
avi23 2:d34c95990605 836 //lcd.clearPixel(barrier[i].x_pos + col, barrier[i].y_pos + row);
avi23 2:d34c95990605 837 screen_map[barrier[i].x_pos + col][barrier[i].y_pos + row] = EMPTY;
avi23 2:d34c95990605 838 }
avi23 2:d34c95990605 839 if (barrier[i].after_bitmap[row][col]) {
avi23 2:d34c95990605 840 //lcd.setPixel(barrier[i].x_pos + col, barrier[i].y_pos + row);
avi23 2:d34c95990605 841 screen_map[barrier[i].x_pos + col][barrier[i].y_pos + row] = BARRIER;
avi23 2:d34c95990605 842 }
avi23 2:d34c95990605 843 }
avi23 2:d34c95990605 844 }
avi23 2:d34c95990605 845 //Copies the after array to the before array
avi23 2:d34c95990605 846 memcpy(barrier[i].before_bitmap, barrier[i].after_bitmap, sizeof(barrier[i].after_bitmap));
avi23 2:d34c95990605 847 }
avi23 2:d34c95990605 848 }
avi23 2:d34c95990605 849
avi23 2:d34c95990605 850 void ShiftInvaderXPositions()
avi23 2:d34c95990605 851 {
avi23 2:d34c95990605 852 if (invader_direction == RIGHT) {
avi23 2:d34c95990605 853 //Checks the first large invader to see if it can travel anymore
avi23 2:d34c95990605 854 if (large_invader[0].x_pos < maximum_invader_x_pos) {
avi23 2:d34c95990605 855 for (int i = 0; i < 5; i++) {
avi23 2:d34c95990605 856 small_invader[i].x_pos += 2;
avi23 2:d34c95990605 857 medium_invader[i].x_pos += 2;
avi23 2:d34c95990605 858 large_invader[i].x_pos += 2;
avi23 2:d34c95990605 859 }
avi23 2:d34c95990605 860 } else {
avi23 2:d34c95990605 861 ShiftInvaderYPositions(LEFT);
avi23 2:d34c95990605 862 }
avi23 2:d34c95990605 863 } else {
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 > minimum_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(RIGHT);
avi23 2:d34c95990605 873 }
avi23 2:d34c95990605 874 }
avi23 2:d34c95990605 875 }
avi23 2:d34c95990605 876
avi23 2:d34c95990605 877 void ShiftInvaderYPositions(bool new_direction)
avi23 2:d34c95990605 878 {
avi23 2:d34c95990605 879 //Checks to see which row of invaders are still alive to work out maximum y positions
avi23 2:d34c95990605 880 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 881 lowest_invader_row_alive = large;
avi23 2:d34c95990605 882 } 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 883 lowest_invader_row_alive = medium;
avi23 2:d34c95990605 884 } else {
avi23 2:d34c95990605 885 lowest_invader_row_alive = small;
avi23 2:d34c95990605 886 }
avi23 2:d34c95990605 887 //If an invader touches the bottom the game ends, otherwise the invaders descend
avi23 2:d34c95990605 888 if (small_invader[0].y_pos < 39 - (7*lowest_invader_row_alive)) {
avi23 2:d34c95990605 889 for (int i = 0; i < 5; i++) {
avi23 2:d34c95990605 890 small_invader[i].y_pos += 3;
avi23 2:d34c95990605 891 medium_invader[i].y_pos += 3;
avi23 2:d34c95990605 892 large_invader[i].y_pos += 3;
avi23 2:d34c95990605 893 invader_direction = new_direction;
avi23 2:d34c95990605 894 }
avi23 2:d34c95990605 895 } else {
avi23 2:d34c95990605 896 game_over = true;
avi23 2:d34c95990605 897 }
avi23 2:d34c95990605 898
avi23 2:d34c95990605 899 //TEST CODE
avi23 2:d34c95990605 900 down_count++;
avi23 2:d34c95990605 901 }
avi23 2:d34c95990605 902
avi23 2:d34c95990605 903 /*
avi23 2:d34c95990605 904 void InitUFO()
avi23 2:d34c95990605 905 {
avi23 2:d34c95990605 906
avi23 2:d34c95990605 907 }
avi23 2:d34c95990605 908 */
avi23 2:d34c95990605 909
avi23 2:d34c95990605 910 void DrawUFO()
avi23 2:d34c95990605 911 {
avi23 2:d34c95990605 912 //Draws the UFO
avi23 2:d34c95990605 913 int x_pos = 20;
avi23 2:d34c95990605 914 int y_pos = 25;
avi23 2:d34c95990605 915 for (int col = 0; col < col_no; col++) {
avi23 2:d34c95990605 916 for (int row = 0; row < row_no; row++) {
avi23 2:d34c95990605 917 if(ufo_bitmap[row][col]) {
avi23 2:d34c95990605 918 //lcd.setPixel(x_pos + col, y_pos + row);
avi23 2:d34c95990605 919 screen_map[x_pos + col][y_pos + row] = UFO;
avi23 2:d34c95990605 920 }
avi23 2:d34c95990605 921 }
avi23 2:d34c95990605 922 }
avi23 0:427469992efe 923 }