Как мой персонаж может прыгать в направлении левой или правой клавиши? - PullRequest
0 голосов
/ 23 февраля 2020

это мой код. всякий раз, когда я нажимаю на левую клавишу со стрелкой, и когда я нажимаю пробел, он останавливается и прыгает, и он больше не движется влево (то же самое с клавишей со стрелкой вправо).

    stop();
    var Gravity = 5;
    var yLimit = 400 - char.height;
var friction = .9;
var velocity = 100;
var djctr = 0;
stage.addEventListener(Event.ENTER_FRAME, entFrame);
stage.addEventListener(KeyboardEvent.KEY_DOWN, control);

function control(event:KeyboardEvent){
    if(char.y >= yLimit || djctr == 2){
        if(event.keyCode == 32 && djctr !=2){
            char.y -= velocity;
            char.x += 7;
            djctr+=2;
        }else if (event.keyCode == 32 && djctr == 2){
            char.y -= velocity * .50;
            djctr+=2;
            }

    }

    if(event.keyCode == 37){
            char.x -= 7;
    }else if(event.keyCode == 39){
            char.x += 7;
    }
    }

function entFrame(e:Event){
    char.y += Gravity;
    if(char.y >= yLimit){
        char.y = 400-char.height;
        djctr = 0;
        }
    }

1 Ответ

0 голосов
/ 24 февраля 2020

Что я делаю для управления движением, так это наличие двухступенчатых слушателей KeyboardEvent (KEY_DOWN и KEY_UP) и таймера, который запускает каждый кадр. События клавиатуры не обрабатывают управление, они только обрабатывают изменяющиеся значения stati c, такие как keyLeftIsDown и keyRightIsDown (в вашем случае вы также можете обрабатывать, когда нажимается пробел), а прослушиватель Timer - это то, что обрабатывает управление , Вот как это может выглядеть:

private var keyLeftIsDown:Boolean;
private var keyRightIsDown:Boolean;

//The '60' in '1000 / 60' is the frames per second the program runs in. Change it as needed
private var movementTimer:Timer = new Timer(1000 / 60);

private function initialize():void {
    stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown);
    stage.addEventListener(KeyboardEvent.KEY_UP, keyUp);
    timer.addEventListener(TimerEvent.TIMER, movementUpdate);
    timer.start();
}

private function keyDown(e:KeyboardEvent):void {
    if (e.keyCode == Keyboard.LEFT) {
        keyLeftIsDown = true;
    }
    else if (e.keyCode == Keyboard.RIGHT) {
        keyRightIsDown = true;
    }
    else if (e.keyCode == Keyboard.SPACE) {
        //jump code goes here
    }
}

private function keyUp(e:KeyboardEvent):void {
    if (e.keyCode == Keyboard.LEFT) {
        keyLeftIsDown = false;
    }
    else if (e.keyCode == Keyboard.RIGHT) {
        keyRightIsDown = false;
    }
}

private function movementUpdate(e:TimerEvent):void {
    if (keyLeftIsDown && !keyRightIsDown) {
        char.x -= char.speed;
    }
    else if (keyRightIsDown && !keyLeftIsDown) {
        char.x += char.speed;
    }
}

Таким образом, символ перемещается в направлении x, даже если код обрабатывает скачки!

...