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

Committer:
agamemaker
Date:
Sat Mar 12 22:23:59 2016 +0000
Revision:
11:d707cebe6eff
Parent:
10:6bb7504e0f5a
Complete

Who changed what in which revision?

UserRevisionLine numberNew 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(&note, &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 }