2D Collision Detection For CSE 3902 By: Matt Boggus
Outline Collision tests Collision detection loops Pixel-pixel Square-square Axis-aligned bounding box (rectangle) testing Collision detection loops Exhaustive comparison Static objects vs. dynamic objects
Collision Detection tests
Pixel-pixel test Given sprite pixel data and position on screen, make a binary mask for each sprite Detection test (XOR == 1) Not intersecting (XOR == 0) AND (OR == 1) Intersecting Pro: Accurate Con: Slow; requires working with image data Raster graphic sprites (left) and masks (right)
Square-square test
Square-square test
Square-square top-bottom collision
Square-square left-right collision
Non-square collision example (values indicate top-bottom)
Axis-aligned bounding box testing
Axis-aligned bounding box testing
XNA rectangle and methods Given two rectangles rectangleA and rectangleB Rectangle.Intersects(Rectangle) Returns true if the rectangles are intersecting, otherwise false Example call: rectangleA.Intersects(rectangleB); Rectangle.Intersect Method (Rectangle, Rectangle) Returns the area where the two rectangles overlap, an empty rectangle if there is no overlap Example call: Rectangle.Intersect(rectangleA,rectangleB);
Rectangle Intersect left-right
Rectangle Intersect top-bottom
Types of Collision loops
Exhaustive comparison Given mario, enemyList (length n), and blockList (length m), test mario vs. enemyList[0] through [n-1] mario vs. blockList[0] through [m-1] enemyList[0] vs. enemyList[1] through [n-1] enemyList[1] vs. enemyList[2] through [n-1] … blockList[0] vs. blockList[1] through [m-1] ?
Static vs. Dynamic Non-moving, or static, objects only need to be compared against dynamics, not other static objects foreach static object, test against all dynamic objects foreach dynamic object, test against all other dynamic objects, taking care not to duplicate tests
More resources A few pseudocode examples on gamedev stackexchange Also look into tutorials on XNA subpage