我正在尝试用aabb来圈出碰撞。
这是我的代码:
//From another file
radius = (sprite.width + sprite.height) / 4;
private function BoxToCircleCollision(box1:BoundingBox, circle1:BoundingCircle):Boolean
{
var nBoxMinX:Number = box1.sprite.x - box1.sprite.width / 2;
//var nBoxMinY:Number = box1.sprite.x + box1.sprite.width / 2;
var nBoxMaxX:Number = box1.sprite.y - box1.sprite.height / 2;
//var nBoxMaxY:Number = box1.sprite.y + box1.sprite.height / 2;
var nCirMinX:Number = circle1.sprite.x - circle1.radius / 2;
//var nCirMinY:Number = circle1.sprite.y - circle1.radius;
var nCirMaxX:Number = circle1.sprite.x + circle1.radius / 2;
//var nCirMaxY:Number = circle1.sprite.y + circle1.radius;
if (nBoxMaxX, 2 > nCirMinX))
{
Main.WriteDebug("Box max: " + nBoxMaxX + " | Circle min: " + nCirMinX);
return true;
}
else
{
Main.WriteDebug("Box max: " + nBoxMaxX + " | Circle min: " + nCirMinX);
return false;
}
}
不知何故碰撞确实按预期工作。 他们要么根本不动,而且“碰撞”被追踪,或者当我尝试交换价值时,他们会继续移动并且永远不会碰撞。
我的逻辑中是否缺少某些东西???
我的盒子和圆圈碰撞工作正常。
提前感谢您的帮助。
答案 0 :(得分:2)
这一行看起来并不正确:
var nBoxMaxX:Number = box1.sprite.y - box1.sprite.height / 2;
也许你的意思是:
var nBoxMaxX:Number = box1.sprite.x + box1.sprite.width / 2;
这一行不会编译:
if (nBoxMaxX, 2 > nCirMinX))
编辑:
这是一个帮助您获得AABB< - >的功能。圆碰撞吧。这不是一个完整的解决方案,但你可以将它与你对AABB最小值和最大值的计算相结合,应该是微不足道的:
private function collideAABBandCircle(c : Circle, aabb:AABB) : Boolean {
var sqDist : Number = sqDist(c.centerPoint, aabb);
return sqDist <= c.radius * c.radius:
}
private function sqDist(p : Point, aabb:AABB) : Number {
/* CALCULATE min and max values of aabb bounds */
var sqDist : Number = 0.0;
if(p.x < minX) {
sqDist += (minX - p.x) * (minX - p.x);
}
if(p.x > maxX) {
sqDist += (p.x - maxX) * (p.x - maxX);
}
if(p.y < minY) {
sqDist += (minY - p.y) * (minY - p.y);
}
if(p.y > maxY) {
sqDist += (p.y - maxY) * (p.y - maxY);
}
return sqDist;
}
答案 1 :(得分:0)
关于使用分离轴定理进行2d碰撞检测,有一个很好的article。如果你想了解2d碰撞检测是如何工作的,请仔细阅读。