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

Dependencies:   Joystick N5110 SDFileSystem mbed

Committer:
avi23
Date:
Sun Mar 13 17:03:33 2016 +0000
Revision:
1:b300d052d549
Parent:
0:427469992efe
Child:
2:d34c95990605
All enemies are now visible and switch state every second

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 1:b300d052d549 7 */
avi23 0:427469992efe 8 #include "mbed.h"
avi23 0:427469992efe 9 #include "N5110.h"
avi23 0:427469992efe 10
avi23 0:427469992efe 11 #define EMPTY 0
avi23 0:427469992efe 12
avi23 0:427469992efe 13 //Joystick Class
avi23 0:427469992efe 14 class Joystick
avi23 0:427469992efe 15 {
avi23 0:427469992efe 16 public:
avi23 0:427469992efe 17 Joystick(PinName x_axis_pin, PinName y_axis_pin, PinName button_pin) {
avi23 0:427469992efe 18 //Dynamically allocates the pins
avi23 0:427469992efe 19 x_axis_ = new AnalogIn(x_axis_pin);
avi23 0:427469992efe 20 y_axis_ = new AnalogIn(y_axis_pin);
avi23 0:427469992efe 21 button_ = new InterruptIn(button_pin);
avi23 0:427469992efe 22 }
avi23 0:427469992efe 23
avi23 0:427469992efe 24 //Initalises the Joystick
avi23 0:427469992efe 25 //Sets up the ISRs and grabs the offsets for each axis
avi23 0:427469992efe 26 void init() {
avi23 0:427469992efe 27 //Sets up the button ISR
avi23 0:427469992efe 28 //DigitalOut* b = new DigitalOut(LED_BLUE);
avi23 0:427469992efe 29
avi23 0:427469992efe 30 button_->mode(PullUp);
avi23 0:427469992efe 31 //read_ticker_->attach(this, &Joystick::read_ticker_isr, time); //Samples joystick every second
avi23 0:427469992efe 32 button_->fall(this, &Joystick::button_isr);
avi23 0:427469992efe 33
avi23 0:427469992efe 34 //Initalises the vairables and flags
avi23 0:427469992efe 35 x_offset_ = 0;
avi23 0:427469992efe 36 y_offset_ = 0;
avi23 0:427469992efe 37 g_read_flag_ = 0;
avi23 0:427469992efe 38 g_button_flag_ = 0;
avi23 0:427469992efe 39
avi23 0:427469992efe 40 //Samples the joystick 5 times and takes an average to get the offset
avi23 0:427469992efe 41 float x_sum = 0;
avi23 0:427469992efe 42 float y_sum = 0;
avi23 0:427469992efe 43
avi23 0:427469992efe 44 for (int i = 0; i < 5; i++) {
avi23 0:427469992efe 45 x_sum += x_axis_->read();
avi23 0:427469992efe 46 y_sum += y_axis_->read();
avi23 0:427469992efe 47 }
avi23 0:427469992efe 48
avi23 0:427469992efe 49 x_offset_ = 0.5f - x_sum/5.0f;
avi23 0:427469992efe 50 y_offset_ = 0.5f - y_sum/5.0f;
avi23 0:427469992efe 51 }
avi23 0:427469992efe 52
avi23 0:427469992efe 53 //Take 5 readings and returns the average measurement, accounting for joystick offset x and y values
avi23 0:427469992efe 54 float GetXValue() {
avi23 0:427469992efe 55
avi23 0:427469992efe 56 float x_sum = 0;
avi23 0:427469992efe 57
avi23 0:427469992efe 58 for (int i = 0; i < 5; i++) {
avi23 0:427469992efe 59 x_sum += x_axis_->read();
avi23 0:427469992efe 60 }
avi23 0:427469992efe 61
avi23 0:427469992efe 62 float x_value = x_sum/5.0f + x_offset_;
avi23 0:427469992efe 63
avi23 0:427469992efe 64 //Caps the value for the POT between 0 and 1
avi23 0:427469992efe 65 if (x_value < 0.0f) {
avi23 0:427469992efe 66 return 0;
avi23 0:427469992efe 67 } else if (x_value > 1.0f) {
avi23 0:427469992efe 68 return 1;
avi23 0:427469992efe 69 } else {
avi23 0:427469992efe 70 return x_value;
avi23 0:427469992efe 71 }
avi23 0:427469992efe 72 }
avi23 0:427469992efe 73
avi23 0:427469992efe 74 float GetYValue() {
avi23 0:427469992efe 75
avi23 0:427469992efe 76 float y_sum = 0;
avi23 0:427469992efe 77
avi23 0:427469992efe 78 for (int i = 0; i < 5; i++) {
avi23 0:427469992efe 79 y_sum += y_axis_->read();
avi23 0:427469992efe 80 }
avi23 0:427469992efe 81
avi23 0:427469992efe 82 float y_value = y_sum/5.0f + y_offset_;
avi23 0:427469992efe 83
avi23 0:427469992efe 84 //Caps the value for the POT between 0 and 1
avi23 0:427469992efe 85 if (y_value < 0.0f) {
avi23 0:427469992efe 86 return 0;
avi23 0:427469992efe 87 } else if (y_value > 1.0f) {
avi23 0:427469992efe 88 return 1;
avi23 0:427469992efe 89 } else {
avi23 0:427469992efe 90 return y_value;
avi23 0:427469992efe 91 }
avi23 0:427469992efe 92 }
avi23 0:427469992efe 93
avi23 0:427469992efe 94 float ReadXAxis() {
avi23 0:427469992efe 95 return x_axis_->read();
avi23 0:427469992efe 96 }
avi23 0:427469992efe 97
avi23 0:427469992efe 98 float ReadYAxis() {
avi23 0:427469992efe 99 return y_axis_->read();
avi23 0:427469992efe 100 }
avi23 0:427469992efe 101
avi23 0:427469992efe 102 //Getter and setters for flags
avi23 0:427469992efe 103 int get_read_flag() {
avi23 0:427469992efe 104 return g_read_flag_;
avi23 0:427469992efe 105 }
avi23 0:427469992efe 106
avi23 0:427469992efe 107 void set_read_flag(int value) {
avi23 0:427469992efe 108 g_read_flag_ = value;
avi23 0:427469992efe 109 }
avi23 0:427469992efe 110
avi23 0:427469992efe 111 int get_button_flag() {
avi23 0:427469992efe 112 return g_button_flag_;
avi23 0:427469992efe 113 }
avi23 0:427469992efe 114
avi23 0:427469992efe 115 void set_button_flag(int value) {
avi23 0:427469992efe 116 g_button_flag_ = value;
avi23 0:427469992efe 117 }
avi23 0:427469992efe 118
avi23 0:427469992efe 119 //Ticker ISR Method
avi23 0:427469992efe 120 void read_ticker_isr() {
avi23 0:427469992efe 121 g_read_flag_ = 1;
avi23 0:427469992efe 122 }
avi23 0:427469992efe 123
avi23 0:427469992efe 124 private:
avi23 0:427469992efe 125 //Button ISR Method
avi23 0:427469992efe 126 void button_isr() {
avi23 0:427469992efe 127 g_button_flag_ = 1;
avi23 0:427469992efe 128 }
avi23 0:427469992efe 129
avi23 0:427469992efe 130 private:
avi23 0:427469992efe 131 //Pin inputs
avi23 0:427469992efe 132 AnalogIn* x_axis_;
avi23 0:427469992efe 133 AnalogIn* y_axis_;
avi23 0:427469992efe 134 InterruptIn* button_;
avi23 0:427469992efe 135
avi23 0:427469992efe 136 //Ticker
avi23 0:427469992efe 137 Ticker* read_ticker_;
avi23 0:427469992efe 138
avi23 0:427469992efe 139 //Stores X and Y offsets
avi23 0:427469992efe 140 float x_offset_;
avi23 0:427469992efe 141 float y_offset_;
avi23 0:427469992efe 142
avi23 0:427469992efe 143 //Stores interrupt flags
avi23 0:427469992efe 144 volatile int g_read_flag_;
avi23 0:427469992efe 145 volatile int g_button_flag_;
avi23 0:427469992efe 146 };
avi23 0:427469992efe 147
avi23 0:427469992efe 148 // K64F on-board LEDs
avi23 0:427469992efe 149 DigitalOut r_led(LED_RED);
avi23 0:427469992efe 150 DigitalOut g_led(LED_GREEN);
avi23 0:427469992efe 151 DigitalOut b_led(LED_BLUE);
avi23 0:427469992efe 152
avi23 0:427469992efe 153 // K64F on-board switches
avi23 0:427469992efe 154 InterruptIn sw2(SW2);
avi23 0:427469992efe 155 InterruptIn sw3(SW3);
avi23 0:427469992efe 156
avi23 0:427469992efe 157 // UART connection for PC
avi23 0:427469992efe 158 Serial pc(USBTX,USBRX);
avi23 0:427469992efe 159
avi23 0:427469992efe 160 //Joystick
avi23 0:427469992efe 161 Joystick joystick(PTC10, PTC11, PTB11);
avi23 0:427469992efe 162
avi23 0:427469992efe 163 //LCD object
avi23 0:427469992efe 164 // VCC, SCE, RST, D/C, MOSI, SCLK, LED
avi23 0:427469992efe 165 N5110 lcd (PTE26 , PTA0 , PTC4 , PTD0 , PTD2 , PTD1 , PTC3);
avi23 0:427469992efe 166
avi23 0:427469992efe 167 //Ship bit-map and location
avi23 1:b300d052d549 168 int cannon_xpos = 24;
avi23 1:b300d052d549 169 const int cannon_ypos = 43;
avi23 1:b300d052d549 170 Ticker move_cannon;
avi23 1:b300d052d549 171 const bool cannon_bitmap[5][9] = {
avi23 0:427469992efe 172 {0, 0, 0, 0, 1, 0, 0, 0, 0},
avi23 0:427469992efe 173 {0, 0, 0, 1, 1, 1, 0, 0, 0},
avi23 0:427469992efe 174 {0, 1, 1, 1, 1, 1, 1, 1, 0},
avi23 0:427469992efe 175 {1, 1, 1, 1, 1, 1, 1, 1, 1},
avi23 0:427469992efe 176 {1, 1, 1, 1, 1, 1, 1, 1, 1}
avi23 0:427469992efe 177 };
avi23 0:427469992efe 178
avi23 0:427469992efe 179 //Enemies
avi23 0:427469992efe 180 Ticker move_enemies;
avi23 1:b300d052d549 181 short screen[84][48];
avi23 1:b300d052d549 182 bool enemies_in_state2 = true;
avi23 1:b300d052d549 183 //Struct to store enemy data
avi23 1:b300d052d549 184 struct Enemies {
avi23 0:427469992efe 185 int x_pos;
avi23 0:427469992efe 186 int y_pos;
avi23 0:427469992efe 187 bool is_alive;
avi23 1:b300d052d549 188 } small_invader[6], medium_invader[6], large_invader[6];
avi23 0:427469992efe 189 int no_of_small_invaders = 6;
avi23 1:b300d052d549 190 int no_of_medium_invaders = 6;
avi23 1:b300d052d549 191 int no_of_large_invaders = 6;
avi23 1:b300d052d549 192 //Bitmaps for small invaders
avi23 0:427469992efe 193 const bool small_invader_bitmap_1[6][8] = {
avi23 0:427469992efe 194 {0, 0, 0, 1, 1, 0, 0, 0},
avi23 0:427469992efe 195 {0, 1, 1, 1, 1, 1, 1, 0},
avi23 0:427469992efe 196 {1, 1, 0, 1, 1, 0, 1, 1},
avi23 0:427469992efe 197 {1, 1, 1, 1, 1, 1, 1, 1},
avi23 0:427469992efe 198 {0, 1, 0, 1, 1, 0, 1, 0},
avi23 0:427469992efe 199 {1, 0, 1, 0, 0, 1, 0, 1}
avi23 0:427469992efe 200 };
avi23 0:427469992efe 201
avi23 0:427469992efe 202 const bool small_invader_bitmap_2[6][8] = {
avi23 0:427469992efe 203 {0, 0, 0, 1, 1, 0, 0, 0},
avi23 0:427469992efe 204 {0, 1, 1, 1, 1, 1, 1, 0},
avi23 0:427469992efe 205 {1, 1, 0, 1, 1, 0, 1, 1},
avi23 0:427469992efe 206 {1, 1, 1, 1, 1, 1, 1, 1},
avi23 0:427469992efe 207 {1, 0, 0, 0, 0, 0, 0, 1},
avi23 0:427469992efe 208 {0, 1, 0, 0, 0, 0, 1, 0}
avi23 0:427469992efe 209 };
avi23 1:b300d052d549 210 //Bitmaps for medium invaders
avi23 1:b300d052d549 211 const bool medium_invader_bitmap_1[6][10] = {
avi23 1:b300d052d549 212 {1, 0, 0, 1, 0, 0, 1, 0, 0, 1},
avi23 1:b300d052d549 213 {1, 0, 1, 1, 1, 1, 1, 1, 0, 1},
avi23 1:b300d052d549 214 {1, 1, 1, 0, 1, 1, 0, 1, 1, 1},
avi23 1:b300d052d549 215 {0, 1, 1, 1, 1, 1, 1, 1, 1, 0},
avi23 1:b300d052d549 216 {0, 0, 1, 0, 0, 0, 0, 1, 0, 0},
avi23 1:b300d052d549 217 {0, 1, 0, 0, 0, 0, 0, 0, 1, 0}
avi23 1:b300d052d549 218 };
avi23 1:b300d052d549 219
avi23 1:b300d052d549 220 const bool medium_invader_bitmap_2[6][10] = {
avi23 1:b300d052d549 221 {0, 0, 0, 1, 0, 0, 1, 0, 0, 0},
avi23 1:b300d052d549 222 {0, 0, 1, 1, 1, 1, 1, 1, 0, 0},
avi23 1:b300d052d549 223 {0, 1, 1, 0, 1, 1, 0, 1, 1, 0},
avi23 1:b300d052d549 224 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
avi23 1:b300d052d549 225 {1, 0, 1, 0, 0, 0, 0, 1, 0, 1},
avi23 1:b300d052d549 226 {0, 0, 0, 1, 1, 1, 1, 0, 0, 0}
avi23 1:b300d052d549 227 };
avi23 1:b300d052d549 228 //Bitmaps for large invaders
avi23 1:b300d052d549 229 const bool large_invader_bitmap_1[6][12] = {
avi23 1:b300d052d549 230 {0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0},
avi23 1:b300d052d549 231 {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},
avi23 1:b300d052d549 232 {1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1},
avi23 1:b300d052d549 233 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
avi23 1:b300d052d549 234 {0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0},
avi23 1:b300d052d549 235 {0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0}
avi23 1:b300d052d549 236 };
avi23 1:b300d052d549 237
avi23 1:b300d052d549 238 const bool large_invader_bitmap_2[6][12] = {
avi23 1:b300d052d549 239 {0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0},
avi23 1:b300d052d549 240 {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},
avi23 1:b300d052d549 241 {1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1},
avi23 1:b300d052d549 242 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
avi23 1:b300d052d549 243 {0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0},
avi23 1:b300d052d549 244 {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1}
avi23 1:b300d052d549 245 };
avi23 1:b300d052d549 246
avi23 1:b300d052d549 247 //int row_no = 6;
avi23 1:b300d052d549 248 //int col_no = 12;
avi23 0:427469992efe 249
avi23 0:427469992efe 250 //ISR Flags
avi23 0:427469992efe 251 volatile bool g_move_ship_flag = true;
avi23 0:427469992efe 252 volatile bool g_move_enemies_flag = true;
avi23 0:427469992efe 253
avi23 0:427469992efe 254 // function prototypes
avi23 0:427469992efe 255 // error function hangs flashing an LED
avi23 0:427469992efe 256 void error();
avi23 0:427469992efe 257 // setup serial port
avi23 0:427469992efe 258 void init_serial();
avi23 0:427469992efe 259 // set-up the on-board LEDs and switches
avi23 0:427469992efe 260 void init_K64F();
avi23 0:427469992efe 261 // Added functions
avi23 0:427469992efe 262 void MoveShip();
avi23 0:427469992efe 263 void InitSmallInvaders();
avi23 0:427469992efe 264 void DrawSmallInvaders();
avi23 1:b300d052d549 265 void InitMediumInvaders();
avi23 1:b300d052d549 266 void DrawMediumInvaders();
avi23 1:b300d052d549 267 void InitLargeInvaders();
avi23 1:b300d052d549 268 void DrawLargeInvaders();
avi23 0:427469992efe 269 //ISR's
avi23 0:427469992efe 270 void move_ship_isr();
avi23 0:427469992efe 271 void move_enemies_isr();
avi23 0:427469992efe 272
avi23 0:427469992efe 273
avi23 0:427469992efe 274
avi23 0:427469992efe 275 int main()
avi23 0:427469992efe 276 {
avi23 0:427469992efe 277 //Initalises the board and perhiperals
avi23 0:427469992efe 278 init_K64F();
avi23 0:427469992efe 279 init_serial();
avi23 0:427469992efe 280 lcd.init();
avi23 0:427469992efe 281 lcd.clear();
avi23 0:427469992efe 282
avi23 1:b300d052d549 283 move_cannon.attach(&move_ship_isr, 0.1);
avi23 0:427469992efe 284 move_enemies.attach(&move_enemies_isr, 1);
avi23 0:427469992efe 285
avi23 0:427469992efe 286 InitSmallInvaders();
avi23 1:b300d052d549 287 InitMediumInvaders();
avi23 1:b300d052d549 288 InitLargeInvaders();
avi23 1:b300d052d549 289
avi23 1:b300d052d549 290 int col = 0;
avi23 1:b300d052d549 291 int row = 0;
avi23 1:b300d052d549 292
avi23 1:b300d052d549 293 for (int i = 0; i < no_of_large_invaders; i++) {
avi23 1:b300d052d549 294 if (i == 0) {
avi23 1:b300d052d549 295 for (col = 0; col < 12; col++) {
avi23 1:b300d052d549 296 for (row = 0; row < 6; row++) {
avi23 1:b300d052d549 297 if(large_invader_bitmap_1[row][col]) {
avi23 1:b300d052d549 298 lcd.setPixel(large_invader[i].x_pos + col, large_invader[i].y_pos + row);
avi23 1:b300d052d549 299 }
avi23 1:b300d052d549 300 }
avi23 1:b300d052d549 301 }
avi23 1:b300d052d549 302 } else {
avi23 1:b300d052d549 303 for (col = 0; col < 12; col++) {
avi23 1:b300d052d549 304 for (row = 0; row < 6; row++) {
avi23 1:b300d052d549 305 if(large_invader_bitmap_2[row][col]) {
avi23 1:b300d052d549 306 lcd.setPixel(large_invader[i].x_pos + col, large_invader[i].y_pos + row);
avi23 1:b300d052d549 307 }
avi23 1:b300d052d549 308 }
avi23 1:b300d052d549 309 }
avi23 1:b300d052d549 310 }
avi23 1:b300d052d549 311 }
avi23 0:427469992efe 312
avi23 0:427469992efe 313 lcd.refresh();
avi23 0:427469992efe 314
avi23 0:427469992efe 315 while (true) {
avi23 1:b300d052d549 316
avi23 0:427469992efe 317 if (g_move_ship_flag) {
avi23 0:427469992efe 318 g_move_ship_flag = false;
avi23 0:427469992efe 319
avi23 0:427469992efe 320 MoveShip();
avi23 0:427469992efe 321
avi23 0:427469992efe 322 lcd.refresh();
avi23 0:427469992efe 323 }
avi23 0:427469992efe 324
avi23 0:427469992efe 325 if (g_move_enemies_flag) {
avi23 0:427469992efe 326 g_move_enemies_flag = false;
avi23 0:427469992efe 327
avi23 0:427469992efe 328 DrawSmallInvaders();
avi23 1:b300d052d549 329 DrawMediumInvaders();
avi23 1:b300d052d549 330 DrawLargeInvaders();
avi23 1:b300d052d549 331
avi23 1:b300d052d549 332 enemies_in_state2 = !enemies_in_state2;
avi23 0:427469992efe 333
avi23 0:427469992efe 334 lcd.refresh();
avi23 0:427469992efe 335 }
avi23 1:b300d052d549 336
avi23 0:427469992efe 337 sleep();
avi23 0:427469992efe 338 }
avi23 0:427469992efe 339 }
avi23 0:427469992efe 340
avi23 0:427469992efe 341 void init_K64F()
avi23 0:427469992efe 342 {
avi23 0:427469992efe 343 // on-board LEDs are active-low, so set pin high to turn them off.
avi23 0:427469992efe 344 r_led = 1;
avi23 0:427469992efe 345 g_led = 1;
avi23 0:427469992efe 346 b_led = 1;
avi23 0:427469992efe 347
avi23 0:427469992efe 348 // since the on-board switches have external pull-ups, we should disable the internal pull-down
avi23 0:427469992efe 349 // resistors that are enabled by default using InterruptIn
avi23 0:427469992efe 350 sw2.mode(PullNone);
avi23 0:427469992efe 351 sw3.mode(PullNone);
avi23 0:427469992efe 352
avi23 0:427469992efe 353 }
avi23 0:427469992efe 354
avi23 0:427469992efe 355 void error()
avi23 0:427469992efe 356 {
avi23 0:427469992efe 357 while(1) { // if error, hang while flashing error message
avi23 0:427469992efe 358 r_led = 0;
avi23 0:427469992efe 359 wait(0.2);
avi23 0:427469992efe 360 r_led = 1;
avi23 0:427469992efe 361 wait(0.2);
avi23 0:427469992efe 362 }
avi23 0:427469992efe 363 }
avi23 0:427469992efe 364
avi23 0:427469992efe 365 void init_serial()
avi23 0:427469992efe 366 {
avi23 0:427469992efe 367 // set to highest baud - ensure terminal software matches
avi23 0:427469992efe 368 pc.baud(115200);
avi23 0:427469992efe 369 }
avi23 0:427469992efe 370
avi23 0:427469992efe 371 void move_ship_isr()
avi23 0:427469992efe 372 {
avi23 0:427469992efe 373 g_move_ship_flag = true;
avi23 0:427469992efe 374 }
avi23 0:427469992efe 375
avi23 0:427469992efe 376 void MoveShip()
avi23 0:427469992efe 377 {
avi23 0:427469992efe 378 //Clears the ship
avi23 0:427469992efe 379 for (int col = 0; col < 9; col++) {
avi23 0:427469992efe 380 for (int row = 0; row < 5; row++) {
avi23 1:b300d052d549 381 if(cannon_bitmap[row][col]) {
avi23 1:b300d052d549 382 lcd.clearPixel(cannon_xpos+col, cannon_ypos+row);
avi23 0:427469992efe 383 }
avi23 0:427469992efe 384 }
avi23 0:427469992efe 385 }
avi23 0:427469992efe 386
avi23 0:427469992efe 387 //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 388 if (joystick.GetXValue() < 0.25f) {
avi23 1:b300d052d549 389 cannon_xpos--;
avi23 1:b300d052d549 390 if (cannon_xpos < 0) {
avi23 1:b300d052d549 391 cannon_xpos = 0;
avi23 0:427469992efe 392 }
avi23 0:427469992efe 393 } else if (joystick.GetXValue() > 0.75f) {
avi23 1:b300d052d549 394 cannon_xpos++;
avi23 1:b300d052d549 395 if (cannon_xpos > 75) {
avi23 1:b300d052d549 396 cannon_xpos = 75;
avi23 0:427469992efe 397 }
avi23 0:427469992efe 398 }
avi23 0:427469992efe 399
avi23 0:427469992efe 400 //Redraws the ship
avi23 0:427469992efe 401 for (int col = 0; col < 9; col++) {
avi23 0:427469992efe 402 for (int row = 0; row < 5; row++) {
avi23 1:b300d052d549 403 if(cannon_bitmap[row][col]) {
avi23 1:b300d052d549 404 lcd.setPixel(cannon_xpos+col, cannon_ypos+row);
avi23 0:427469992efe 405 }
avi23 0:427469992efe 406 }
avi23 0:427469992efe 407 }
avi23 0:427469992efe 408 }
avi23 0:427469992efe 409
avi23 0:427469992efe 410 void move_enemies_isr()
avi23 0:427469992efe 411 {
avi23 0:427469992efe 412 g_move_enemies_flag = true;
avi23 0:427469992efe 413 }
avi23 0:427469992efe 414
avi23 0:427469992efe 415 //Sets the position and aliveness of the small invaders
avi23 0:427469992efe 416 void InitSmallInvaders()
avi23 0:427469992efe 417 {
avi23 0:427469992efe 418 for (int i = 0; i < no_of_small_invaders; i++) {
avi23 1:b300d052d549 419 small_invader[i].x_pos = 2+ (i*13);
avi23 0:427469992efe 420 small_invader[i].y_pos = 7;
avi23 0:427469992efe 421 small_invader[i].is_alive = true;
avi23 0:427469992efe 422 }
avi23 0:427469992efe 423 }
avi23 0:427469992efe 424
avi23 0:427469992efe 425 void DrawSmallInvaders()
avi23 0:427469992efe 426 {
avi23 0:427469992efe 427 //For each small invader clear and redraws them if they're alive
avi23 0:427469992efe 428 for (int i = 0; i < no_of_small_invaders; i++) {
avi23 0:427469992efe 429 //Clears the enemy position
avi23 0:427469992efe 430 lcd.drawRect(small_invader[i].x_pos, small_invader[i].y_pos, 8, 6, 2);
avi23 0:427469992efe 431
avi23 0:427469992efe 432 //Checks if the invader is alive
avi23 0:427469992efe 433 if (small_invader[i].is_alive) {
avi23 0:427469992efe 434 //Reads off the bitmap and sets the allowed pixels
avi23 0:427469992efe 435 int col = 0;
avi23 0:427469992efe 436 int row = 0;
avi23 0:427469992efe 437 //Flips the bitmap everytime the function is called
avi23 1:b300d052d549 438 if (enemies_in_state2) {
avi23 1:b300d052d549 439 for (col = 0; col < 8; col++) {
avi23 1:b300d052d549 440 for (row = 0; row < 6; row++) {
avi23 0:427469992efe 441 if(small_invader_bitmap_1[row][col]) {
avi23 0:427469992efe 442 lcd.setPixel(small_invader[i].x_pos + col, small_invader[i].y_pos + row);
avi23 0:427469992efe 443 }
avi23 0:427469992efe 444 }
avi23 0:427469992efe 445 }
avi23 0:427469992efe 446 } else {
avi23 1:b300d052d549 447 for (col = 0; col < 8; col++) {
avi23 1:b300d052d549 448 for (row = 0; row < 6; row++) {
avi23 0:427469992efe 449 if(small_invader_bitmap_2[row][col]) {
avi23 0:427469992efe 450 lcd.setPixel(small_invader[i].x_pos + col, small_invader[i].y_pos + row);
avi23 0:427469992efe 451 }
avi23 0:427469992efe 452 }
avi23 0:427469992efe 453 }
avi23 0:427469992efe 454 }
avi23 0:427469992efe 455 }
avi23 0:427469992efe 456 }
avi23 1:b300d052d549 457 }
avi23 1:b300d052d549 458
avi23 1:b300d052d549 459 //Sets the position and aliveness of the medium invaders
avi23 1:b300d052d549 460 void InitMediumInvaders()
avi23 1:b300d052d549 461 {
avi23 1:b300d052d549 462 for (int i = 0; i < no_of_medium_invaders; i++) {
avi23 1:b300d052d549 463 medium_invader[i].x_pos = 1 + (i*13);
avi23 1:b300d052d549 464 medium_invader[i].y_pos = 15;
avi23 1:b300d052d549 465 medium_invader[i].is_alive = true;
avi23 1:b300d052d549 466 }
avi23 1:b300d052d549 467 }
avi23 1:b300d052d549 468
avi23 1:b300d052d549 469 void DrawMediumInvaders()
avi23 1:b300d052d549 470 {
avi23 1:b300d052d549 471 //For each small invader clear and redraws them if they're alive
avi23 1:b300d052d549 472 for (int i = 0; i < no_of_medium_invaders; i++) {
avi23 1:b300d052d549 473 //Clears the enemy position
avi23 1:b300d052d549 474 lcd.drawRect(medium_invader[i].x_pos, medium_invader[i].y_pos, 10, 6, 2);
avi23 1:b300d052d549 475
avi23 1:b300d052d549 476 //Checks if the invader is alive
avi23 1:b300d052d549 477 if (medium_invader[i].is_alive) {
avi23 1:b300d052d549 478 //Reads off the bitmap and sets the allowed pixels
avi23 1:b300d052d549 479 int col = 0;
avi23 1:b300d052d549 480 int row = 0;
avi23 1:b300d052d549 481 //Flips the bitmap everytime the function is called
avi23 1:b300d052d549 482 if (enemies_in_state2) {
avi23 1:b300d052d549 483 for (col = 0; col < 10; col++) {
avi23 1:b300d052d549 484 for (row = 0; row < 6; row++) {
avi23 1:b300d052d549 485 if(medium_invader_bitmap_1[row][col]) {
avi23 1:b300d052d549 486 lcd.setPixel(medium_invader[i].x_pos + col, medium_invader[i].y_pos + row);
avi23 1:b300d052d549 487 }
avi23 1:b300d052d549 488 }
avi23 1:b300d052d549 489 }
avi23 1:b300d052d549 490 } else {
avi23 1:b300d052d549 491 for (col = 0; col < 10; col++) {
avi23 1:b300d052d549 492 for (row = 0; row < 6; row++) {
avi23 1:b300d052d549 493 if(medium_invader_bitmap_2[row][col]) {
avi23 1:b300d052d549 494 lcd.setPixel(medium_invader[i].x_pos + col, medium_invader[i].y_pos + row);
avi23 1:b300d052d549 495 }
avi23 1:b300d052d549 496 }
avi23 1:b300d052d549 497 }
avi23 1:b300d052d549 498 }
avi23 1:b300d052d549 499 }
avi23 1:b300d052d549 500 }
avi23 1:b300d052d549 501 }
avi23 1:b300d052d549 502
avi23 1:b300d052d549 503 //Sets the position and aliveness of the large invaders
avi23 1:b300d052d549 504 void InitLargeInvaders()
avi23 1:b300d052d549 505 {
avi23 1:b300d052d549 506 for (int i = 0; i < no_of_large_invaders; i++) {
avi23 1:b300d052d549 507 large_invader[i].x_pos = 0 + (i*13);
avi23 1:b300d052d549 508 large_invader[i].y_pos = 23;
avi23 1:b300d052d549 509 large_invader[i].is_alive = true;
avi23 1:b300d052d549 510 }
avi23 1:b300d052d549 511 }
avi23 1:b300d052d549 512
avi23 1:b300d052d549 513 void DrawLargeInvaders()
avi23 1:b300d052d549 514 {
avi23 1:b300d052d549 515 //For each small invader clear and redraws them if they're alive
avi23 1:b300d052d549 516 for (int i = 0; i < no_of_large_invaders; i++) {
avi23 1:b300d052d549 517 //Clears the enemy position
avi23 1:b300d052d549 518 lcd.drawRect(large_invader[i].x_pos, large_invader[i].y_pos, 12, 6, 2);
avi23 1:b300d052d549 519
avi23 1:b300d052d549 520 //Checks if the invader is alive
avi23 1:b300d052d549 521 if (large_invader[i].is_alive) {
avi23 1:b300d052d549 522 //Reads off the bitmap and sets the allowed pixels
avi23 1:b300d052d549 523 int col = 0;
avi23 1:b300d052d549 524 int row = 0;
avi23 1:b300d052d549 525 //Flips the bitmap everytime the function is called
avi23 1:b300d052d549 526 if (enemies_in_state2) {
avi23 1:b300d052d549 527 for (col = 0; col < 12; col++) {
avi23 1:b300d052d549 528 for (row = 0; row < 6; row++) {
avi23 1:b300d052d549 529 if(large_invader_bitmap_1[row][col]) {
avi23 1:b300d052d549 530 lcd.setPixel(large_invader[i].x_pos + col, large_invader[i].y_pos + row);
avi23 1:b300d052d549 531 }
avi23 1:b300d052d549 532 }
avi23 1:b300d052d549 533 }
avi23 1:b300d052d549 534 } else {
avi23 1:b300d052d549 535 for (col = 0; col < 12; col++) {
avi23 1:b300d052d549 536 for (row = 0; row < 6; row++) {
avi23 1:b300d052d549 537 if(large_invader_bitmap_2[row][col]) {
avi23 1:b300d052d549 538 lcd.setPixel(large_invader[i].x_pos + col, large_invader[i].y_pos + row);
avi23 1:b300d052d549 539 }
avi23 1:b300d052d549 540 }
avi23 1:b300d052d549 541 }
avi23 1:b300d052d549 542 }
avi23 1:b300d052d549 543 }
avi23 1:b300d052d549 544 }
avi23 0:427469992efe 545 }