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 17:47:01 2016 +0000
Revision:
6:7d1d8945b2f7
Parent:
5:f41d3bfc6701
Child:
7:ff87ab834590
collisions added

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