![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
Asteroids for MBED game with Bluetooth LE UART Friend Controller, uLCD, speaker, and uSD.
Dependencies: 4DGL-uLCD-SE mbed-rtos mbed
Asteroids for MBED game with Bluetooth LE UART Friend Controller
main.cpp@10:6bb7504e0f5a, 2016-03-12 (annotated)
- Committer:
- agamemaker
- Date:
- Sat Mar 12 21:11:19 2016 +0000
- Revision:
- 10:6bb7504e0f5a
- Parent:
- 9:49f4b9dcab22
- Child:
- 11:d707cebe6eff
almost finished
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
agamemaker | 0:16094a49131e | 1 | #include "mbed.h" |
agamemaker | 0:16094a49131e | 2 | #include "rtos.h" |
agamemaker | 0:16094a49131e | 3 | #include "uLCD_4DGL.h" |
agamemaker | 1:0328ad927150 | 4 | #include <math.h> |
agamemaker | 1:0328ad927150 | 5 | #include <list> |
agamemaker | 9:49f4b9dcab22 | 6 | #include <time.h> |
agamemaker | 7:ff87ab834590 | 7 | #include "SongPlayer.h" |
agamemaker | 1:0328ad927150 | 8 | using namespace std; |
agamemaker | 3:14a2729625f6 | 9 | |
agamemaker | 2:332ca4f1a3e3 | 10 | //constants |
agamemaker | 3:14a2729625f6 | 11 | #define ACCEL .5 |
agamemaker | 9:49f4b9dcab22 | 12 | #define ROTTA .3 |
agamemaker | 7:ff87ab834590 | 13 | #define MAXSP 7 |
agamemaker | 7:ff87ab834590 | 14 | #define BULSP 10 |
agamemaker | 9:49f4b9dcab22 | 15 | #define ASTSP 3 |
agamemaker | 9:49f4b9dcab22 | 16 | #define PI 3.14159265359 |
agamemaker | 3:14a2729625f6 | 17 | |
agamemaker | 2:332ca4f1a3e3 | 18 | //devices |
agamemaker | 5:f41d3bfc6701 | 19 | //DigitalOut myled(LED1); |
agamemaker | 2:332ca4f1a3e3 | 20 | uLCD_4DGL ulcd(p28,p27,p29); |
agamemaker | 5:f41d3bfc6701 | 21 | BusOut myled(LED1,LED2,LED3,LED4); |
agamemaker | 5:f41d3bfc6701 | 22 | Serial blue(p13,p14); |
agamemaker | 9:49f4b9dcab22 | 23 | SongPlayer myspkr(p26); |
agamemaker | 10:6bb7504e0f5a | 24 | Mutex stdio_mutex; |
agamemaker | 5:f41d3bfc6701 | 25 | |
agamemaker | 5:f41d3bfc6701 | 26 | //Globals |
agamemaker | 5:f41d3bfc6701 | 27 | int game_speed = 25; |
agamemaker | 5:f41d3bfc6701 | 28 | bool up = 0; |
agamemaker | 5:f41d3bfc6701 | 29 | bool left = 0; |
agamemaker | 5:f41d3bfc6701 | 30 | bool right = 0; |
agamemaker | 6:7d1d8945b2f7 | 31 | bool stop = 0; |
agamemaker | 5:f41d3bfc6701 | 32 | bool four = 0; |
agamemaker | 9:49f4b9dcab22 | 33 | bool colsound = 0; |
agamemaker | 9:49f4b9dcab22 | 34 | int lives = 3; |
agamemaker | 10:6bb7504e0f5a | 35 | int round = 0; |
agamemaker | 0:16094a49131e | 36 | |
agamemaker | 0:16094a49131e | 37 | class Movement |
agamemaker | 0:16094a49131e | 38 | { |
agamemaker | 1:0328ad927150 | 39 | public: |
agamemaker | 1:0328ad927150 | 40 | double x_pos; // x position of object |
agamemaker | 1:0328ad927150 | 41 | double y_pos; // |
agamemaker | 1:0328ad927150 | 42 | double x_vel; // x velocity of object |
agamemaker | 1:0328ad927150 | 43 | double y_vel; // |
agamemaker | 1:0328ad927150 | 44 | double angle; // angle of object |
agamemaker | 1:0328ad927150 | 45 | int hit_rad; // hit box radius of object |
agamemaker | 1:0328ad927150 | 46 | bool wrap; |
agamemaker | 1:0328ad927150 | 47 | Movement(double xp,double yp,double xv,double yv,double a,double r,double w); |
agamemaker | 6:7d1d8945b2f7 | 48 | void assign(double xp,double yp,double xv,double yv,double a,double r,double w); |
agamemaker | 6:7d1d8945b2f7 | 49 | //void move(); |
agamemaker | 1:0328ad927150 | 50 | void accelerate(); |
agamemaker | 3:14a2729625f6 | 51 | void turn_left(); |
agamemaker | 3:14a2729625f6 | 52 | void turn_right(); |
agamemaker | 1:0328ad927150 | 53 | |
agamemaker | 0:16094a49131e | 54 | }; |
agamemaker | 0:16094a49131e | 55 | |
agamemaker | 1:0328ad927150 | 56 | Movement::Movement(double xp,double yp,double xv,double yv,double a,double r,double w) |
agamemaker | 1:0328ad927150 | 57 | { |
agamemaker | 1:0328ad927150 | 58 | x_pos = xp; |
agamemaker | 1:0328ad927150 | 59 | y_pos = yp; |
agamemaker | 1:0328ad927150 | 60 | x_vel = xv; |
agamemaker | 1:0328ad927150 | 61 | y_vel = yv; |
agamemaker | 1:0328ad927150 | 62 | angle = a; |
agamemaker | 1:0328ad927150 | 63 | hit_rad = r; |
agamemaker | 1:0328ad927150 | 64 | wrap = w; |
agamemaker | 1:0328ad927150 | 65 | } |
agamemaker | 1:0328ad927150 | 66 | |
agamemaker | 6:7d1d8945b2f7 | 67 | void Movement::assign(double xp,double yp,double xv,double yv,double a,double r,double w) |
agamemaker | 6:7d1d8945b2f7 | 68 | { |
agamemaker | 6:7d1d8945b2f7 | 69 | x_pos = xp; |
agamemaker | 6:7d1d8945b2f7 | 70 | y_pos = yp; |
agamemaker | 6:7d1d8945b2f7 | 71 | x_vel = xv; |
agamemaker | 6:7d1d8945b2f7 | 72 | y_vel = yv; |
agamemaker | 6:7d1d8945b2f7 | 73 | angle = a; |
agamemaker | 6:7d1d8945b2f7 | 74 | hit_rad = r; |
agamemaker | 6:7d1d8945b2f7 | 75 | wrap = w; |
agamemaker | 6:7d1d8945b2f7 | 76 | } |
agamemaker | 1:0328ad927150 | 77 | |
agamemaker | 6:7d1d8945b2f7 | 78 | /*void Movement::move() |
agamemaker | 1:0328ad927150 | 79 | { |
agamemaker | 1:0328ad927150 | 80 | x_pos += x_vel; |
agamemaker | 1:0328ad927150 | 81 | y_pos += y_vel; |
agamemaker | 6:7d1d8945b2f7 | 82 | if(x_pos < 0 || x_pos > 144 || y_pos < 0 || y_pos > 144) { |
agamemaker | 2:332ca4f1a3e3 | 83 | if(wrap) { |
agamemaker | 3:14a2729625f6 | 84 | x_pos += 144*(1 - ceil(x_pos/144)); |
agamemaker | 3:14a2729625f6 | 85 | y_pos += 144*(1 - ceil(y_pos/144)); |
agamemaker | 2:332ca4f1a3e3 | 86 | } else { |
agamemaker | 6:7d1d8945b2f7 | 87 | } |
agamemaker | 2:332ca4f1a3e3 | 88 | } |
agamemaker | 6:7d1d8945b2f7 | 89 | }*/ |
agamemaker | 1:0328ad927150 | 90 | |
agamemaker | 1:0328ad927150 | 91 | void Movement::accelerate() |
agamemaker | 1:0328ad927150 | 92 | { |
agamemaker | 2:332ca4f1a3e3 | 93 | x_vel += ACCEL * cos(angle); |
agamemaker | 2:332ca4f1a3e3 | 94 | y_vel += ACCEL * sin(angle); |
agamemaker | 5:f41d3bfc6701 | 95 | if(sqrt(pow(x_vel,2) + pow(y_vel,2)) > MAXSP) { |
agamemaker | 5:f41d3bfc6701 | 96 | x_vel = x_vel * MAXSP / sqrt(pow(x_vel,2) + pow(y_vel,2)); |
agamemaker | 5:f41d3bfc6701 | 97 | y_vel = y_vel * MAXSP / sqrt(pow(x_vel,2) + pow(y_vel,2)); |
agamemaker | 1:0328ad927150 | 98 | } |
agamemaker | 1:0328ad927150 | 99 | } |
agamemaker | 1:0328ad927150 | 100 | |
agamemaker | 6:7d1d8945b2f7 | 101 | void Movement::turn_left() |
agamemaker | 6:7d1d8945b2f7 | 102 | { |
agamemaker | 3:14a2729625f6 | 103 | angle -= ROTTA; |
agamemaker | 3:14a2729625f6 | 104 | } |
agamemaker | 3:14a2729625f6 | 105 | |
agamemaker | 6:7d1d8945b2f7 | 106 | void Movement::turn_right() |
agamemaker | 6:7d1d8945b2f7 | 107 | { |
agamemaker | 3:14a2729625f6 | 108 | angle += ROTTA; |
agamemaker | 3:14a2729625f6 | 109 | } |
agamemaker | 5:f41d3bfc6701 | 110 | |
agamemaker | 5:f41d3bfc6701 | 111 | //Threads |
agamemaker | 9:49f4b9dcab22 | 112 | //Speaker |
agamemaker | 9:49f4b9dcab22 | 113 | void crash(void const *args) |
agamemaker | 9:49f4b9dcab22 | 114 | { |
agamemaker | 9:49f4b9dcab22 | 115 | while(1) { |
agamemaker | 9:49f4b9dcab22 | 116 | if(colsound) { |
agamemaker | 9:49f4b9dcab22 | 117 | float note = 1568.0; |
agamemaker | 9:49f4b9dcab22 | 118 | float durration = .5; |
agamemaker | 9:49f4b9dcab22 | 119 | myspkr.PlaySong(¬e, &durration); |
agamemaker | 9:49f4b9dcab22 | 120 | colsound = 0; |
agamemaker | 9:49f4b9dcab22 | 121 | } |
agamemaker | 9:49f4b9dcab22 | 122 | } |
agamemaker | 9:49f4b9dcab22 | 123 | } |
agamemaker | 9:49f4b9dcab22 | 124 | |
agamemaker | 5:f41d3bfc6701 | 125 | //Controls |
agamemaker | 5:f41d3bfc6701 | 126 | int read_getc(Serial &blue) |
agamemaker | 5:f41d3bfc6701 | 127 | { |
agamemaker | 6:7d1d8945b2f7 | 128 | while(!blue.readable()) { |
agamemaker | 5:f41d3bfc6701 | 129 | Thread::yield(); |
agamemaker | 5:f41d3bfc6701 | 130 | } |
agamemaker | 5:f41d3bfc6701 | 131 | return blue.getc(); |
agamemaker | 5:f41d3bfc6701 | 132 | } |
agamemaker | 5:f41d3bfc6701 | 133 | |
agamemaker | 5:f41d3bfc6701 | 134 | void controls(void const *args) |
agamemaker | 5:f41d3bfc6701 | 135 | { |
agamemaker | 10:6bb7504e0f5a | 136 | stdio_mutex.lock(); |
agamemaker | 5:f41d3bfc6701 | 137 | char bnum=0; |
agamemaker | 5:f41d3bfc6701 | 138 | char bhit=0; |
agamemaker | 5:f41d3bfc6701 | 139 | while(1) { |
agamemaker | 6:7d1d8945b2f7 | 140 | //Thread::wait(100); |
agamemaker | 5:f41d3bfc6701 | 141 | if (read_getc(blue)=='!') { |
agamemaker | 5:f41d3bfc6701 | 142 | if (read_getc(blue)=='B') { //button data packet |
agamemaker | 5:f41d3bfc6701 | 143 | bnum = read_getc(blue); //button number |
agamemaker | 5:f41d3bfc6701 | 144 | bhit = read_getc(blue); //1=hit, 0=release |
agamemaker | 5:f41d3bfc6701 | 145 | if (read_getc(blue)==char(~('!' + 'B' + bnum + bhit))) { //checksum OK? |
agamemaker | 5:f41d3bfc6701 | 146 | myled = bnum - '0'; //current button number will appear on LEDs |
agamemaker | 5:f41d3bfc6701 | 147 | switch (bnum) { |
agamemaker | 5:f41d3bfc6701 | 148 | case '1': //number button 1 |
agamemaker | 5:f41d3bfc6701 | 149 | if (bhit=='1') { |
agamemaker | 6:7d1d8945b2f7 | 150 | game_speed = 25; |
agamemaker | 5:f41d3bfc6701 | 151 | } else { |
agamemaker | 5:f41d3bfc6701 | 152 | //add release code here |
agamemaker | 5:f41d3bfc6701 | 153 | } |
agamemaker | 5:f41d3bfc6701 | 154 | break; |
agamemaker | 5:f41d3bfc6701 | 155 | case '2': //number button 2 |
agamemaker | 5:f41d3bfc6701 | 156 | if (bhit=='1') { |
agamemaker | 6:7d1d8945b2f7 | 157 | game_speed = 100; |
agamemaker | 5:f41d3bfc6701 | 158 | } else { |
agamemaker | 5:f41d3bfc6701 | 159 | //add release code here |
agamemaker | 5:f41d3bfc6701 | 160 | } |
agamemaker | 5:f41d3bfc6701 | 161 | break; |
agamemaker | 5:f41d3bfc6701 | 162 | case '3': //number button 3 |
agamemaker | 5:f41d3bfc6701 | 163 | if (bhit=='1') { |
agamemaker | 5:f41d3bfc6701 | 164 | //add hit code here |
agamemaker | 5:f41d3bfc6701 | 165 | } else { |
agamemaker | 5:f41d3bfc6701 | 166 | //add release code here |
agamemaker | 5:f41d3bfc6701 | 167 | } |
agamemaker | 5:f41d3bfc6701 | 168 | break; |
agamemaker | 5:f41d3bfc6701 | 169 | case '4': //number button 4 |
agamemaker | 5:f41d3bfc6701 | 170 | if (bhit=='1') { |
agamemaker | 6:7d1d8945b2f7 | 171 | four = 1; |
agamemaker | 5:f41d3bfc6701 | 172 | } else { |
agamemaker | 6:7d1d8945b2f7 | 173 | four = 0; |
agamemaker | 5:f41d3bfc6701 | 174 | } |
agamemaker | 5:f41d3bfc6701 | 175 | break; |
agamemaker | 5:f41d3bfc6701 | 176 | case '5': //button 5 up arrow |
agamemaker | 5:f41d3bfc6701 | 177 | if (bhit=='1') { |
agamemaker | 6:7d1d8945b2f7 | 178 | up = 1; |
agamemaker | 5:f41d3bfc6701 | 179 | } else { |
agamemaker | 6:7d1d8945b2f7 | 180 | up = 0; |
agamemaker | 6:7d1d8945b2f7 | 181 | } |
agamemaker | 6:7d1d8945b2f7 | 182 | break; |
agamemaker | 6:7d1d8945b2f7 | 183 | case '6': //button 6 down arrow |
agamemaker | 6:7d1d8945b2f7 | 184 | if (bhit=='1') { |
agamemaker | 6:7d1d8945b2f7 | 185 | stop = 1; |
agamemaker | 6:7d1d8945b2f7 | 186 | } else { |
agamemaker | 6:7d1d8945b2f7 | 187 | stop = 0; |
agamemaker | 5:f41d3bfc6701 | 188 | } |
agamemaker | 5:f41d3bfc6701 | 189 | break; |
agamemaker | 5:f41d3bfc6701 | 190 | case '7': //button 7 left arrow |
agamemaker | 5:f41d3bfc6701 | 191 | if (bhit=='1') { |
agamemaker | 6:7d1d8945b2f7 | 192 | left = 1; |
agamemaker | 5:f41d3bfc6701 | 193 | } else { |
agamemaker | 6:7d1d8945b2f7 | 194 | left = 0; |
agamemaker | 5:f41d3bfc6701 | 195 | } |
agamemaker | 7:ff87ab834590 | 196 | break; |
agamemaker | 5:f41d3bfc6701 | 197 | case '8': //button 8 right arrow |
agamemaker | 5:f41d3bfc6701 | 198 | if (bhit=='1') { |
agamemaker | 6:7d1d8945b2f7 | 199 | right = 1; |
agamemaker | 5:f41d3bfc6701 | 200 | } else { |
agamemaker | 6:7d1d8945b2f7 | 201 | right = 0; |
agamemaker | 5:f41d3bfc6701 | 202 | } |
agamemaker | 5:f41d3bfc6701 | 203 | break; |
agamemaker | 5:f41d3bfc6701 | 204 | default: |
agamemaker | 5:f41d3bfc6701 | 205 | break; |
agamemaker | 5:f41d3bfc6701 | 206 | } |
agamemaker | 5:f41d3bfc6701 | 207 | } |
agamemaker | 5:f41d3bfc6701 | 208 | } |
agamemaker | 5:f41d3bfc6701 | 209 | } |
agamemaker | 5:f41d3bfc6701 | 210 | } |
agamemaker | 10:6bb7504e0f5a | 211 | stdio_mutex.unlock(); |
agamemaker | 5:f41d3bfc6701 | 212 | } |
agamemaker | 6:7d1d8945b2f7 | 213 | |
agamemaker | 6:7d1d8945b2f7 | 214 | void move(Movement &p) |
agamemaker | 6:7d1d8945b2f7 | 215 | { |
agamemaker | 6:7d1d8945b2f7 | 216 | p.x_pos += p.x_vel; |
agamemaker | 6:7d1d8945b2f7 | 217 | p.y_pos += p.y_vel; |
agamemaker | 6:7d1d8945b2f7 | 218 | if(p.x_pos < 0 || p.x_pos > 144 || p.y_pos < 0 || p.y_pos > 144) { |
agamemaker | 6:7d1d8945b2f7 | 219 | if(p.wrap) { |
agamemaker | 6:7d1d8945b2f7 | 220 | p.x_pos += 144*(1 - ceil(p.x_pos/144)); |
agamemaker | 6:7d1d8945b2f7 | 221 | p.y_pos += 144*(1 - ceil(p.y_pos/144)); |
agamemaker | 6:7d1d8945b2f7 | 222 | } else { |
agamemaker | 6:7d1d8945b2f7 | 223 | } |
agamemaker | 6:7d1d8945b2f7 | 224 | } |
agamemaker | 6:7d1d8945b2f7 | 225 | } |
agamemaker | 9:49f4b9dcab22 | 226 | //game_over |
agamemaker | 9:49f4b9dcab22 | 227 | void game_over() |
agamemaker | 9:49f4b9dcab22 | 228 | { |
agamemaker | 10:6bb7504e0f5a | 229 | stdio_mutex.lock(); |
agamemaker | 9:49f4b9dcab22 | 230 | ulcd.cls(); |
agamemaker | 9:49f4b9dcab22 | 231 | ulcd.printf("GAME OVER"); |
agamemaker | 9:49f4b9dcab22 | 232 | wait(3); |
agamemaker | 9:49f4b9dcab22 | 233 | ulcd.cls(); |
agamemaker | 9:49f4b9dcab22 | 234 | lives = 3; |
agamemaker | 9:49f4b9dcab22 | 235 | ulcd.printf("%d",lives); |
agamemaker | 10:6bb7504e0f5a | 236 | stdio_mutex.unlock(); |
agamemaker | 6:7d1d8945b2f7 | 237 | |
agamemaker | 9:49f4b9dcab22 | 238 | } |
agamemaker | 6:7d1d8945b2f7 | 239 | //move |
agamemaker | 6:7d1d8945b2f7 | 240 | void move_all(Movement &player, list<Movement> &asteroids, list<Movement> &bullets) |
agamemaker | 6:7d1d8945b2f7 | 241 | { |
agamemaker | 6:7d1d8945b2f7 | 242 | move(player); |
agamemaker | 6:7d1d8945b2f7 | 243 | list<Movement>::iterator iterator; |
agamemaker | 6:7d1d8945b2f7 | 244 | for (iterator = asteroids.begin(); iterator != asteroids.end(); ++iterator) { |
agamemaker | 6:7d1d8945b2f7 | 245 | move(*iterator); |
agamemaker | 6:7d1d8945b2f7 | 246 | } |
agamemaker | 7:ff87ab834590 | 247 | for (iterator = bullets.begin(); iterator != bullets.end(); ++iterator) { |
agamemaker | 7:ff87ab834590 | 248 | move(*iterator); |
agamemaker | 7:ff87ab834590 | 249 | } |
agamemaker | 7:ff87ab834590 | 250 | } |
agamemaker | 7:ff87ab834590 | 251 | |
agamemaker | 7:ff87ab834590 | 252 | //garbage |
agamemaker | 7:ff87ab834590 | 253 | void garbage(list<Movement> &bullets) |
agamemaker | 7:ff87ab834590 | 254 | { |
agamemaker | 7:ff87ab834590 | 255 | bool del = 0; |
agamemaker | 7:ff87ab834590 | 256 | list<Movement>::iterator iterator; |
agamemaker | 7:ff87ab834590 | 257 | list<Movement>::iterator itcpy; |
agamemaker | 7:ff87ab834590 | 258 | for (iterator = bullets.begin(); iterator != bullets.end(); ++iterator) { |
agamemaker | 7:ff87ab834590 | 259 | if(iterator->x_pos < 0 || iterator->x_pos > 144 || iterator->y_pos < 0 || iterator->y_pos > 144) { |
agamemaker | 7:ff87ab834590 | 260 | //bullets.erase(iterator); |
agamemaker | 7:ff87ab834590 | 261 | del = 1; |
agamemaker | 7:ff87ab834590 | 262 | itcpy = iterator; |
agamemaker | 7:ff87ab834590 | 263 | } |
agamemaker | 7:ff87ab834590 | 264 | } |
agamemaker | 7:ff87ab834590 | 265 | if(del) { |
agamemaker | 7:ff87ab834590 | 266 | bullets.erase(itcpy); |
agamemaker | 7:ff87ab834590 | 267 | } |
agamemaker | 6:7d1d8945b2f7 | 268 | } |
agamemaker | 6:7d1d8945b2f7 | 269 | |
agamemaker | 2:332ca4f1a3e3 | 270 | //collisions |
agamemaker | 1:0328ad927150 | 271 | bool collision(Movement p1, Movement p2) |
agamemaker | 1:0328ad927150 | 272 | { |
agamemaker | 1:0328ad927150 | 273 | int rad = p1.hit_rad + p2.hit_rad; |
agamemaker | 1:0328ad927150 | 274 | double dist = sqrt(pow((p1.x_pos - p2.x_pos),2) + pow((p1.y_pos - p2.y_pos),2)); |
agamemaker | 1:0328ad927150 | 275 | return dist < rad; |
agamemaker | 1:0328ad927150 | 276 | } |
agamemaker | 1:0328ad927150 | 277 | |
agamemaker | 9:49f4b9dcab22 | 278 | void new_asteroid(list<Movement> &asteroids, int x, int y, int size){ |
agamemaker | 9:49f4b9dcab22 | 279 | double ast_ang = rand()%1000 * 2*PI/1000; |
agamemaker | 9:49f4b9dcab22 | 280 | double a_x_vel = ASTSP * cos(ast_ang); |
agamemaker | 9:49f4b9dcab22 | 281 | double a_y_vel = ASTSP * sin(ast_ang); |
agamemaker | 9:49f4b9dcab22 | 282 | Movement temp(x, y, a_x_vel, a_y_vel, 0, size, 1); |
agamemaker | 9:49f4b9dcab22 | 283 | asteroids.push_back(temp); |
agamemaker | 9:49f4b9dcab22 | 284 | } |
agamemaker | 9:49f4b9dcab22 | 285 | |
agamemaker | 6:7d1d8945b2f7 | 286 | void calc_collisions(Movement &player, list<Movement> &asteroids, list<Movement> &bullets) |
agamemaker | 2:332ca4f1a3e3 | 287 | { |
agamemaker | 7:ff87ab834590 | 288 | bool hit = 0; |
agamemaker | 7:ff87ab834590 | 289 | list<Movement>::iterator it; |
agamemaker | 7:ff87ab834590 | 290 | list<Movement>::iterator it2; |
agamemaker | 7:ff87ab834590 | 291 | list<Movement>::iterator itacpy; |
agamemaker | 7:ff87ab834590 | 292 | list<Movement>::iterator itbcpy; |
agamemaker | 7:ff87ab834590 | 293 | for (it = asteroids.begin(); it != asteroids.end(); ++it) { |
agamemaker | 7:ff87ab834590 | 294 | if(collision(player,*it)) { |
agamemaker | 9:49f4b9dcab22 | 295 | //ulcd.printf("crash"); |
agamemaker | 9:49f4b9dcab22 | 296 | colsound = 1; |
agamemaker | 9:49f4b9dcab22 | 297 | player.assign(70,70,0,0,0,10,1); |
agamemaker | 9:49f4b9dcab22 | 298 | lives--; |
agamemaker | 9:49f4b9dcab22 | 299 | if(!lives) { |
agamemaker | 9:49f4b9dcab22 | 300 | game_over(); |
agamemaker | 9:49f4b9dcab22 | 301 | } |
agamemaker | 9:49f4b9dcab22 | 302 | ulcd.cls(); |
agamemaker | 9:49f4b9dcab22 | 303 | ulcd.printf("%d",lives); |
agamemaker | 6:7d1d8945b2f7 | 304 | } |
agamemaker | 6:7d1d8945b2f7 | 305 | } |
agamemaker | 7:ff87ab834590 | 306 | for (it = asteroids.begin(); it != asteroids.end(); ++it) { |
agamemaker | 7:ff87ab834590 | 307 | for (it2 = bullets.begin(); it2 != bullets.end(); ++it2) { |
agamemaker | 7:ff87ab834590 | 308 | if(collision(*it,*it2)) { |
agamemaker | 9:49f4b9dcab22 | 309 | //ulcd.printf("hit"); |
agamemaker | 7:ff87ab834590 | 310 | hit = 1; |
agamemaker | 7:ff87ab834590 | 311 | itacpy = it; |
agamemaker | 7:ff87ab834590 | 312 | itbcpy = it2; |
agamemaker | 7:ff87ab834590 | 313 | } |
agamemaker | 7:ff87ab834590 | 314 | } |
agamemaker | 7:ff87ab834590 | 315 | } |
agamemaker | 7:ff87ab834590 | 316 | if(hit) { |
agamemaker | 9:49f4b9dcab22 | 317 | if(itacpy->hit_rad == 10){ |
agamemaker | 9:49f4b9dcab22 | 318 | new_asteroid(asteroids, itacpy->x_pos, itacpy->y_pos, 7); |
agamemaker | 9:49f4b9dcab22 | 319 | new_asteroid(asteroids, itacpy->x_pos, itacpy->y_pos, 7); |
agamemaker | 9:49f4b9dcab22 | 320 | } |
agamemaker | 9:49f4b9dcab22 | 321 | if(itacpy->hit_rad == 7){ |
agamemaker | 9:49f4b9dcab22 | 322 | new_asteroid(asteroids, itacpy->x_pos, itacpy->y_pos, 5); |
agamemaker | 9:49f4b9dcab22 | 323 | new_asteroid(asteroids, itacpy->x_pos, itacpy->y_pos, 5); |
agamemaker | 9:49f4b9dcab22 | 324 | } |
agamemaker | 9:49f4b9dcab22 | 325 | |
agamemaker | 7:ff87ab834590 | 326 | asteroids.erase(itacpy); |
agamemaker | 7:ff87ab834590 | 327 | bullets.erase(itbcpy); |
agamemaker | 7:ff87ab834590 | 328 | } |
agamemaker | 9:49f4b9dcab22 | 329 | } |
agamemaker | 1:0328ad927150 | 330 | |
agamemaker | 2:332ca4f1a3e3 | 331 | //drawing |
agamemaker | 9:49f4b9dcab22 | 332 | void draw_triangle(Movement p, int color) |
agamemaker | 9:49f4b9dcab22 | 333 | { |
agamemaker | 9:49f4b9dcab22 | 334 | int x1 = p.x_pos + p.hit_rad * cos(p.angle); |
agamemaker | 9:49f4b9dcab22 | 335 | int y1 = p.y_pos + p.hit_rad * sin(p.angle); |
agamemaker | 9:49f4b9dcab22 | 336 | int x2 = p.x_pos + p.hit_rad * cos(p.angle + 2.5); |
agamemaker | 9:49f4b9dcab22 | 337 | int y2 = p.y_pos + p.hit_rad * sin(p.angle + 2.5); |
agamemaker | 9:49f4b9dcab22 | 338 | int x3 = p.x_pos + p.hit_rad * cos(p.angle - 2.5); |
agamemaker | 9:49f4b9dcab22 | 339 | int y3 = p.y_pos + p.hit_rad * sin(p.angle - 2.5); |
agamemaker | 9:49f4b9dcab22 | 340 | ulcd.triangle(x1,y1,x2,y2,x3,y3,color); |
agamemaker | 9:49f4b9dcab22 | 341 | } |
agamemaker | 6:7d1d8945b2f7 | 342 | |
agamemaker | 9:49f4b9dcab22 | 343 | void draw_objs(Movement player, list<Movement> asteroids, list<Movement> bullets, int color) |
agamemaker | 9:49f4b9dcab22 | 344 | { |
agamemaker | 9:49f4b9dcab22 | 345 | //ulcd.cls(); |
agamemaker | 9:49f4b9dcab22 | 346 | draw_triangle(player,color); |
agamemaker | 9:49f4b9dcab22 | 347 | ulcd.circle(player.x_pos,player.y_pos,player.hit_rad,color); |
agamemaker | 9:49f4b9dcab22 | 348 | list<Movement>::const_iterator iterator; |
agamemaker | 9:49f4b9dcab22 | 349 | for (iterator = asteroids.begin(); iterator != asteroids.end(); ++iterator) { |
agamemaker | 9:49f4b9dcab22 | 350 | ulcd.circle(iterator->x_pos,iterator->y_pos,iterator->hit_rad,color); |
agamemaker | 9:49f4b9dcab22 | 351 | } |
agamemaker | 9:49f4b9dcab22 | 352 | for (iterator = bullets.begin(); iterator != bullets.end(); ++iterator) { |
agamemaker | 9:49f4b9dcab22 | 353 | ulcd.filled_circle(iterator->x_pos,iterator->y_pos,iterator->hit_rad,color); |
agamemaker | 9:49f4b9dcab22 | 354 | } |
agamemaker | 9:49f4b9dcab22 | 355 | } |
agamemaker | 9:49f4b9dcab22 | 356 | |
agamemaker | 9:49f4b9dcab22 | 357 | //round check |
agamemaker | 9:49f4b9dcab22 | 358 | void round_check(list<Movement> &asteroids){ |
agamemaker | 9:49f4b9dcab22 | 359 | if(asteroids.empty()){ |
agamemaker | 9:49f4b9dcab22 | 360 | round++; |
agamemaker | 10:6bb7504e0f5a | 361 | for(int i = 0; i < round && i < 4; i++){ |
agamemaker | 9:49f4b9dcab22 | 362 | new_asteroid(asteroids, 140*(i%2), 140*((i%2)+1),10); |
agamemaker | 7:ff87ab834590 | 363 | } |
agamemaker | 6:7d1d8945b2f7 | 364 | } |
agamemaker | 9:49f4b9dcab22 | 365 | } |
agamemaker | 1:0328ad927150 | 366 | |
agamemaker | 9:49f4b9dcab22 | 367 | int main() |
agamemaker | 9:49f4b9dcab22 | 368 | { |
agamemaker | 9:49f4b9dcab22 | 369 | Movement temp(0,0,0,0,0,0,0); |
agamemaker | 9:49f4b9dcab22 | 370 | srand(time(NULL)); |
agamemaker | 9:49f4b9dcab22 | 371 | lives = 3; |
agamemaker | 9:49f4b9dcab22 | 372 | ulcd.printf("%d",lives); |
agamemaker | 9:49f4b9dcab22 | 373 | ulcd.baudrate(BAUD_3000000); |
agamemaker | 9:49f4b9dcab22 | 374 | Thread sound(crash); |
agamemaker | 9:49f4b9dcab22 | 375 | Thread buttons(controls); |
agamemaker | 10:6bb7504e0f5a | 376 | Movement player(70,70,0,0,0,10,1); |
agamemaker | 9:49f4b9dcab22 | 377 | list<Movement> asteroids; |
agamemaker | 9:49f4b9dcab22 | 378 | list<Movement> bullets; |
agamemaker | 10:6bb7504e0f5a | 379 | Movement p_player(70,70,0,0,0,10,1); |
agamemaker | 9:49f4b9dcab22 | 380 | list<Movement> p_asteroids; |
agamemaker | 9:49f4b9dcab22 | 381 | list<Movement> p_bullets; |
agamemaker | 9:49f4b9dcab22 | 382 | while(1) { |
agamemaker | 9:49f4b9dcab22 | 383 | //controls |
agamemaker | 9:49f4b9dcab22 | 384 | if(up) { |
agamemaker | 9:49f4b9dcab22 | 385 | player.accelerate(); |
agamemaker | 9:49f4b9dcab22 | 386 | } |
agamemaker | 9:49f4b9dcab22 | 387 | if(left) { |
agamemaker | 9:49f4b9dcab22 | 388 | player.turn_left(); |
agamemaker | 9:49f4b9dcab22 | 389 | } |
agamemaker | 9:49f4b9dcab22 | 390 | if(right) { |
agamemaker | 9:49f4b9dcab22 | 391 | player.turn_right(); |
agamemaker | 9:49f4b9dcab22 | 392 | } |
agamemaker | 9:49f4b9dcab22 | 393 | if(stop) { |
agamemaker | 9:49f4b9dcab22 | 394 | player.x_vel = 0; |
agamemaker | 9:49f4b9dcab22 | 395 | player.y_vel = 0; |
agamemaker | 9:49f4b9dcab22 | 396 | } |
agamemaker | 9:49f4b9dcab22 | 397 | if(four) { |
agamemaker | 9:49f4b9dcab22 | 398 | temp.x_pos = player.x_pos + player.hit_rad * cos(player.angle); |
agamemaker | 9:49f4b9dcab22 | 399 | temp.y_pos = player.y_pos + player.hit_rad * sin(player.angle); |
agamemaker | 9:49f4b9dcab22 | 400 | temp.x_vel = BULSP * cos(player.angle); |
agamemaker | 9:49f4b9dcab22 | 401 | temp.y_vel = BULSP * sin(player.angle); |
agamemaker | 9:49f4b9dcab22 | 402 | temp.angle = player.angle; |
agamemaker | 9:49f4b9dcab22 | 403 | temp.hit_rad = 1; |
agamemaker | 9:49f4b9dcab22 | 404 | temp.wrap = 0; |
agamemaker | 9:49f4b9dcab22 | 405 | bullets.push_back(temp); |
agamemaker | 9:49f4b9dcab22 | 406 | } |
agamemaker | 7:ff87ab834590 | 407 | |
agamemaker | 9:49f4b9dcab22 | 408 | //move |
agamemaker | 9:49f4b9dcab22 | 409 | round_check(asteroids); |
agamemaker | 9:49f4b9dcab22 | 410 | move_all(player, asteroids, bullets); |
agamemaker | 9:49f4b9dcab22 | 411 | garbage(bullets); |
agamemaker | 9:49f4b9dcab22 | 412 | calc_collisions(player, asteroids, bullets); |
agamemaker | 9:49f4b9dcab22 | 413 | draw_objs(p_player, p_asteroids, p_bullets,BLACK); |
agamemaker | 9:49f4b9dcab22 | 414 | draw_objs(player, asteroids, bullets,WHITE); |
agamemaker | 9:49f4b9dcab22 | 415 | p_player = player; |
agamemaker | 9:49f4b9dcab22 | 416 | p_asteroids = asteroids; |
agamemaker | 9:49f4b9dcab22 | 417 | p_bullets = bullets; |
agamemaker | 9:49f4b9dcab22 | 418 | Thread::wait(game_speed); |
agamemaker | 9:49f4b9dcab22 | 419 | } |
agamemaker | 9:49f4b9dcab22 | 420 | } |