The classic dueling tanks game for mbed.
Dependencies: 4DGL-uLCD-SE DRV2605 EthernetInterface Game_Synchronizer MMA8452 SDFileSystem SparkfunAnalogJoystick mbed-rtos mbed wave_player
Fork of 2035_Tanks_Shell by
Tank/tank.cpp
- Committer:
- macenzofan
- Date:
- 2017-03-13
- Revision:
- 28:8dbb85f35be6
- Parent:
- 27:bd55ab4d137c
File content as of revision 28:8dbb85f35be6:
#include "tank.h" #include "globals.h" #include "math.h" #include "game_synchronizer.h" #include "uLCD_4DGL.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 = .75*w; wheel_rad = 2.0; draw(); } // Return the minimum x-coord of your tank's bounding box. int Tank::min_x(void) { if(w/2.0+x+barrel_length*cos(barrel_theta)<x){ return w/2.0+x+barrel_length*cos(barrel_theta); } else{ return x; } } // Return the minimum y-coord of your tank's bounding box. int Tank::min_y(void) { return y+wheel_rad; } // Return the maximum x-coord of your tank's bounding box. int Tank::max_x(void) { if(w/2.0+w+barrel_length*cos(barrel_theta)>x+w){ return x+w/2+barrel_length*cos(barrel_theta);; } else{ return x+w; } } // Return the maximum y-coord of your tank's bounding box. int Tank::max_y(void) { return y+h+wheel_rad+barrel_length*sin(barrel_theta); } 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) { if(dx!=0 || dy!=0 || dtheta!=0){ x=x+dx; y=y+dy; sync.filled_rectangle(x-4, y-1, x+20, y+21, SKY_COLOR);// Blank out the old tank position, and sync.filled_circle(53, 26, 6, TREE); draw(); // Move the tank dx pixels in the x direction. sync.filled_circle(53, 26, 6, TREE); //sync.line(76,23,76,50, BLACK); //sync.rectangle(74, 20, 75, 50, WHITE); sync.filled_circle(78, 19, 4, TREE); // Move the tank dy pixels in the y direction. sync.update(); if(0 <= barrel_theta+dtheta && barrel_theta+dtheta <= PI){ // Move the tank barrel by an angle dtheta. 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);// Don't allow it to go below parallel. barrel_theta += dtheta; 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+2*wheel_rad, y+3*wheel_rad, x+.65*w, y+h+3*wheel_rad, tank_color); sync.update(); } //if((x){ //Do collision detection to prevent the tank from hitting things. //(x)=x+1; //} //if(x+16>127){ //Do collision detection to prevent the tank from hitting things. //x=111; //} //int obsticle=sync.read_pixel(x+20,y); //if(sync.pixel_eq(obsticle, SKY_COLOR)!=1){ //x=x-1; //} // (obstacles, side of the screen, other tanks, etc.) } } // Example tank draw function. We expect you to get creative on this one! void Tank::draw() { //if(x>4 || x<111){ 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), BARREL_GREY); sync.filled_circle(x+wheel_rad, y+wheel_rad, wheel_rad, BARREL_GREY); sync.filled_circle(x+w-wheel_rad, y+wheel_rad, wheel_rad, BARREL_GREY); sync.filled_circle(x+(w/1.475)-wheel_rad,y+wheel_rad, wheel_rad, BARREL_GREY); sync.filled_rectangle(x, y+(2*wheel_rad), x+w, y+h+wheel_rad, tank_color); sync.filled_rectangle(x+2*wheel_rad, y+3*wheel_rad, x+.65*w, y+h+3*wheel_rad, tank_color); sync.line(x+wheel_rad,y-.5*wheel_rad, x+w-wheel_rad, y-.5*wheel_rad, BARREL_GREY); sync.line(x+(2*wheel_rad), y+h+wheel_rad, x+.65*w, y+h+wheel_rad, BLACK); //} }