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

Я делаю платформерную игру во Flash (AS3), и приведенный ниже код работает. Я хочу, чтобы мой персонаж прыгал достаточно высоко, чтобы дать ему время достичь платформы. Единственная проблема с кодом ниже - это скорость, с которой он прыгает вверх и вниз, и высота прыжка. Пробел - это то, что запускает функцию.

Пожалуйста, помогите, так как я был бы очень признателен!:)

Player.addEventListener(Event.ENTER_FRAME, fl_MoveInDirectionOfKey);
stage.addEventListener(KeyboardEvent.KEY_DOWN, fl_SetKeyPressed);
stage.addEventListener(KeyboardEvent.KEY_UP, fl_UnsetKeyPressed);

function fl_MoveInDirectionOfKey(event:Event)
{
    if (spacePressed){
        var gravity:Number = 9.8;
        var jumping:Boolean = false;
        var jumpVar:Number = 0;

        if(jumping != true)
        {
            jumpVar = -70;
            jumping = true;
        }

        if(jumping)
        {
            spacePressed = false;
            Player.y += jumpVar;
            jumpVar += gravity;
        }
        Player.addEventListener(Event.ENTER_FRAME, drop);
        function drop(event:Event)
        {
            Player.y -= jumpVar;
            jumpVar -= gravity;
            if(Player.y > 350){
                Player.y = 350;
            }
        }
        Player.removeEventListener(Event.ENTER_FRAME, fl_MoveInDirectionOfKey);
        Player.addEventListener(Event.ENTER_FRAME, fl_MoveInDirectionOfKey);

        /*var frameNumb:Number = 0;

        Player.addEventListener(Event.ENTER_FRAME, jumpup);
        spacePressed = false;
        function jumpup(event:Event)
        {
            while(frameNumb < 30){
                spacePressed = false;
                Player.y -= 1;
                frameNumb += 0.5;
            }
            Player.removeEventListener(Event.ENTER_FRAME, jumpup);
            Player.addEventListener(Event.ENTER_FRAME, jumpdown);
            function jumpdown(){
                while(frameNumb > 0){
                    spacePressed = false;
                    Player.y += 1;
                    frameNumb -= 0.5;
                }
            }
        }*/
    }
    if (leftPressed)
    {
        Player.x -= speed;
        Player.gotoAndStop("left");
    }
    if (rightPressed)
    {
        Player.x += speed;
        Player.gotoAndStop("right");
    }
}

Спасибо

1 ответ

Вы используете 9,8 для гравитации - метры в секунду в секунду. Поскольку drop() выполняется каждый кадр, вы получите серьезную ускоренную гравитацию, если только программа не выполняет только 1 кадр / с. Итак, если вы хотите больше текучести, чем 1 FPS, подумайте

    jumpVar += gravity/fps;


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

    initialVelocityInMetersPerSecond = Math.sqrt( 2 * gravity * metersToJump )

Так что вместо jumpVar = -70 вы бы сделали что-то вроде...

    // get posititive distance since we'll use to get a square root
    var metersToJump:Number = Player.y - platform.y;
    jumpVar = -Math.sqrt( 2 * gravity * metersToJump );

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

    Player.y += jumpVar / fps;
    jumpVar += gravity / fps;

Из вашего примера это не тот случай, но если вы поместите платформу ниже проигрывателя, она не будет работать, так как вы не можете получить корень отрицательного числа!

В моем примере кода я не фиксирую высоту платформы, поэтому то, как вы выбираете целевую платформу, является совершенно отдельным вопросом.

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