2d collision detection for cse 3902 by: matt boggus
TRANSCRIPT
2D Collision Detection
For CSE 3902By: Matt Boggus
Outline
• Collision tests– 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 dataRaster 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