Simple hitTest with directions

Started by
2 comments, last by codyrigney92 11 years, 10 months ago
Hello people, it's my first time here so i not sure this is the right forum for the topic but aways, i trying to make a box collision function that returns what direction the box has collided (1 for left, 2 for right, 3 for up, 4 for down) and returns 0 in no collision, but i have econtered various issues in what seems to me like functional logic. here's my funcion i using SDL for C btw. I'd be happy if someone could point out the problem with my code or provide a better solution (in code) it would help very much.


int TestCollision(SDL_Rect a, SDL_Rect b){
int Aleft = a.x;
int Aright = a.x + a.w;
int Atop = a.y;
int Abottom = a.y+a.h;

int Bleft = b.x;
int Bright = b.x + b.w;
int Btop = b.y;
int Bbottom = b.y+b.h;
bool bottom = Abottom < Bbottom;
bool top = Atop > Btop;
bool left = Aright > Bleft;
bool right = Aleft < Bright;
if((left && top) || (left && bottom))
return 2;

if((right && top) || (right && bottom))
return 1;

if((top && left) || (top && right))
return 3;

if((bottom && left) || (bottom && right))
return 4;

return 0;
}


thanks for reading :)
Advertisement
It looks like you have it there without the complex if statements (I'm assuming A is the window and B is a box?).


if (left)
return 1;
if (right)
return 2;
if (up)
return 3;
if (down)
return 4;
else
return 0;


Your booleans show whether one point is already pass another.
Curtis Clark
Software Engineer
Aerospace and Defence Industry
ok i did what you said and modified my code a bit but still, only left collision works.
can you show me how to fix my booleans

btw a is supposed to be the player and b is supposed to be a wall.

here is my current code

int TestCollision(SDL_Rect a, SDL_Rect b){
int Aleft = a.x;
int Aright = a.x + a.w;
int Atop = a.y;
int Abottom = a.y+a.h;

int Bleft = b.x;
int Bright = b.x + b.w;
int Btop = b.y;
int Bbottom = b.y+b.h;
bool bottom = Abottom < Bbottom;
bool top = Atop > Btop;
bool left = Aright > Bleft;
bool right = Aleft < Bright;

if(isColliding(a, b)==true){
if(left)
return 2;

if(right)
return 1;

if(top)
return 3;

if(bottom)
return 4;
}

return 0;
}
bool isColliding(SDL_Rect a, SDL_Rect b) {
int left1 = a.x;
int right1 = a.x + a.w;
int top1 = a.y;
int bottom1 = a.y+a.h;

int left2 = b.x;
int right2 = b.x + b.w;
int top2 = b.y;
int bottom2 = b.y+b.h;
if( bottom1 < top2 ) {
return false;
}
if( top1 > bottom2 ) {
return false;
}
if( right1 < left2 ) {
return false;
}
if( left1 > right2 ) {
return false;
}

return true;
}
It looks to me like since left is your first one, that is why it is the only one working. If another one is true but left is also true, it will never get to the other ones. You will probably have to fix the logic

This topic is closed to new replies.

Advertisement