Game for 4180 Lab4

Dependencies:   4DGL-uLCD-SE 4180_lab4_tank_war_game Game_Synchronizer MMA8452 SDFileSystem mbed-rtos mbed wave_player

Dependents:   4180_lab4_tank_war_game

Revision:
0:ffed9a3bc797
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Tank/tank.cpp	Mon Mar 13 21:23:17 2017 +0000
@@ -0,0 +1,103 @@
+#include "tank.h"
+#include "globals.h"
+#include "math.h"
+#include "game_synchronizer.h"
+
+extern Game_Synchronizer sync;
+
+// sx is the x-coord of the bottom left corner of the tank
+// sy is the y-coord of the same corner
+// width is the width of the tank
+// height is the height of the tank
+Tank::Tank(int sx, int sy, int width, int height, int color) {
+    x = sx; y = sy;
+    w = width; h = height;
+    tank_color = color;
+    barrel_theta = PI/4.0;
+    barrel_length = w;
+    wheel_rad = 2.0;
+    draw();
+}
+
+void Tank::changeSky(int SKY_COLOR2) {
+    SKY_COLOR = SKY_COLOR2;
+}
+
+// Return the minimum x-coord of your tank's bounding box.
+int Tank::min_x(void) { 
+    return x;
+}    
+
+// Return the minimum y-coord of your tank's bounding box.
+int Tank::min_y(void) {
+    return y;
+}
+
+// Return the maximum x-coord of your tank's bounding box.
+int Tank::max_x(void) { 
+    return x + w;
+}
+
+// Return the maximum y-coord of your tank's bounding box.
+int Tank::max_y(void) {  
+    return y + h + wheel_rad;
+}
+
+void Tank::barrel_end(int* bx, int* by) {
+    // Set the x and y coords of the end of the barrel.
+    *bx = x + w/2.0 + barrel_length*cos(barrel_theta);
+    *by = y + h + wheel_rad + barrel_length*sin(barrel_theta);
+}
+
+void Tank::reposition(int dx, int dy, float dtheta) {
+    // Blank out the old tank position, and
+    //      Move the tank dx pixels in the x direction.
+    //      Move the tank dy pixels in the y direction.
+    //      Move the tank barrel by an angle dtheta. Don't allow it to go below parallel.
+    // Do collision detection to prevent the tank from hitting things. 
+    // (obstacles, side of the screen, other tanks, etc.)
+    
+    sync.filled_rectangle(min_x(), min_y(), max_x(), max_y(), SKY_COLOR );
+    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), SKY_COLOR);
+    // moving
+    if ((x + dx) < 0) {
+        // left boundary
+        x = 0;
+    } else if((x + w + dx) > 128) {
+        // right boundary
+        x = 128 - w;
+    } else if (dx < 0) {
+        // moving left
+        if ( (sync.pixel_eq(sync.read_pixel(min_x()+dx, min_y()), SKY_COLOR)) &&
+             (sync.pixel_eq(sync.read_pixel(min_x()+dx, min_y() + wheel_rad), SKY_COLOR)) ) {
+                x = x + dx;
+        }
+    } else if (dx > 0) {
+        // moving right
+        if ( (sync.pixel_eq(sync.read_pixel(max_x()+dx, min_y()), SKY_COLOR)) &&
+             (sync.pixel_eq(sync.read_pixel(max_x()+dx, min_y() + wheel_rad), SKY_COLOR)) ) {
+                x = x + dx;
+        }
+    }
+    // barrel moving
+    if ((barrel_theta + (PI/64.0) * dtheta) < 0) {
+        // not less than 0
+        barrel_theta = 0;
+    } else if ((barrel_theta + (PI/64.0) * dtheta) > PI) {
+        // not greater than pi
+        barrel_theta = PI;
+    } else {
+        // change barrel theta
+        barrel_theta = barrel_theta + (PI/64.0) * dtheta;
+    }
+    draw();
+}
+
+
+// Example tank draw function. We expect you to get creative on this one!
+void Tank::draw() {
+    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);
+    sync.filled_rectangle(x, y+wheel_rad, x+w, y+h+wheel_rad, tank_color);
+    sync.filled_circle(x+wheel_rad, y+wheel_rad, wheel_rad, BLACK);
+    sync.filled_circle(x+w-wheel_rad, y+wheel_rad, wheel_rad, BLACK);
+}            
\ No newline at end of file