Обнаружение столкновения окружности с прямоугольником не работает в Corona SDK - PullRequest
1 голос
/ 22 августа 2011

Мне нужно было избавиться от физики в моей игре, поэтому мне нужно было реализовать пользовательскую функцию обнаружения столкновений (функция обнаружения столкновений вызывается каждый кадр).Я хочу проверить, пересек ли прямоугольник окружность.Я взял код от здесь (ответ от e.James):

bool intersects(CircleType circle, RectType rect)
{
    circleDistance.x = abs(circle.x - rect.x - rect.width/2);
    circleDistance.y = abs(circle.y - rect.y - rect.height/2);

    if (circleDistance.x > (rect.width/2 + circle.r)) { return false; }
    if (circleDistance.y > (rect.height/2 + circle.r)) { return false; }

    if (circleDistance.x <= (rect.width/2)) { return true; } 
    if (circleDistance.y <= (rect.height/2)) { return true; }

    cornerDistance_sq = (circleDistance.x - rect.width/2)^2 +
                         (circleDistance.y - rect.height/2)^2;

    return (cornerDistance_sq <= (circle.r^2));
}

И изменил его на это:

--Collision detection between circle and rect
local function intersects(circle, rect)
    if circle ~= nil then
        local circleDistance_x = math.abs(circle.x - rect.x - rect.width/2);
        local circleDistance_y = math.abs(circle.y - rect.y - rect.height/2);

        if (circleDistance_x > (rect.width/2 + circle.r)) then 
            return false
        end
        if (circleDistance_y > (rect.height/2 + circle.r)) then  
            return false
        end

        if (circleDistance_x <= (rect.width/2)) then
            return true
        end

        if (circleDistance_y <= (rect.height/2)) then
            return true
        end

        cornerDistance_sq = (circleDistance_x - rect.width/2)^2 +
                             (circleDistance_y - rect.height/2)^2;

        return (cornerDistance_sq <= (circle.r^2));
        else
            return false
    end
end

Я обязательно далкруг r свойство и сделал его 20. Я не получаю никаких ошибок.И прямоугольники удаляются, когда они приближаются к кругу (кажется, что функция возвращает истину, когда прямоугольник попадает в центр круга, но я могу ошибаться).Я что-то не так делаю в своем обращении?

1 Ответ

1 голос
/ 22 августа 2011

Изменение этих двух строк:

    local circleDistance_x = math.abs(circle.x - rect.x - rect.width/2);
    local circleDistance_y = math.abs(circle.y - rect.y - rect.height/2);

Кому:

    local circleDistance_x = math.abs(circle.x+circle.r - rect.x - rect.width/2)
    local circleDistance_y = math.abs(circle.y+circle.r - rect.y - rect.height/2)

Кажется, чтобы сделать трюк. Ура для случайного угадывания!

...