Game Development Reference

In-Depth Information

var hitting:Boolean = wall.hitTestObject(_ballDO);

if (hitting)

{

var ballRect:Rectangle = _ball.getRect

(_currentLevel);

var wallRect:Rectangle = wall.getRect

(_currentLevel);

var intersection:Rectangle = ballRect.

intersection(wallRect);

if (!intersection.width && !intersection.

height) continue;

var rectCenter:Point = new Point

(intersection.x + intersection.width/2,

intersection.y + intersection.height/2);

var angle:Number = Math.atan2(rectCenter.

y - _ball.y, rectCenter.x - _ball.x);

angle = Math.round(angle/(Math.PI/2));

angle *= Math.PI/2;

var angleSin:Number = Math.sin(angle);

var angleCos:Number = Math.cos(angle);

var offsetX:Number = angleCos * intersection.

width;

var offsetY:Number = angleSin * intersection.

height;

_ball.x -= offsetX;

_ball.y -= offsetY;

}

}

}

The
checkCollisions
method is the one in which the heaviest

mathintheengineoccurs.Everyoneoftheindividualwallseg-

ments is tested against the ball to see if they overlap. First, every

comparison starts with the rather blunt but fast
hitTestObject
check.

If there is a collision, a more informative test is performed. This is

done by getting the bounding box rectangles of both objects and

by determining their rectangle of overlap (or intersection). The

angle of the collision is then determined by measuring the angle

between the middle of the ball and middle of the collision rectan-

gle. This is illustrated in
Fig. 15.7
. The gray area represents the col-

lision rectangle. The dashed line connecting the center point of the