collisions

Started by
2 comments, last by GustavoCanedo 12 years, 4 months ago
I have been making many 2D games recently, and they all are sidescrollers, so they have collisions. I develop my games with C++ and the SDL library. The way I handle collisions right now is I go through each entity I have in my game and check if their SDL_Rect collides with eachother. But I've also run into the problem of getting exact collisions. I got a way of creating MANY SDL_Rects for a single sprite for per-pixel collisions.


So, I wanted to ask, what is the best way of handling collisions, but not using too much memory at the same time? And making sure the collisions are realistic or not?

Thanks.
Advertisement
From what I've seen hitboxes are pretty much the way to go for 2D sidescrollers. Check out this video
it shows hitboxes for Kirby in Super Smash Bros Melee, a very high end game which still uses hit boxes. The way to make the collisions seem realistic would probably be to create physics which push the things apart from each other when they collide which would look pretty natural.
Yeah, I have the "pushing away" from eachother part down. So basically, the collision box for a, lets say a collission box for a sword for meta knight, is bigger than really is?
[color="#333333"][font="arial, sans-serif"]I'm doing[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]a[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]collision detector[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]based on[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]line segments.[/font]
[color="#333333"][font="arial, sans-serif"]For a line[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]'r[/font][color="#333333"][font="arial, sans-serif"]' between[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]two[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]points[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"](A and[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]B[/font][color="#333333"][font="arial, sans-serif"])[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]we have:[/font][color="#333333"][font="arial, sans-serif"]Being[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]'A'[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]the first point and[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]AB[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]('[/font][color="#333333"][font="arial, sans-serif"]B'[/font][color="#333333"][font="arial, sans-serif"]-[/font][color="#333333"][font="arial, sans-serif"]'A[/font][color="#333333"][font="arial, sans-serif"]'[/font][color="#333333"][font="arial, sans-serif"]) the[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]direction vector[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]of the line[/font][color="#333333"][font="arial, sans-serif"].[/font]
[font="arial, sans-serif"] [/font][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]If the[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]alpha value to[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]a[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]tu[/font][color="#333333"][font="arial, sans-serif"]ple[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"](x[/font][color="#333333"][font="arial, sans-serif"], y[/font][color="#333333"][font="arial, sans-serif"])[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]is greater than or[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]equal to zero[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]and less than or[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]equal to[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]one[/font][color="#333333"][font="arial, sans-serif"], the line[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]r[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]becomes[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]a[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]line segment [/font][color="#333333"][font="arial, sans-serif"]bounded[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]by A and[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]B.[/font]99744058.png
[color="#333333"][font="arial, sans-serif"]Adding[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]another[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]line segment,[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]the value[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]of the tuple[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]([/font][color="#333333"][font="arial, sans-serif"]x,[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]y) that[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]gives[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]solution to[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]the two equations[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]define[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]the collision point[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"](called[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]P[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]in the drawing)[/font][color="#333333"][font="arial, sans-serif"].[/font]
[color="#333333"][font="arial, sans-serif"] [/font]
[color="#333333"][font="arial, sans-serif"]81497740.png
[/font]
[font="arial, sans-serif"] [/font]

[font="arial, sans-serif"][color="#333333"]P = (x,y)[/font]
[font="arial, sans-serif"] [/font]
[color="#333333"][font="arial, sans-serif"]([/font][color="#333333"][font="arial, sans-serif"]matching[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]'r[/font][color="#333333"][font="arial, sans-serif"]' and '[/font][color="#333333"][font="arial, sans-serif"]s[/font][color="#333333"][font="arial, sans-serif"]' to find[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]the common point[/font][color="#333333"][font="arial, sans-serif"])[/font][color="#333333"][font="arial, sans-serif"].[/font]
[font="arial, sans-serif"][color="#333333"]rx = sx[/font]
[font="arial, sans-serif"][color="#333333"]ry = sy[/font]
[font="arial, sans-serif"][color="#333333"]rx = Ax alpha*(ABx)[/font]
[font="arial, sans-serif"][color="#333333"]sx =Cx beta*(CDx)[/font]
[font="arial, sans-serif"][color="#333333"]ry = Ay alpha*(ABy)[/font]
[font="arial, sans-serif"][color="#333333"]sy =Cy beta*(CDy)[/font]
[font="arial, sans-serif"] [/font]
[font="arial, sans-serif"][color="#333333"]Ax alfa*(ABx) = Cx beta*(CDx)[/font]
[font="arial, sans-serif"][color="#333333"]Ay alfa*(ABy) = Cy beta*(CDy)[/font][color="#333333"][font="arial, sans-serif"]As[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]all the values ??are[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]listed[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]in[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]the runtime,[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]we can find[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]the alpha[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]or beta[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]in the equation[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]and find[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]the values ??([/font][color="#333333"][font="arial, sans-serif"]from the point of[/font][color="#333333"][font="arial, sans-serif"]collision)[/font][color="#333333"][font="arial, sans-serif"].[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]If[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]0[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]<[/font][color="#333333"][font="arial, sans-serif"]=[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]alpha[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]<[/font][color="#333333"][font="arial, sans-serif"]=[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]1[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]and 0 <[/font][color="#333333"][font="arial, sans-serif"]=[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]beta[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]<[/font][color="#333333"][font="arial, sans-serif"]=[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]1[/font][color="#333333"][font="arial, sans-serif"], there will be[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]a[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]collision point[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]([/font][color="#333333"][font="arial, sans-serif"]to discover [/font][color="#333333"][font="arial, sans-serif"]the collision point,[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]just[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]a[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]replace alpha or beta in an equation).[/font]
[color="#333333"][font="arial, sans-serif"] [/font]
[color="#333333"][font="arial, sans-serif"]To help[/font][color="#333333"][font="arial, sans-serif"],[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]here's[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]the C++ code that[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]I'm[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]using[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"](the solutions[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]have a small[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]bug[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]when the[/font][color="#333333"][font="arial, sans-serif"] lines[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]are parallels ([/font][color="#333333"][font="arial, sans-serif"]ABX[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]/[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]==[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]Aby[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]CDx[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]/[/font][color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]CDy[/font][color="#333333"][font="arial, sans-serif"])[/font][color="#333333"][font="arial, sans-serif"], but it's very easy to fix).[/font]
[color="#333333"][font="arial, sans-serif"] [/font][color="#333333"][font="arial, sans-serif"]bool Juncao::colisaoSegmento(Coord a, Coord b, Coord c, Coord d){
b.set(b.getX()-a.getX(),b.getY()-a.getY(),0);
d.set(d.getX()-c.getX(),d.getY()-c.getY(),0);

float alfa,beta;

if(b.getX()==0){
if(d.getY() == 0){
alfa = (c.getY()-a.getY())/b.getY();
beta = (a.getX()-c.getX())/d.getX();
} else{
alfa = (((a.getX()-c.getX())/(d.getX()*d.getY()))+c.getY()-a.getY())/d.getY();
beta = (alfa*b.getY()-c.getY()-a.getY())/d.getY();
}
} else{
float j = d.getY();
float i = (d.getX()*b.getY())/b.getX();
float k = a.getY()+(b.getY()*c.getX())/b.getX();
float l = c.getY() + (a.getX()*b.getY())/b.getX();
beta = (k-l)/(j-i);
alfa = (c.getX()+beta*d.getX()-a.getX())/b.getX();
}

if(alfa >=0 && alfa <=1)
if(beta >=0 && beta <=1)
return true;
return false;

}

[/font]
[color="#333333"][font="arial, sans-serif"] [/font]
[font="arial, sans-serif"][color="#333333"]Thats it![/font]
[font="arial, sans-serif"][color="#333333"]I hope that i have helped and sorry for my horrible english xD.[/font]

This topic is closed to new replies.

Advertisement