Проблема масштабирования тела в реальном времени в Corona SDK - PullRequest
1 голос
/ 13 февраля 2012

Моя цель состоит в том, чтобы создать платформу от одной координаты x, y до события касания таким образом, чтобы при перемещении пальца размер платформы изменялся в реальном времени.Однако проблема в том, что если на упомянутой платформе есть шар, и я затем перемещаю платформу, шар замерзнет и перестанет действовать как шар, пока не будет выполнена манипуляция платформой.

Есть ли способ заставить шары продолжать вести себя как обычно, даже когда платформа, на которой они движутся, перемещается?

Я включил код, чтобы вы могли поиграть с ними посмотри, что я имею в виду.Лучший способ понять, о чем я говорю, - щелкнуть мышью, чтобы создать платформу, подождать, пока на нее упадет шар, а затем перетащить конец платформы.

        local physics = require("physics");
physics.start();
physics.setDrawMode("hybrid");
W = display.contentWidth;
H = display.contentHeight;

balls = {};

local function createPlatform(event)
    if (event.phase == "began") then
        if(line) then
            line.parent:remove(line);
        end
        x = (event.x - (W/2 - 80));
        y = (event.y - (H/2));
        line = display.newLine(W/2 - 80, H/2, event.x, event.y)
        line.width = 5;
        physics.addBody(line, "static", {shape = {0, 0, x, y}});
        line.isBullet = true;
    end
    if (event.phase == "moved") then
        x = (event.x - (W/2 - 80));
        y = (event.y - (H/2));
        if (line) then
            line.parent:remove(line);
        end
        line = display.newLine(W/2 - 80, H/2, event.x, event.y)
        line.width = 5;
        physics.addBody(line, "static", {shape = {0, 0, x, y}});
        line.isBullet = true;
    end
    if (event.phase == "ended") then

    end
end

local function spawnBalls(event)

    i = 1;
    local function spawnb(event)
        rand = math.random(1, 4);
            if (rand == 1) then
                balls[i] = display.newCircle(math.random(140, 180), -30, 7.5);
                balls[i]:setFillColor(255,0,0);
                physics.addBody(balls[i], {radius = 7.5})
                balls[i].isBullet = true;
                i = i + 1;
                rand = math.random(1,4)
            elseif (rand == 2) then
                balls[i] = display.newCircle(math.random(140, 180), -30, 7.5);
                balls[i]:setFillColor(0, 255, 0);
                physics.addBody(balls[i], {radius = 7.5})
                balls[i].isBullet = true;
                i = i + 1;
                rand = math.random(1,4)
            elseif (rand == 3) then
                balls[i] = display.newCircle(math.random(140, 180), -30, 7.5);
                balls[i]:setFillColor(0, 0, 255)
                physics.addBody(balls[i], {radius = 7.5})
                balls[i].isBullet = true;
                i = i + 1;
                rand = math.random(1,4)
            elseif (rand == 4) then
                balls[i] = display.newCircle(math.random(140, 180), -30, 7.5);
                balls[i]:setFillColor(255, 255, 0);
                physics.addBody(balls[i], {radius = 7.5})
                balls[i].isBullet = true;
                i = i + 1;
                rand = math.random(1,4)
            end
        end
    timer.performWithDelay(1500, spawnb, -1);
end

spawnBalls();

Runtime:addEventListener("touch", createPlatform)

1 Ответ

0 голосов
/ 13 февраля 2012

Я думаю, это происходит потому, что вы удаляете тело (линию) до того, как Box2D сможет рассчитать новые позиции / скорости для тел (при перемещении пальца, мыши по экрану) ... вы можете попробовать увеличить итерации положения и частоту кадров ... но это не очень рекомендуется из-за потери производительности.
Я бы порекомендовал вращать и чистить тело, не снимая его и добавляя новое. Вы можете использовать .rotation и .xScale / .yScale.

Не пробовал, но я так и сделал. Я тоже новичок в Corona ... так что никаких гарантий.

...