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