AS3 Управление с клавиатуры - PullRequest
1 голос
/ 19 апреля 2011

У меня есть функция as3, которая управляет клипом с клавиатуры:

пакет {

import flash.display.MovieClip;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
import flash.events.Event;

public class Main_Character_Two extends MovieClip
{
    var vx:int;
    var vy:int;

    public function Main_Character_Two()
    {
        init();
    }
    function init():void
    {
        //initialize variables
        vx = 0;
        vy = 0;

        //Add event listeners
        stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
        stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp);
        addEventListener(Event.ENTER_FRAME, onEnterFrame);
    }
    function onKeyDown(event:KeyboardEvent):void
    {
        if (event.keyCode == Keyboard.LEFT)
        {
            vx = -5;
        }
        else if (event.keyCode == Keyboard.RIGHT)
        {
            vx = 5;
        }
        else if (event.keyCode == Keyboard.UP)
        {
            vy = -5;
        }
        else if (event.keyCode == Keyboard.DOWN)
        {
            vy = 5;
        }
    }
    function onKeyUp(event:KeyboardEvent):void
    {
        if (event.keyCode == Keyboard.LEFT || event.keyCode == Keyboard.RIGHT)
        {
            vx = 0;
        }
        else if (event.keyCode == Keyboard.DOWN || event.keyCode == Keyboard.UP)
        {
            vy = 0;
        }
    }
    function onEnterFrame(event:Event):void
    {
        //Move the player
        player.x += vx;
        player.y += vy;
    }
}

}

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

Спасибо

Ответы [ 4 ]

3 голосов
/ 20 апреля 2011

Вы можете поместить свой код позиционирования игрока в цикл Event.ENTER_FRAME и использовать KeyboardEvent.KEY_DOWN и KeyboardEvent.KEY_UP для установки логических значений и позиционирования игрока в цикле, как:

var leftIsPressed:Boolean = false;
var rightIsPressed:Boolean = false;
var upIsPressed:Boolean = false;
var downIsPressed:Boolean = false;
var speed:Number = 5;
var vx:Number = 0;
var vy:Number = 0;

stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);
stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler);

function keyDownHandler(e:KeyboardEvent):void {
    switch(e.keyCode) {
        case Keyboard.LEFT : leftIsPressed = true; break;
        case Keyboard.RIGHT : rightIsPressed = true; break;
        case Keyboard.UP : upIsPressed = true; break;
        case Keyboard.DOWN : downIsPressed = true; break;
    }
}

function keyUpHandler(e:KeyboardEvent):void {
    switch(e.keyCode) {
        case Keyboard.LEFT : leftIsPressed = false; break;
        case Keyboard.RIGHT : rightIsPressed = false; break;
        case Keyboard.UP : upIsPressed = false; break;
        case Keyboard.DOWN : downIsPressed = false; break;
    }
}

function enterFrameHandler(e:Event):void {
    vx = -int(leftIsPressed)*speed + int(rightIsPressed)*speed;
    vy = -int(upIsPressed)*speed + int(downIsPressed)*speed;
    player.x += vx;
    player.y += vy;
}

[EDIT] Добавлен более подробный пример.

Конечно, в этом случае, если нажата и левая, и правая клавиши, это приведет к смещению 0.

0 голосов
/ 20 апреля 2011

Понимание этого явления требует базового понимания модели событий, на которой основан ввод с клавиатуры. В AS3 он работает иначе, чем в AS2.

Когда вы нажимаете клавишу, вызывается событие для вызова функции, но оно вызывается только один раз , когда клавиша нажата. Обработчики событий не проверяют, нажата ли клавиша. (Попробуйте добавить 5 к значению x / y вашего объекта вместо vx в функции onKeyDown; вы обнаружите, что ваш персонаж двигается только при нажатии клавиши, а не при ее удерживании.)

Аналогично, когда вы отпускаете клавишу, вызывается событие для вызова функции, но оно срабатывает только один раз, когда клавиша активно отпускается. Когда ключ просто сидит там, события не запускаются.

Опираясь на это ... вы можете найти источник вашей текущей проблемы?

function onKeyUp(event:KeyboardEvent):void
{
    if (event.keyCode == Keyboard.LEFT || event.keyCode == Keyboard.RIGHT)
    {
        vx = 0;
    }
    else if (event.keyCode == Keyboard.DOWN || event.keyCode == Keyboard.UP)
    {
        vy = 0;
    }
}

Если вы не нашли его, это этот блок.

    if (event.keyCode == Keyboard.LEFT || event.keyCode == Keyboard.RIGHT)
    {
        vx = 0;
    }

Это утверждение говорит вашей программе установить скорость равной нулю, если нажата правая или левая клавиши. Однако, поскольку Flash проверяет нажатие клавиши только при первом нажатии клавиши , удерживание клавиши не вызовет функцию onKeyDown. Следовательно, если вы держите левую и правую стороны и отпускаете одну, вы устанавливаете скорость на ноль.

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

Надеюсь, этот ответ немного прояснил его - немного знаний может привести к великим вещам. Удачи.

0 голосов
/ 20 апреля 2011

Событие KeyboardEvent.KEY_DOWN вызывается только тогда, когда клавиша переходит из состояния «вверх» в состояние «вниз», поэтому ваш персонаж останавливается после того, как вы убрали палец с клавиши «ВЛЕВО», потому что нет нового KEY_DOWN произошло событие, которое заставило бы персонажа двигаться.

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

0 голосов
/ 20 апреля 2011

Вы можете прослушать KeyboardEvent.KEY_UP, чтобы определить, когда была отпущена клавиша, чтобы вы могли отслеживать, какие клавиши удерживаются.

...