![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
Shell code for the Tanks game
Dependencies: 4DGL-uLCD-SE EthernetInterface Game_Synchronizer MMA8452 SDFileSystem mbed-rtos mbed wave_player
main.cpp@11:f455e907baba, 2015-10-23 (annotated)
- Committer:
- jford38
- Date:
- Fri Oct 23 04:18:28 2015 +0000
- Revision:
- 11:f455e907baba
- Parent:
- 10:5da9b27e050e
- Child:
- 12:088a8203a9bb
Working gun barrels and driving tanks
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jford38 | 6:3be57cf4bd33 | 1 | // Student Side. |
jford38 | 0:899c85cd266f | 2 | |
jford38 | 0:899c85cd266f | 3 | #include "mbed.h" |
jford38 | 6:3be57cf4bd33 | 4 | #include "game_synchronizer.h" |
jford38 | 10:5da9b27e050e | 5 | #include "math.h" |
jford38 | 10:5da9b27e050e | 6 | |
jford38 | 10:5da9b27e050e | 7 | #define SKY_COLOR 0x7EC0EE |
jford38 | 10:5da9b27e050e | 8 | #define GND_COLOR 0x66CD00 |
jford38 | 10:5da9b27e050e | 9 | #define TANK_RED 0xCD0000 |
jford38 | 10:5da9b27e050e | 10 | #define TANK_BLUE 0x000080 |
jford38 | 10:5da9b27e050e | 11 | #define PI 3.1415926535797 |
jford38 | 6:3be57cf4bd33 | 12 | |
jford38 | 6:3be57cf4bd33 | 13 | DigitalOut led1(LED1); |
jford38 | 6:3be57cf4bd33 | 14 | DigitalOut led2(LED2); |
jford38 | 6:3be57cf4bd33 | 15 | DigitalOut led3(LED3); |
jford38 | 6:3be57cf4bd33 | 16 | DigitalOut led4(LED4); |
jford38 | 0:899c85cd266f | 17 | |
jford38 | 6:3be57cf4bd33 | 18 | DigitalIn pb_l(p24); // left button |
jford38 | 6:3be57cf4bd33 | 19 | DigitalIn pb_r(p21); // right button |
jford38 | 6:3be57cf4bd33 | 20 | DigitalIn pb_u(p22); // up button |
jford38 | 6:3be57cf4bd33 | 21 | DigitalIn pb_d(p23); // down button |
jford38 | 6:3be57cf4bd33 | 22 | |
jford38 | 10:5da9b27e050e | 23 | |
jford38 | 8:e6dd05393290 | 24 | uLCD_4DGL uLCD(p9,p10,p11); // LCD (serial tx, serial rx, reset pin;) |
jford38 | 8:e6dd05393290 | 25 | Game_Synchronizer sync(PLAYER1); // (tx, rx, rst, player mode) |
jford38 | 0:899c85cd266f | 26 | |
jford38 | 6:3be57cf4bd33 | 27 | // For debug only. Don't use in production code. It will slow your game down a lot. |
jford38 | 6:3be57cf4bd33 | 28 | Serial pc(USBTX, USBRX); |
jford38 | 0:899c85cd266f | 29 | |
jford38 | 7:9506f2d84162 | 30 | |
jford38 | 7:9506f2d84162 | 31 | int game_menu(void) { |
jford38 | 7:9506f2d84162 | 32 | |
jford38 | 7:9506f2d84162 | 33 | // Figure out what mode the game will be run in. |
jford38 | 9:ee330b1ba394 | 34 | |
jford38 | 10:5da9b27e050e | 35 | uLCD.current_orientation = IS_LANDSCAPE; |
jford38 | 9:ee330b1ba394 | 36 | uLCD.locate(0,1); |
jford38 | 9:ee330b1ba394 | 37 | uLCD.puts("Select Mode:"); |
jford38 | 9:ee330b1ba394 | 38 | uLCD.locate(0,3); |
jford38 | 9:ee330b1ba394 | 39 | uLCD.puts(" Single-Player:"); |
jford38 | 9:ee330b1ba394 | 40 | uLCD.locate(0,4); |
jford38 | 9:ee330b1ba394 | 41 | uLCD.puts(" Left Button"); |
jford38 | 9:ee330b1ba394 | 42 | uLCD.locate(0,6); |
jford38 | 9:ee330b1ba394 | 43 | uLCD.puts(" Multi-Player:"); |
jford38 | 9:ee330b1ba394 | 44 | uLCD.locate(0,7); |
jford38 | 9:ee330b1ba394 | 45 | uLCD.puts(" Right Button"); |
jford38 | 7:9506f2d84162 | 46 | // Right button -> Multiplayer |
jford38 | 7:9506f2d84162 | 47 | // Left button -> Single player |
jford38 | 7:9506f2d84162 | 48 | while(1) { |
jford38 | 9:ee330b1ba394 | 49 | if(!pb_r) { return MULTI_PLAYER; } |
jford38 | 9:ee330b1ba394 | 50 | if(!pb_l) { return SINGLE_PLAYER; } |
jford38 | 7:9506f2d84162 | 51 | } |
jford38 | 7:9506f2d84162 | 52 | } |
jford38 | 7:9506f2d84162 | 53 | |
jford38 | 10:5da9b27e050e | 54 | void map_init() { |
jford38 | 10:5da9b27e050e | 55 | sync.background_color(SKY_COLOR); |
jford38 | 10:5da9b27e050e | 56 | sync.cls(); |
jford38 | 10:5da9b27e050e | 57 | sync.filled_rectangle(0,0,128,20, GND_COLOR); |
jford38 | 10:5da9b27e050e | 58 | sync.filled_rectangle(59, 20, 69, 60, BLACK); |
jford38 | 10:5da9b27e050e | 59 | sync.update(); |
jford38 | 10:5da9b27e050e | 60 | } |
jford38 | 10:5da9b27e050e | 61 | |
jford38 | 10:5da9b27e050e | 62 | class Tank { |
jford38 | 10:5da9b27e050e | 63 | public: |
jford38 | 10:5da9b27e050e | 64 | int x, y; |
jford38 | 10:5da9b27e050e | 65 | int w; |
jford38 | 10:5da9b27e050e | 66 | int h; |
jford38 | 10:5da9b27e050e | 67 | int tank_color; |
jford38 | 10:5da9b27e050e | 68 | float barrel_theta; |
jford38 | 10:5da9b27e050e | 69 | int barrel_length; |
jford38 | 10:5da9b27e050e | 70 | int wheel_rad; |
jford38 | 10:5da9b27e050e | 71 | |
jford38 | 10:5da9b27e050e | 72 | Tank(int sx, int sy, int width, int height, int color) { |
jford38 | 10:5da9b27e050e | 73 | x = sx; y = sy; |
jford38 | 10:5da9b27e050e | 74 | w = width; h = height; |
jford38 | 10:5da9b27e050e | 75 | tank_color = color; |
jford38 | 10:5da9b27e050e | 76 | barrel_theta = PI/4.0; |
jford38 | 10:5da9b27e050e | 77 | barrel_length = w; |
jford38 | 10:5da9b27e050e | 78 | wheel_rad = 2.0; |
jford38 | 10:5da9b27e050e | 79 | draw(); |
jford38 | 10:5da9b27e050e | 80 | } |
jford38 | 10:5da9b27e050e | 81 | int min_x(void) { return x; } |
jford38 | 10:5da9b27e050e | 82 | int min_y(void) { return y; } |
jford38 | 11:f455e907baba | 83 | int max_x(void) { return x + w + ceil(barrel_length*cos(barrel_theta)); } |
jford38 | 10:5da9b27e050e | 84 | int max_y(void) { return y + h + wheel_rad + ceil(barrel_length*sin(barrel_theta)); } |
jford38 | 10:5da9b27e050e | 85 | |
jford38 | 11:f455e907baba | 86 | void reposition(int new_x, int new_y, float new_theta) { |
jford38 | 10:5da9b27e050e | 87 | sync.filled_rectangle(min_x(), min_y(), max_x(), max_y(), SKY_COLOR); |
jford38 | 11:f455e907baba | 88 | sync.line(x + w/2.0, y+h+wheel_rad, x + w/2.0 + 1 + barrel_length*cos(barrel_theta), y+h + barrel_length*sin(barrel_theta), SKY_COLOR); |
jford38 | 10:5da9b27e050e | 89 | x = new_x; y = new_y; barrel_theta = new_theta; |
jford38 | 10:5da9b27e050e | 90 | draw(); |
jford38 | 10:5da9b27e050e | 91 | } |
jford38 | 10:5da9b27e050e | 92 | void draw() { |
jford38 | 10:5da9b27e050e | 93 | sync.line(x + w/2.0, y+h+wheel_rad, x + w/2.0 + barrel_length*cos(barrel_theta), y+h+wheel_rad + barrel_length*sin(barrel_theta), BLACK); |
jford38 | 10:5da9b27e050e | 94 | sync.filled_rectangle(x, y+wheel_rad, x+w, y+h+wheel_rad, tank_color); |
jford38 | 10:5da9b27e050e | 95 | sync.filled_circle(x+wheel_rad, y+wheel_rad, wheel_rad, BLACK); |
jford38 | 10:5da9b27e050e | 96 | sync.filled_circle(x+w-wheel_rad, y+wheel_rad, wheel_rad, BLACK); |
jford38 | 10:5da9b27e050e | 97 | } |
jford38 | 10:5da9b27e050e | 98 | }; |
jford38 | 10:5da9b27e050e | 99 | |
jford38 | 6:3be57cf4bd33 | 100 | void game_init(void) { |
jford38 | 6:3be57cf4bd33 | 101 | |
jford38 | 6:3be57cf4bd33 | 102 | led1 = 0; led2 = 0; led3 = 0; led4 = 0; |
jford38 | 6:3be57cf4bd33 | 103 | |
jford38 | 6:3be57cf4bd33 | 104 | pb_l.mode(PullUp); |
jford38 | 6:3be57cf4bd33 | 105 | pb_r.mode(PullUp); |
jford38 | 6:3be57cf4bd33 | 106 | pb_u.mode(PullUp); |
jford38 | 6:3be57cf4bd33 | 107 | pb_d.mode(PullUp); |
jford38 | 6:3be57cf4bd33 | 108 | |
jford38 | 6:3be57cf4bd33 | 109 | pc.printf("\033[2J\033[0;0H"); // Clear the terminal screen. |
jford38 | 6:3be57cf4bd33 | 110 | pc.printf("I'm alive! Player 1\n"); // Let us know you made it this far. |
jford38 | 7:9506f2d84162 | 111 | int mode = game_menu(); |
jford38 | 9:ee330b1ba394 | 112 | sync.init(&uLCD, mode); // Connect to the other player. |
jford38 | 10:5da9b27e050e | 113 | map_init(); |
jford38 | 6:3be57cf4bd33 | 114 | pc.printf("Initialized...\n"); // Let us know you finished initializing. |
jford38 | 6:3be57cf4bd33 | 115 | } |
jford38 | 6:3be57cf4bd33 | 116 | |
jford38 | 0:899c85cd266f | 117 | int main (void) { |
jford38 | 8:e6dd05393290 | 118 | int* p2_buttons; |
jford38 | 8:e6dd05393290 | 119 | |
jford38 | 8:e6dd05393290 | 120 | game_init(); |
jford38 | 8:e6dd05393290 | 121 | |
jford38 | 10:5da9b27e050e | 122 | Tank t1(4, 20, 12, 8, TANK_RED); |
jford38 | 10:5da9b27e050e | 123 | Tank t2(111, 20, 12, 8, TANK_BLUE); |
jford38 | 5:cfec780c935b | 124 | |
jford38 | 0:899c85cd266f | 125 | while(1) { |
jford38 | 11:f455e907baba | 126 | sync.line(0,0, 5,5, BLACK); // Update pukes if you try to send nothing :P |
jford38 | 9:ee330b1ba394 | 127 | sync.update(); |
jford38 | 8:e6dd05393290 | 128 | |
jford38 | 8:e6dd05393290 | 129 | p2_buttons = sync.get_button_state(); |
jford38 | 8:e6dd05393290 | 130 | |
jford38 | 8:e6dd05393290 | 131 | led1 = p2_buttons[0] ^ !pb_u; |
jford38 | 8:e6dd05393290 | 132 | led2 = p2_buttons[1] ^ !pb_r; |
jford38 | 8:e6dd05393290 | 133 | led3 = p2_buttons[2] ^ !pb_d; |
jford38 | 8:e6dd05393290 | 134 | led4 = p2_buttons[3] ^ !pb_l; |
jford38 | 11:f455e907baba | 135 | |
jford38 | 11:f455e907baba | 136 | if(!pb_l) t1.reposition(t1.x-1, t1.y, t1.barrel_theta); |
jford38 | 11:f455e907baba | 137 | if(!pb_r) t1.reposition(t1.x+1, t1.y, t1.barrel_theta); |
jford38 | 11:f455e907baba | 138 | if(p2_buttons[3]) t2.reposition(t2.x-1, t2.y, t2.barrel_theta); |
jford38 | 11:f455e907baba | 139 | if(p2_buttons[1]) t2.reposition(t2.x+1, t2.y, t2.barrel_theta); |
jford38 | 11:f455e907baba | 140 | |
jford38 | 11:f455e907baba | 141 | if(!pb_d) t1.reposition(t1.x, t1.y, t1.barrel_theta+PI/30.0); |
jford38 | 11:f455e907baba | 142 | if(!pb_u) t1.reposition(t1.x, t1.y, t1.barrel_theta-PI/30.0); |
jford38 | 11:f455e907baba | 143 | if(p2_buttons[0]) t2.reposition(t2.x, t2.y, t2.barrel_theta+PI/30.0); |
jford38 | 11:f455e907baba | 144 | if(p2_buttons[2]) t2.reposition(t2.x, t2.y, t2.barrel_theta-PI/30.0); |
jford38 | 11:f455e907baba | 145 | |
jford38 | 11:f455e907baba | 146 | |
jford38 | 3:3ddefff03cb2 | 147 | } |
jford38 | 0:899c85cd266f | 148 | } |