Box to Circle Collision AS3

时间:2012-02-24 05:13:17

标签: actionscript-3 collision-detection physics geometry

我正在尝试用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;
        }
     }

不知何故碰撞确实按预期工作。 他们要么根本不动,而且“碰撞”被追踪,或者当我尝试交换价值时,他们会继续移动并且永远不会碰撞。 collision detection

我的逻辑中是否缺少某些东西???

我的盒子和圆圈碰撞工作正常。


提前感谢您的帮助。

2 个答案:

答案 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碰撞检测是如何工作的,请仔细阅读。