Flash as3 физика перетаскивания

Во Flash cc as3 я хотел бы знать, как решить проблему, с которой я столкнулся, проблема в том, что я делаю игру с перетаскиванием. Когда вы перетаскиваете объект, он движется, когда вы бросаете его, сила тяжести притягивает его к земле. Но мне нужно знать, как заставить объект не останавливаться в воздухе, а слегка двигаться по оси X, а затем приземляться, а не если вы бросите его изо всех сил, он остановится в воздухе и приземлится вместо того, чтобы изящно приземлиться ...

Вот мой код

var drag:Number = 1;

gotoAndStop(1, "Minigame-Block");

Block1.addEventListener(MouseEvent.MOUSE_DOWN, fl_ClickToDrag_4);

function fl_ClickToDrag_4(event:MouseEvent):void
{
    Block1.startDrag()
    gravity = 0
}

stage.addEventListener(MouseEvent.MOUSE_UP, fl_ReleaseToDrop_4);

function fl_ReleaseToDrop_4(event:MouseEvent):void
{
    Block1.stopDrag();
    gravity = 0.9
}

{
    var gravity = 0.9;
var floor = 711.95;
Block1.y = floor;
Block1.speedY = 0;
Block1.impulsion = 10;
stage.addEventListener(Event.ENTER_FRAME, enterframe);
function enterframe(e:Event) {
    Block1.speedY += gravity;
    Block1.y += Block1.speedY;
    if(Block1.y > floor) {
        Block1.speedY = 0;
        Block1.y = floor

    }

}
stage.addEventListener(KeyboardEvent.KEY_DOWN, space);
function space(e:KeyboardEvent) {
    if(e.keyCode == Keyboard.SPACE) {
        Block1.speedY = -Block1.impulsion
    }
}
}

person user3406023    schedule 28.06.2014    source источник


Ответы (1)


В мире без сопротивления воздуха компонент x скорости вашего объекта остается постоянным, а компонент y изменяется с постоянной скоростью из-за гравитации. Если пользователь держит объект неподвижно и бросает его, он должен падать вертикально, но если он бросает его, он должен падать по баллистической дуге (параболе).

Что вам нужно сделать, так это записать x-составляющую скорости во время перетаскивания, а затем продолжать добавлять эту составляющую к x-позиции, пока она падает. Это означает реализацию обработчика MOUSE_MOVE, который вычитает текущую позицию x из предыдущей позиции x, делит на количество кадров, прошедших с момента последнего события, и сохраняет его как Block1.speedX. Затем просто добавьте строку

Block1.y += Block1.speedY;
Block1.x += Block1.speedX;  // <--

Вы можете сделать это более подробно и вычислить speedX как скользящее среднее; это сделало бы физику более реалистичной.

person bobtato    schedule 28.06.2014
comment
Пожалуйста, не могли бы вы сказать, где и как добавить это в мой код, так как я БОЛЬШОЙ новичок! - person user3406023; 28.06.2014