Tuesday, September 22, 2015

c++ - How to detect collision between two directed object?


I'm currently writing a game which is like Battle City game. But right now I'm facing a trouble involved to checking collision between two objects. This is the code that I wrote:



//-------------------------------------------------------------------------------------------
// check collision between a tank and another object
//
bool GameController::checkTankMeetsObject(Tank tank, GameObject ob)
{
int obX = ob.getCoord().getX();
int obY = ob.getCoord().getY();

// calculate area of obstacle: bottom left (X1, Y1), top right (X2, Y2)
int obX1 = obX - SQUARESIZE / 2;

int obX2 = obX + SQUARESIZE / 2;
int obY1 = obY - SQUARESIZE / 2;
int obY2 = obY + SQUARESIZE / 2;

int tankX = tank.getCoord().getX();
int tankY = tank.getCoord().getY();

switch (tank.getDir())
{
case UP:

if ((tankX < obX2 + SQUARESIZE / 2 && tankX > obX1 - SQUARESIZE / 2) &&
(tankY + SQUARESIZE / 2 > obY1 && tankY + SQUARESIZE / 2 < obY2))
return true;
break;

case DOWN:
if ((tankX < obX2 + SQUARESIZE / 2 && tankX > obX1 - SQUARESIZE / 2) &&
(tankY - SQUARESIZE / 2 > obY1 && tankY - SQUARESIZE / 2 < obY2))
return true;
break;


case LEFT:
if ((tankX - SQUARESIZE / 2 < obX2 && tankX - SQUARESIZE / 2 > obX1) &&
(tankY > obY1 - SQUARESIZE / 2 && tankY < obY2 + SQUARESIZE / 2))
return true;
break;

case RIGHT:
if ((tankX + SQUARESIZE / 2 < obX2 && tankX + SQUARESIZE / 2 > obX1) &&
(tankY > obY1 - SQUARESIZE / 2 && tankY < obY2 + SQUARESIZE / 2))

return true;
break;
}

return false;
}

This code does well with normal circumstance, but in special ones like which I describe below, it doesn't work.


enter image description here


The white squares are obstacles and the grey square is the tank. Current direction of the tank is RIGHT. In this situation, I can not move the tank RIGHT or LEFT, only direction I can go is DOWN. Is there any solution to optimize my code?





No comments:

Post a Comment

Simple past, Present perfect Past perfect

Can you tell me which form of the following sentences is the correct one please? Imagine two friends discussing the gym... I was in a good s...