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 18:50:30 2016 +0000
Revision:
7:ff87ab834590
Parent:
6:7d1d8945b2f7
Child:
9:49f4b9dcab22
bullet collision;

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 7:ff87ab834590 6 #include "SongPlayer.h"
agamemaker 1:0328ad927150 7 using namespace std;
agamemaker 3:14a2729625f6 8
agamemaker 2:332ca4f1a3e3 9 //constants
agamemaker 3:14a2729625f6 10 #define ACCEL .5
agamemaker 3:14a2729625f6 11 #define ROTTA .2
agamemaker 7:ff87ab834590 12 #define MAXSP 7
agamemaker 7:ff87ab834590 13 #define BULSP 10
agamemaker 3:14a2729625f6 14
agamemaker 2:332ca4f1a3e3 15 //devices
agamemaker 5:f41d3bfc6701 16 //DigitalOut myled(LED1);
agamemaker 2:332ca4f1a3e3 17 uLCD_4DGL ulcd(p28,p27,p29);
agamemaker 5:f41d3bfc6701 18 BusOut myled(LED1,LED2,LED3,LED4);
agamemaker 5:f41d3bfc6701 19 Serial blue(p13,p14);
agamemaker 5:f41d3bfc6701 20
agamemaker 5:f41d3bfc6701 21 //Globals
agamemaker 5:f41d3bfc6701 22 int game_speed = 25;
agamemaker 5:f41d3bfc6701 23 bool up = 0;
agamemaker 5:f41d3bfc6701 24 bool left = 0;
agamemaker 5:f41d3bfc6701 25 bool right = 0;
agamemaker 6:7d1d8945b2f7 26 bool stop = 0;
agamemaker 5:f41d3bfc6701 27 bool four = 0;
agamemaker 5:f41d3bfc6701 28
agamemaker 0:16094a49131e 29
agamemaker 0:16094a49131e 30 class Movement
agamemaker 0:16094a49131e 31 {
agamemaker 1:0328ad927150 32 public:
agamemaker 1:0328ad927150 33 double x_pos; // x position of object
agamemaker 1:0328ad927150 34 double y_pos; //
agamemaker 1:0328ad927150 35 double x_vel; // x velocity of object
agamemaker 1:0328ad927150 36 double y_vel; //
agamemaker 1:0328ad927150 37 double angle; // angle of object
agamemaker 1:0328ad927150 38 int hit_rad; // hit box radius of object
agamemaker 1:0328ad927150 39 bool wrap;
agamemaker 1:0328ad927150 40 Movement(double xp,double yp,double xv,double yv,double a,double r,double w);
agamemaker 6:7d1d8945b2f7 41 void assign(double xp,double yp,double xv,double yv,double a,double r,double w);
agamemaker 6:7d1d8945b2f7 42 //void move();
agamemaker 1:0328ad927150 43 void accelerate();
agamemaker 3:14a2729625f6 44 void turn_left();
agamemaker 3:14a2729625f6 45 void turn_right();
agamemaker 1:0328ad927150 46
agamemaker 0:16094a49131e 47 };
agamemaker 0:16094a49131e 48
agamemaker 1:0328ad927150 49 Movement::Movement(double xp,double yp,double xv,double yv,double a,double r,double w)
agamemaker 1:0328ad927150 50 {
agamemaker 1:0328ad927150 51 x_pos = xp;
agamemaker 1:0328ad927150 52 y_pos = yp;
agamemaker 1:0328ad927150 53 x_vel = xv;
agamemaker 1:0328ad927150 54 y_vel = yv;
agamemaker 1:0328ad927150 55 angle = a;
agamemaker 1:0328ad927150 56 hit_rad = r;
agamemaker 1:0328ad927150 57 wrap = w;
agamemaker 1:0328ad927150 58 }
agamemaker 1:0328ad927150 59
agamemaker 6:7d1d8945b2f7 60 void Movement::assign(double xp,double yp,double xv,double yv,double a,double r,double w)
agamemaker 6:7d1d8945b2f7 61 {
agamemaker 6:7d1d8945b2f7 62 x_pos = xp;
agamemaker 6:7d1d8945b2f7 63 y_pos = yp;
agamemaker 6:7d1d8945b2f7 64 x_vel = xv;
agamemaker 6:7d1d8945b2f7 65 y_vel = yv;
agamemaker 6:7d1d8945b2f7 66 angle = a;
agamemaker 6:7d1d8945b2f7 67 hit_rad = r;
agamemaker 6:7d1d8945b2f7 68 wrap = w;
agamemaker 6:7d1d8945b2f7 69 }
agamemaker 1:0328ad927150 70
agamemaker 6:7d1d8945b2f7 71 /*void Movement::move()
agamemaker 1:0328ad927150 72 {
agamemaker 1:0328ad927150 73 x_pos += x_vel;
agamemaker 1:0328ad927150 74 y_pos += y_vel;
agamemaker 6:7d1d8945b2f7 75 if(x_pos < 0 || x_pos > 144 || y_pos < 0 || y_pos > 144) {
agamemaker 2:332ca4f1a3e3 76 if(wrap) {
agamemaker 3:14a2729625f6 77 x_pos += 144*(1 - ceil(x_pos/144));
agamemaker 3:14a2729625f6 78 y_pos += 144*(1 - ceil(y_pos/144));
agamemaker 2:332ca4f1a3e3 79 } else {
agamemaker 6:7d1d8945b2f7 80 }
agamemaker 2:332ca4f1a3e3 81 }
agamemaker 6:7d1d8945b2f7 82 }*/
agamemaker 1:0328ad927150 83
agamemaker 1:0328ad927150 84 void Movement::accelerate()
agamemaker 1:0328ad927150 85 {
agamemaker 2:332ca4f1a3e3 86 x_vel += ACCEL * cos(angle);
agamemaker 2:332ca4f1a3e3 87 y_vel += ACCEL * sin(angle);
agamemaker 5:f41d3bfc6701 88 if(sqrt(pow(x_vel,2) + pow(y_vel,2)) > MAXSP) {
agamemaker 5:f41d3bfc6701 89 x_vel = x_vel * MAXSP / sqrt(pow(x_vel,2) + pow(y_vel,2));
agamemaker 5:f41d3bfc6701 90 y_vel = y_vel * MAXSP / sqrt(pow(x_vel,2) + pow(y_vel,2));
agamemaker 1:0328ad927150 91 }
agamemaker 1:0328ad927150 92 }
agamemaker 1:0328ad927150 93
agamemaker 6:7d1d8945b2f7 94 void Movement::turn_left()
agamemaker 6:7d1d8945b2f7 95 {
agamemaker 3:14a2729625f6 96 angle -= ROTTA;
agamemaker 3:14a2729625f6 97 }
agamemaker 3:14a2729625f6 98
agamemaker 6:7d1d8945b2f7 99 void Movement::turn_right()
agamemaker 6:7d1d8945b2f7 100 {
agamemaker 3:14a2729625f6 101 angle += ROTTA;
agamemaker 3:14a2729625f6 102 }
agamemaker 5:f41d3bfc6701 103
agamemaker 5:f41d3bfc6701 104 //Threads
agamemaker 5:f41d3bfc6701 105 //Controls
agamemaker 5:f41d3bfc6701 106 int read_getc(Serial &blue)
agamemaker 5:f41d3bfc6701 107 {
agamemaker 6:7d1d8945b2f7 108 while(!blue.readable()) {
agamemaker 5:f41d3bfc6701 109 Thread::yield();
agamemaker 5:f41d3bfc6701 110 }
agamemaker 5:f41d3bfc6701 111 return blue.getc();
agamemaker 5:f41d3bfc6701 112 }
agamemaker 5:f41d3bfc6701 113
agamemaker 5:f41d3bfc6701 114 void controls(void const *args)
agamemaker 5:f41d3bfc6701 115 {
agamemaker 5:f41d3bfc6701 116 char bnum=0;
agamemaker 5:f41d3bfc6701 117 char bhit=0;
agamemaker 5:f41d3bfc6701 118 while(1) {
agamemaker 6:7d1d8945b2f7 119 //Thread::wait(100);
agamemaker 5:f41d3bfc6701 120 if (read_getc(blue)=='!') {
agamemaker 5:f41d3bfc6701 121 if (read_getc(blue)=='B') { //button data packet
agamemaker 5:f41d3bfc6701 122 bnum = read_getc(blue); //button number
agamemaker 5:f41d3bfc6701 123 bhit = read_getc(blue); //1=hit, 0=release
agamemaker 5:f41d3bfc6701 124 if (read_getc(blue)==char(~('!' + 'B' + bnum + bhit))) { //checksum OK?
agamemaker 5:f41d3bfc6701 125 myled = bnum - '0'; //current button number will appear on LEDs
agamemaker 5:f41d3bfc6701 126 switch (bnum) {
agamemaker 5:f41d3bfc6701 127 case '1': //number button 1
agamemaker 5:f41d3bfc6701 128 if (bhit=='1') {
agamemaker 6:7d1d8945b2f7 129 game_speed = 25;
agamemaker 5:f41d3bfc6701 130 } else {
agamemaker 5:f41d3bfc6701 131 //add release code here
agamemaker 5:f41d3bfc6701 132 }
agamemaker 5:f41d3bfc6701 133 break;
agamemaker 5:f41d3bfc6701 134 case '2': //number button 2
agamemaker 5:f41d3bfc6701 135 if (bhit=='1') {
agamemaker 6:7d1d8945b2f7 136 game_speed = 100;
agamemaker 5:f41d3bfc6701 137 } else {
agamemaker 5:f41d3bfc6701 138 //add release code here
agamemaker 5:f41d3bfc6701 139 }
agamemaker 5:f41d3bfc6701 140 break;
agamemaker 5:f41d3bfc6701 141 case '3': //number button 3
agamemaker 5:f41d3bfc6701 142 if (bhit=='1') {
agamemaker 5:f41d3bfc6701 143 //add hit code here
agamemaker 5:f41d3bfc6701 144 } else {
agamemaker 5:f41d3bfc6701 145 //add release code here
agamemaker 5:f41d3bfc6701 146 }
agamemaker 5:f41d3bfc6701 147 break;
agamemaker 5:f41d3bfc6701 148 case '4': //number button 4
agamemaker 5:f41d3bfc6701 149 if (bhit=='1') {
agamemaker 6:7d1d8945b2f7 150 four = 1;
agamemaker 5:f41d3bfc6701 151 } else {
agamemaker 6:7d1d8945b2f7 152 four = 0;
agamemaker 5:f41d3bfc6701 153 }
agamemaker 5:f41d3bfc6701 154 break;
agamemaker 5:f41d3bfc6701 155 case '5': //button 5 up arrow
agamemaker 5:f41d3bfc6701 156 if (bhit=='1') {
agamemaker 6:7d1d8945b2f7 157 up = 1;
agamemaker 5:f41d3bfc6701 158 } else {
agamemaker 6:7d1d8945b2f7 159 up = 0;
agamemaker 6:7d1d8945b2f7 160 }
agamemaker 6:7d1d8945b2f7 161 break;
agamemaker 6:7d1d8945b2f7 162 case '6': //button 6 down arrow
agamemaker 6:7d1d8945b2f7 163 if (bhit=='1') {
agamemaker 6:7d1d8945b2f7 164 stop = 1;
agamemaker 6:7d1d8945b2f7 165 } else {
agamemaker 6:7d1d8945b2f7 166 stop = 0;
agamemaker 5:f41d3bfc6701 167 }
agamemaker 5:f41d3bfc6701 168 break;
agamemaker 5:f41d3bfc6701 169 case '7': //button 7 left arrow
agamemaker 5:f41d3bfc6701 170 if (bhit=='1') {
agamemaker 6:7d1d8945b2f7 171 left = 1;
agamemaker 5:f41d3bfc6701 172 } else {
agamemaker 6:7d1d8945b2f7 173 left = 0;
agamemaker 5:f41d3bfc6701 174 }
agamemaker 7:ff87ab834590 175 break;
agamemaker 5:f41d3bfc6701 176 case '8': //button 8 right arrow
agamemaker 5:f41d3bfc6701 177 if (bhit=='1') {
agamemaker 6:7d1d8945b2f7 178 right = 1;
agamemaker 5:f41d3bfc6701 179 } else {
agamemaker 6:7d1d8945b2f7 180 right = 0;
agamemaker 5:f41d3bfc6701 181 }
agamemaker 5:f41d3bfc6701 182 break;
agamemaker 5:f41d3bfc6701 183 default:
agamemaker 5:f41d3bfc6701 184 break;
agamemaker 5:f41d3bfc6701 185 }
agamemaker 5:f41d3bfc6701 186 }
agamemaker 5:f41d3bfc6701 187 }
agamemaker 5:f41d3bfc6701 188 }
agamemaker 5:f41d3bfc6701 189 }
agamemaker 5:f41d3bfc6701 190 }
agamemaker 6:7d1d8945b2f7 191
agamemaker 6:7d1d8945b2f7 192 void move(Movement &p)
agamemaker 6:7d1d8945b2f7 193 {
agamemaker 6:7d1d8945b2f7 194 p.x_pos += p.x_vel;
agamemaker 6:7d1d8945b2f7 195 p.y_pos += p.y_vel;
agamemaker 6:7d1d8945b2f7 196 if(p.x_pos < 0 || p.x_pos > 144 || p.y_pos < 0 || p.y_pos > 144) {
agamemaker 6:7d1d8945b2f7 197 if(p.wrap) {
agamemaker 6:7d1d8945b2f7 198 p.x_pos += 144*(1 - ceil(p.x_pos/144));
agamemaker 6:7d1d8945b2f7 199 p.y_pos += 144*(1 - ceil(p.y_pos/144));
agamemaker 6:7d1d8945b2f7 200 } else {
agamemaker 6:7d1d8945b2f7 201 }
agamemaker 6:7d1d8945b2f7 202 }
agamemaker 6:7d1d8945b2f7 203 }
agamemaker 6:7d1d8945b2f7 204
agamemaker 6:7d1d8945b2f7 205 //move
agamemaker 6:7d1d8945b2f7 206 void move_all(Movement &player, list<Movement> &asteroids, list<Movement> &bullets)
agamemaker 6:7d1d8945b2f7 207 {
agamemaker 6:7d1d8945b2f7 208 move(player);
agamemaker 6:7d1d8945b2f7 209 list<Movement>::iterator iterator;
agamemaker 6:7d1d8945b2f7 210 for (iterator = asteroids.begin(); iterator != asteroids.end(); ++iterator) {
agamemaker 6:7d1d8945b2f7 211 move(*iterator);
agamemaker 6:7d1d8945b2f7 212 }
agamemaker 7:ff87ab834590 213 for (iterator = bullets.begin(); iterator != bullets.end(); ++iterator) {
agamemaker 7:ff87ab834590 214 move(*iterator);
agamemaker 7:ff87ab834590 215 }
agamemaker 7:ff87ab834590 216 }
agamemaker 7:ff87ab834590 217
agamemaker 7:ff87ab834590 218 //garbage
agamemaker 7:ff87ab834590 219 void garbage(list<Movement> &bullets)
agamemaker 7:ff87ab834590 220 {
agamemaker 7:ff87ab834590 221 bool del = 0;
agamemaker 7:ff87ab834590 222 list<Movement>::iterator iterator;
agamemaker 7:ff87ab834590 223 list<Movement>::iterator itcpy;
agamemaker 7:ff87ab834590 224 for (iterator = bullets.begin(); iterator != bullets.end(); ++iterator) {
agamemaker 7:ff87ab834590 225 if(iterator->x_pos < 0 || iterator->x_pos > 144 || iterator->y_pos < 0 || iterator->y_pos > 144) {
agamemaker 7:ff87ab834590 226 //bullets.erase(iterator);
agamemaker 7:ff87ab834590 227 del = 1;
agamemaker 7:ff87ab834590 228 itcpy = iterator;
agamemaker 7:ff87ab834590 229 }
agamemaker 7:ff87ab834590 230 }
agamemaker 7:ff87ab834590 231 if(del) {
agamemaker 7:ff87ab834590 232 bullets.erase(itcpy);
agamemaker 7:ff87ab834590 233 }
agamemaker 6:7d1d8945b2f7 234 }
agamemaker 6:7d1d8945b2f7 235
agamemaker 2:332ca4f1a3e3 236 //collisions
agamemaker 1:0328ad927150 237 bool collision(Movement p1, Movement p2)
agamemaker 1:0328ad927150 238 {
agamemaker 1:0328ad927150 239 int rad = p1.hit_rad + p2.hit_rad;
agamemaker 1:0328ad927150 240 double dist = sqrt(pow((p1.x_pos - p2.x_pos),2) + pow((p1.y_pos - p2.y_pos),2));
agamemaker 1:0328ad927150 241 return dist < rad;
agamemaker 1:0328ad927150 242 }
agamemaker 1:0328ad927150 243
agamemaker 6:7d1d8945b2f7 244 void calc_collisions(Movement &player, list<Movement> &asteroids, list<Movement> &bullets)
agamemaker 2:332ca4f1a3e3 245 {
agamemaker 7:ff87ab834590 246 bool hit = 0;
agamemaker 7:ff87ab834590 247 list<Movement>::iterator it;
agamemaker 7:ff87ab834590 248 list<Movement>::iterator it2;
agamemaker 7:ff87ab834590 249 list<Movement>::iterator itacpy;
agamemaker 7:ff87ab834590 250 list<Movement>::iterator itbcpy;
agamemaker 7:ff87ab834590 251 for (it = asteroids.begin(); it != asteroids.end(); ++it) {
agamemaker 7:ff87ab834590 252 if(collision(player,*it)) {
agamemaker 6:7d1d8945b2f7 253 ulcd.printf("crash");
agamemaker 6:7d1d8945b2f7 254 }
agamemaker 6:7d1d8945b2f7 255 }
agamemaker 7:ff87ab834590 256 for (it = asteroids.begin(); it != asteroids.end(); ++it) {
agamemaker 7:ff87ab834590 257 for (it2 = bullets.begin(); it2 != bullets.end(); ++it2) {
agamemaker 7:ff87ab834590 258 if(collision(*it,*it2)) {
agamemaker 7:ff87ab834590 259 ulcd.printf("hit");
agamemaker 7:ff87ab834590 260 hit = 1;
agamemaker 7:ff87ab834590 261 itacpy = it;
agamemaker 7:ff87ab834590 262 itbcpy = it2;
agamemaker 7:ff87ab834590 263 }
agamemaker 7:ff87ab834590 264 }
agamemaker 7:ff87ab834590 265 }
agamemaker 7:ff87ab834590 266 if(hit) {
agamemaker 7:ff87ab834590 267 asteroids.erase(itacpy);
agamemaker 7:ff87ab834590 268 bullets.erase(itbcpy);
agamemaker 7:ff87ab834590 269 }
agamemaker 7:ff87ab834590 270 }
agamemaker 1:0328ad927150 271
agamemaker 2:332ca4f1a3e3 272 //drawing
agamemaker 7:ff87ab834590 273 void draw_triangle(Movement p) {
agamemaker 7:ff87ab834590 274 int x1 = p.x_pos + p.hit_rad * cos(p.angle);
agamemaker 7:ff87ab834590 275 int y1 = p.y_pos + p.hit_rad * sin(p.angle);
agamemaker 7:ff87ab834590 276 int x2 = p.x_pos + p.hit_rad * cos(p.angle + 2.5);
agamemaker 7:ff87ab834590 277 int y2 = p.y_pos + p.hit_rad * sin(p.angle + 2.5);
agamemaker 7:ff87ab834590 278 int x3 = p.x_pos + p.hit_rad * cos(p.angle - 2.5);
agamemaker 7:ff87ab834590 279 int y3 = p.y_pos + p.hit_rad * sin(p.angle - 2.5);
agamemaker 7:ff87ab834590 280 ulcd.triangle(x1,y1,x2,y2,x3,y3,BLUE);
agamemaker 7:ff87ab834590 281 }
agamemaker 6:7d1d8945b2f7 282
agamemaker 7:ff87ab834590 283 void draw_objs(Movement player, list<Movement> asteroids, list<Movement> bullets) {
agamemaker 7:ff87ab834590 284 ulcd.cls();
agamemaker 7:ff87ab834590 285 draw_triangle(player);
agamemaker 7:ff87ab834590 286 ulcd.circle(player.x_pos,player.y_pos,player.hit_rad,BLUE);
agamemaker 7:ff87ab834590 287 list<Movement>::const_iterator iterator;
agamemaker 7:ff87ab834590 288 for (iterator = asteroids.begin(); iterator != asteroids.end(); ++iterator) {
agamemaker 7:ff87ab834590 289 ulcd.circle(iterator->x_pos,iterator->y_pos,iterator->hit_rad,RED);
agamemaker 7:ff87ab834590 290 }
agamemaker 7:ff87ab834590 291 for (iterator = bullets.begin(); iterator != bullets.end(); ++iterator) {
agamemaker 7:ff87ab834590 292 ulcd.filled_circle(iterator->x_pos,iterator->y_pos,iterator->hit_rad,WHITE);
agamemaker 7:ff87ab834590 293 }
agamemaker 6:7d1d8945b2f7 294 }
agamemaker 1:0328ad927150 295
agamemaker 7:ff87ab834590 296 int main() {
agamemaker 7:ff87ab834590 297 Thread buttons(controls);
agamemaker 7:ff87ab834590 298 Movement temp(100, 0, 0, 5, 0, 10, 1);
agamemaker 7:ff87ab834590 299 Movement player(50, 100, 0, -5, 0, 10, 1);
agamemaker 7:ff87ab834590 300 list<Movement> asteroids;
agamemaker 7:ff87ab834590 301 list<Movement> bullets;
agamemaker 7:ff87ab834590 302 asteroids.push_back(temp);
agamemaker 7:ff87ab834590 303 temp.assign(20, 0, 0, 5, 0, 10, 1);
agamemaker 7:ff87ab834590 304 asteroids.push_back(temp);
agamemaker 7:ff87ab834590 305 while(1) {
agamemaker 7:ff87ab834590 306 //controls
agamemaker 7:ff87ab834590 307 if(up) {
agamemaker 7:ff87ab834590 308 player.accelerate();
agamemaker 7:ff87ab834590 309 }
agamemaker 7:ff87ab834590 310 if(left) {
agamemaker 7:ff87ab834590 311 player.turn_left();
agamemaker 7:ff87ab834590 312 }
agamemaker 7:ff87ab834590 313 if(right) {
agamemaker 7:ff87ab834590 314 player.turn_right();
agamemaker 7:ff87ab834590 315 }
agamemaker 7:ff87ab834590 316 if(stop) {
agamemaker 7:ff87ab834590 317 player.x_vel = 0;
agamemaker 7:ff87ab834590 318 player.y_vel = 0;
agamemaker 7:ff87ab834590 319 }
agamemaker 7:ff87ab834590 320 if(four) {
agamemaker 7:ff87ab834590 321 temp.x_pos = player.x_pos + player.hit_rad * cos(player.angle);
agamemaker 7:ff87ab834590 322 temp.y_pos = player.y_pos + player.hit_rad * sin(player.angle);
agamemaker 7:ff87ab834590 323 temp.x_vel = BULSP * cos(player.angle);
agamemaker 7:ff87ab834590 324 temp.y_vel = BULSP * sin(player.angle);
agamemaker 7:ff87ab834590 325 temp.angle = player.angle;
agamemaker 7:ff87ab834590 326 temp.hit_rad = 3;
agamemaker 7:ff87ab834590 327 temp.wrap = 0;
agamemaker 7:ff87ab834590 328 bullets.push_back(temp);
agamemaker 7:ff87ab834590 329 }
agamemaker 7:ff87ab834590 330
agamemaker 7:ff87ab834590 331 //move
agamemaker 7:ff87ab834590 332 move_all(player, asteroids, bullets);
agamemaker 7:ff87ab834590 333 garbage(bullets);
agamemaker 7:ff87ab834590 334 calc_collisions(player, asteroids, bullets);
agamemaker 7:ff87ab834590 335 draw_objs(player, asteroids, bullets);
agamemaker 7:ff87ab834590 336 Thread::wait(game_speed);
agamemaker 6:7d1d8945b2f7 337 }
agamemaker 7:ff87ab834590 338 }