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 21:11:19 2016 +0000
Revision:
10:6bb7504e0f5a
Parent:
9:49f4b9dcab22
Child:
11:d707cebe6eff
almost finished

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