jbhargav1992 at January 31st, 2014 12:30 — #1
I am developing a 2d platformer game using opengl.I managed to display sprites and the background image and I have given movements to the character now I need to implement collisions. Can anyone help me out on how to achieve pixel perfect collision detection? I have searched lot of websites and it's a bit confusing.
geekymonkey at February 1st, 2014 03:14 — #2
Pixel perfect is expensive, so limit when you do it. Do bounding box collision detection first. If that passes, then start pixel perfect detection of the 2 sprites.
loop over all the pixels of one sprite. is the texture there not transparent? If so, calculate the screen position (or world position) of the center of that pixel. Taking into account position, rotation, scale. using that screen position, find the corresponding pixel in the 2nd sprite. If its within the bounds of that sprite, then get the texture pixel. If its not transparent, you have a hit!
Do it simply as above. Create a test scene with oddly shaped sprites spinning or that you can move around. Have them change colors when collision is detected.
once you get that working, then think of ways to optimize things. Exit your loops on the first hit found. Limit the math in the loops to simple adding and multplying by precalculating delta vales for the pixel to next pixel location calculation. You want what's inside the nested loop to be as quick as possible.
stainless at February 1st, 2014 06:13 — #3
Or use polygon collision.
It takes a lot of work to create the collision polygons, you have to write an app to edit your sprite sequences and create a collision polygon for each frame, but you can make it as complex as you want.
I have in the past created collision polygons for individual body parts so I could do location based reactions.
dim_yimma_h at February 2nd, 2014 13:18 — #4
Maybe you would not prefer pixel perfect detection, in the end, there are easier methods. Try the bounding box collision detection first and see if it's enough.
bool Box::Overlaps(Box another)
if (bottom > another.top && top < another.bottom) //i.e. if the boxes overlap vertically
if (right > another.left && left < another.right)
return true; //and the boxes overlap horizontally too
If you have near rectangular sprites like humans, cars, tiles, it's usually easy to specify the box left,top,bottom, right sides so they feel pixel perfect upon overlap detection.
jbhargav1992 at February 3rd, 2014 23:57 — #5
OK... I think this is the more ideal method as it uses the concept of bounding box and gives the accuracy close to pixel perfect collisions. Thank you for your suggestion. I have one doubt, though... How would I go about creating collision polygons for my sprites? Please clarify this for me.
stainless at February 4th, 2014 04:57 — #6
You either write an app that allows you to create the polygons by hand, or you look online for a tool you can download.
The Torque 2D engine uses this technique, maybe you can grab a free version of that and use the editor to create the polygons.
jbhargav1992 at February 4th, 2014 23:44 — #7
Thanks, Stainless... I found this tool that can auto trace polygons and save a lot of time: PhysicsEditor. The only thing I don't understand is what format to save it to in order to use it in OpenGL. It has several formats, .plist, .xml, .flash, etc. Some of them are Box2D formats. And I know Box2D can be used with OpenGL. Just not sure which format to use. Please tell me. Thank you.
stainless at February 5th, 2014 05:12 — #8
Just have a look here and decide if you are going to use any of the engines
jbhargav1992 at February 5th, 2014 06:55 — #9
I've seen that page, but I am not sure how to use Box2D with OpenGL in C++. All the tutorials on the internet show Box2D used in collaboration with Cocos2D, which is, if I'm right, a full game engine. I don't want to use Cocos2D. I want to implement Box2D and write my own collisions in C++. How would I do that?
stainless at February 5th, 2014 09:43 — #10
Box2d tutorials show how to do your own renderers.
It's really easy.
Just look at those.
jbhargav1992 at February 5th, 2014 11:14 — #11
OK... Thanks, Stainless. I found some tutorials. I'll be looking through those.