![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
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
main.cpp@5:f41d3bfc6701, 2016-03-12 (annotated)
- 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?
User | Revision | Line number | New 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 | } |