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 16:11:05 2016 +0000
Revision:
5:f41d3bfc6701
Parent:
4:563648944ecc
Child:
6:7d1d8945b2f7
added buttons empty

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 5:f41d3bfc6701 24 bool four = 0;
agamemaker 5:f41d3bfc6701 25
agamemaker 0:16094a49131e 26
agamemaker 0:16094a49131e 27 class Movement
agamemaker 0:16094a49131e 28 {
agamemaker 1:0328ad927150 29 public:
agamemaker 1:0328ad927150 30 double x_pos; // x position of object
agamemaker 1:0328ad927150 31 double y_pos; //
agamemaker 1:0328ad927150 32 double x_vel; // x velocity of object
agamemaker 1:0328ad927150 33 double y_vel; //
agamemaker 1:0328ad927150 34 double angle; // angle of object
agamemaker 1:0328ad927150 35 int hit_rad; // hit box radius of object
agamemaker 1:0328ad927150 36 bool wrap;
agamemaker 1:0328ad927150 37 Movement(double xp,double yp,double xv,double yv,double a,double r,double w);
agamemaker 1:0328ad927150 38 void move();
agamemaker 1:0328ad927150 39 void accelerate();
agamemaker 3:14a2729625f6 40 void turn_left();
agamemaker 3:14a2729625f6 41 void turn_right();
agamemaker 1:0328ad927150 42
agamemaker 0:16094a49131e 43 };
agamemaker 0:16094a49131e 44
agamemaker 1:0328ad927150 45 Movement::Movement(double xp,double yp,double xv,double yv,double a,double r,double w)
agamemaker 1:0328ad927150 46 {
agamemaker 1:0328ad927150 47 x_pos = xp;
agamemaker 1:0328ad927150 48 y_pos = yp;
agamemaker 1:0328ad927150 49 x_vel = xv;
agamemaker 1:0328ad927150 50 y_vel = yv;
agamemaker 1:0328ad927150 51 angle = a;
agamemaker 1:0328ad927150 52 hit_rad = r;
agamemaker 1:0328ad927150 53 wrap = w;
agamemaker 1:0328ad927150 54 }
agamemaker 1:0328ad927150 55
agamemaker 1:0328ad927150 56
agamemaker 1:0328ad927150 57 void Movement::move()
agamemaker 1:0328ad927150 58 {
agamemaker 1:0328ad927150 59 x_pos += x_vel;
agamemaker 1:0328ad927150 60 y_pos += y_vel;
agamemaker 2:332ca4f1a3e3 61 if(x_pos < 0 || x_pos > 144 && x_pos < 0 || x_pos > 144) {
agamemaker 2:332ca4f1a3e3 62 if(wrap) {
agamemaker 3:14a2729625f6 63 x_pos += 144*(1 - ceil(x_pos/144));
agamemaker 3:14a2729625f6 64 y_pos += 144*(1 - ceil(y_pos/144));
agamemaker 2:332ca4f1a3e3 65 } else {
agamemaker 2:332ca4f1a3e3 66 }
agamemaker 2:332ca4f1a3e3 67 }
agamemaker 1:0328ad927150 68 }
agamemaker 1:0328ad927150 69
agamemaker 1:0328ad927150 70 void Movement::accelerate()
agamemaker 1:0328ad927150 71 {
agamemaker 2:332ca4f1a3e3 72 x_vel += ACCEL * cos(angle);
agamemaker 2:332ca4f1a3e3 73 y_vel += ACCEL * sin(angle);
agamemaker 5:f41d3bfc6701 74 if(sqrt(pow(x_vel,2) + pow(y_vel,2)) > MAXSP) {
agamemaker 5:f41d3bfc6701 75 x_vel = x_vel * MAXSP / sqrt(pow(x_vel,2) + pow(y_vel,2));
agamemaker 5:f41d3bfc6701 76 y_vel = y_vel * MAXSP / sqrt(pow(x_vel,2) + pow(y_vel,2));
agamemaker 1:0328ad927150 77 }
agamemaker 1:0328ad927150 78 }
agamemaker 1:0328ad927150 79
agamemaker 3:14a2729625f6 80 void Movement::turn_left(){
agamemaker 3:14a2729625f6 81 angle -= ROTTA;
agamemaker 3:14a2729625f6 82 }
agamemaker 3:14a2729625f6 83
agamemaker 3:14a2729625f6 84 void Movement::turn_right(){
agamemaker 3:14a2729625f6 85 angle += ROTTA;
agamemaker 3:14a2729625f6 86 }
agamemaker 5:f41d3bfc6701 87
agamemaker 5:f41d3bfc6701 88 //Threads
agamemaker 5:f41d3bfc6701 89 //Controls
agamemaker 5:f41d3bfc6701 90 int read_getc(Serial &blue)
agamemaker 5:f41d3bfc6701 91 {
agamemaker 5:f41d3bfc6701 92 if(!blue.readable()) {
agamemaker 5:f41d3bfc6701 93 Thread::yield();
agamemaker 5:f41d3bfc6701 94 }
agamemaker 5:f41d3bfc6701 95 return blue.getc();
agamemaker 5:f41d3bfc6701 96 }
agamemaker 5:f41d3bfc6701 97
agamemaker 5:f41d3bfc6701 98 void controls(void const *args)
agamemaker 5:f41d3bfc6701 99 {
agamemaker 5:f41d3bfc6701 100 char bnum=0;
agamemaker 5:f41d3bfc6701 101 char bhit=0;
agamemaker 5:f41d3bfc6701 102 while(1) {
agamemaker 5:f41d3bfc6701 103 if (read_getc(blue)=='!') {
agamemaker 5:f41d3bfc6701 104 if (read_getc(blue)=='B') { //button data packet
agamemaker 5:f41d3bfc6701 105 bnum = read_getc(blue); //button number
agamemaker 5:f41d3bfc6701 106 bhit = read_getc(blue); //1=hit, 0=release
agamemaker 5:f41d3bfc6701 107 if (read_getc(blue)==char(~('!' + 'B' + bnum + bhit))) { //checksum OK?
agamemaker 5:f41d3bfc6701 108 myled = bnum - '0'; //current button number will appear on LEDs
agamemaker 5:f41d3bfc6701 109 switch (bnum) {
agamemaker 5:f41d3bfc6701 110 case '1': //number button 1
agamemaker 5:f41d3bfc6701 111 if (bhit=='1') {
agamemaker 5:f41d3bfc6701 112 //add hit code here
agamemaker 5:f41d3bfc6701 113 } else {
agamemaker 5:f41d3bfc6701 114 //add release code here
agamemaker 5:f41d3bfc6701 115 }
agamemaker 5:f41d3bfc6701 116 break;
agamemaker 5:f41d3bfc6701 117 case '2': //number button 2
agamemaker 5:f41d3bfc6701 118 if (bhit=='1') {
agamemaker 5:f41d3bfc6701 119 //add hit code here
agamemaker 5:f41d3bfc6701 120 } else {
agamemaker 5:f41d3bfc6701 121 //add release code here
agamemaker 5:f41d3bfc6701 122 }
agamemaker 5:f41d3bfc6701 123 break;
agamemaker 5:f41d3bfc6701 124 case '3': //number button 3
agamemaker 5:f41d3bfc6701 125 if (bhit=='1') {
agamemaker 5:f41d3bfc6701 126 //add hit code here
agamemaker 5:f41d3bfc6701 127 } else {
agamemaker 5:f41d3bfc6701 128 //add release code here
agamemaker 5:f41d3bfc6701 129 }
agamemaker 5:f41d3bfc6701 130 break;
agamemaker 5:f41d3bfc6701 131 case '4': //number button 4
agamemaker 5:f41d3bfc6701 132 if (bhit=='1') {
agamemaker 5:f41d3bfc6701 133 //add hit code here
agamemaker 5:f41d3bfc6701 134 } else {
agamemaker 5:f41d3bfc6701 135 //add release code here
agamemaker 5:f41d3bfc6701 136 }
agamemaker 5:f41d3bfc6701 137 break;
agamemaker 5:f41d3bfc6701 138 case '5': //button 5 up arrow
agamemaker 5:f41d3bfc6701 139 if (bhit=='1') {
agamemaker 5:f41d3bfc6701 140 //add hit code here
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 '6': //button 6 down arrow
agamemaker 5:f41d3bfc6701 146 // if (bhit=='1') {
agamemaker 5:f41d3bfc6701 147 //add release code here
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 '7': //button 7 left arrow
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 '8': //button 8 right arrow
agamemaker 5:f41d3bfc6701 160 if (bhit=='1') {
agamemaker 5:f41d3bfc6701 161 //add hit code here
agamemaker 5:f41d3bfc6701 162 } else {
agamemaker 5:f41d3bfc6701 163 //add release code here
agamemaker 5:f41d3bfc6701 164 }
agamemaker 5:f41d3bfc6701 165 break;
agamemaker 5:f41d3bfc6701 166 default:
agamemaker 5:f41d3bfc6701 167 break;
agamemaker 5:f41d3bfc6701 168 }
agamemaker 5:f41d3bfc6701 169 }
agamemaker 5:f41d3bfc6701 170 }
agamemaker 5:f41d3bfc6701 171 }
agamemaker 5:f41d3bfc6701 172 }
agamemaker 5:f41d3bfc6701 173 }
agamemaker 3:14a2729625f6 174
agamemaker 2:332ca4f1a3e3 175 //collisions
agamemaker 1:0328ad927150 176 bool collision(Movement p1, Movement p2)
agamemaker 1:0328ad927150 177 {
agamemaker 1:0328ad927150 178 int rad = p1.hit_rad + p2.hit_rad;
agamemaker 1:0328ad927150 179 double dist = sqrt(pow((p1.x_pos - p2.x_pos),2) + pow((p1.y_pos - p2.y_pos),2));
agamemaker 1:0328ad927150 180 return dist < rad;
agamemaker 1:0328ad927150 181 }
agamemaker 1:0328ad927150 182
agamemaker 2:332ca4f1a3e3 183 void calc_collisions(Movement player, list<Movement> asteroids, list<Movement> bullets)
agamemaker 2:332ca4f1a3e3 184 {
agamemaker 1:0328ad927150 185 }
agamemaker 1:0328ad927150 186
agamemaker 2:332ca4f1a3e3 187 //drawing
agamemaker 4:563648944ecc 188 void draw_triangle(Movement p){
agamemaker 4:563648944ecc 189 int x1 = p.x_pos + p.hit_rad * cos(p.angle);
agamemaker 4:563648944ecc 190 int y1 = p.y_pos + p.hit_rad * cos(p.angle);
agamemaker 4:563648944ecc 191 int x2 = p.x_pos + p.hit_rad * cos(p.angle);
agamemaker 4:563648944ecc 192 int y2 = p.y_pos + p.hit_rad * cos(p.angle);
agamemaker 4:563648944ecc 193 int x3 = p.x_pos + p.hit_rad * cos(p.angle);
agamemaker 4:563648944ecc 194 int y3 = p.y_pos + p.hit_rad * cos(p.angle);
agamemaker 4:563648944ecc 195 ulcd.triangle(x1,y1,x2,y2,x3,y3,BLUE);
agamemaker 4:563648944ecc 196 }
agamemaker 4:563648944ecc 197
agamemaker 2:332ca4f1a3e3 198 void draw_objs(Movement player, list<Movement> asteroids, list<Movement> bullets)
agamemaker 2:332ca4f1a3e3 199 {
agamemaker 4:563648944ecc 200 draw_triangle(player);
agamemaker 4:563648944ecc 201 ulcd.circle(player.x_pos,player.y_pos,player.hit_rad,BLUE);
agamemaker 2:332ca4f1a3e3 202 }
agamemaker 1:0328ad927150 203
agamemaker 1:0328ad927150 204 int main()
agamemaker 1:0328ad927150 205 {
agamemaker 5:f41d3bfc6701 206 Thread buttons(controls);
agamemaker 1:0328ad927150 207 Movement player(50, 100, 0, -5, 0, 5, 1);
agamemaker 1:0328ad927150 208 list<Movement> asteroids();
agamemaker 1:0328ad927150 209 list<Movement> bullets();
agamemaker 0:16094a49131e 210 while(1) {
agamemaker 0:16094a49131e 211 player.move();
agamemaker 3:14a2729625f6 212 //calc_collisions();
agamemaker 1:0328ad927150 213 //draw_objs(player, asteroids, bullets);
agamemaker 5:f41d3bfc6701 214 wait(game_speed);
agamemaker 0:16094a49131e 215 }
agamemaker 4:563648944ecc 216 }