Коробка на круг столкновения AS3 - PullRequest
1 голос
/ 24 февраля 2012

Я пытаюсь реализовать столкновение aabb to circle.

Вот мой код:

     //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

Что-то мне не хватает в моей логике ???

Мои столкновения box-box и окружность-круг работают нормально.


Заранее спасибо за помощь.

Ответы [ 2 ]

2 голосов
/ 24 февраля 2012

Эта строка выглядит не совсем правильно:

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;
}
0 голосов
/ 24 февраля 2012

Есть хорошая статья об использовании теоремы о разделяющей оси для двумерного обнаружения столкновений.Отлично читайте, если хотите узнать, как работает 2d обнаружение столкновений.

...