Flash AS3 гравитация и прыжки

Используя ActionScript 3, я создаю платформерную игру на Flash CC. Мой код работает нормально, но я не удовлетворен прыжком моего персонажа.

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

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

У моего персонажа есть имя экземпляра SDeer:

import flash.events.MouseEvent;
var xdir: int = 0;
var ydir: int = 0;
var speed: int = 10;
var jumping = false;
var gravity: int = 1.5;
var floor : int = 400;
var LeftUp : Boolean;
var RightUp : Boolean;



SDeer.gotoAndStop ('Still');

RightButton.addEventListener (MouseEvent.MOUSE_DOWN, onRight);
JumpButton.addEventListener (MouseEvent.MOUSE_DOWN, onJump);
LeftButton.addEventListener (MouseEvent.MOUSE_DOWN, onLeft);
LeftButton.addEventListener (MouseEvent.MOUSE_UP, LeftOnUp);
RightButton.addEventListener (MouseEvent.MOUSE_UP, RightOnUp);
DuckButton.addEventListener (MouseEvent.MOUSE_DOWN, onDuck);
addEventListener(MouseEvent.MOUSE_UP, onUp);
addEventListener(Event.ENTER_FRAME, onEnterFrame);

function onRight (e:MouseEvent): void {
    SDeer.gotoAndStop ('Running');
    xdir = 1;
}

function onJump (e:MouseEvent): void {

    if (LeftUp == true){
        SDeer.gotoAndStop ('JumpLeft')
    }

    else {
    SDeer.gotoAndStop ('Jumping');
    }

    ydir = -1;
}

function onDuck (e:MouseEvent): void {

    if (LeftUp == true && RightUp == false){
        SDeer.gotoAndStop ('DuckLeft')
    }

    else if (RightUp == true && LeftUp == false){
    SDeer.gotoAndStop ('Duck');
    }

    ydir = 1;
}

function onUp (e:MouseEvent): void {
    if (LeftUp == true && RightUp == false) {
        SDeer.gotoAndStop ('LeftStill');
    }

    else if (RightUp == true && LeftUp == false){
    SDeer.gotoAndStop ('Still');
    }


    xdir = 0;
    ydir = 0;
}

function onLeft (e:MouseEvent) : void {
    SDeer.gotoAndStop ('RunLeft');
    xdir = -1;
}

function LeftOnUp (e:MouseEvent) : void {
    LeftUp = true;
    RightUp = false;
}

function RightOnUp (e:MouseEvent) : void {
    LeftUp = false;
    RightUp = true;
}



function onEnterFrame(e: Event): void {
  SDeer.x += xdir * speed;
  SDeer.y += ydir * speed;
}

//Hit check
stage.addEventListener(Event.ENTER_FRAME, hitCheck);
function hitCheck(event: Event): void {

  SDeer.y += gravity;
  if (SDeer.y + SDeer.height / 2 < floor){
  gravity++;
  }

  else {
  gravity = 0;
  SDeer.y = floor - SDeer.height / 2;
  }
}

1 ответ

Не сбрасывайте гравитацию. Вместо этого, скорость зависит от силы тяжести. Например...

var gravity:Number = 9.8; // meters/second/second standard, but can be whatever
var jumpVel:Number = 0;

function onJump( e:MouseEvent ) : void
{
    if (LeftUp == true){
        SDeer.gotoAndStop ('JumpLeft')
    }
    else {
        SDeer.gotoAndStop ('Jumping');
    }

    jumpVel Number = -20; // 45mph!
}

... и в вашем обработчике ENTER_FRAME...

    if ( jumpVel != 0 )
    {
        SDeer.y += jumpVel / stage.frameRate;
        jumpVel += gravity / stage.frameRate;
        if ( SDeer.y + SDeer.height >= floor )
        {
            jumpVel = 0;
            SDeer.y = floor - SDeer.height;
        }
    }

У меня есть связанный ответ на ActionScript 3, Как заставить персонажа прыгать дольше

Другие вопросы по тегам