【问题标题】:Simultaneous keypress causing unwanted behaviour同时按键导致不必要的行为
【发布时间】:2014-12-08 17:21:25
【问题描述】:

我正在使用动作脚本 3 制作射击游戏。我有一个英雄,当按下任何箭头键时都会移动 我的代码如下

//some class level variables
private var vx :int = 0;
private var vy :int = 0;

//in the Main constructor
stage.addEventListener(KeyboardEvent.KEY_DOWN , moveHero);
stage.addEventListener(KeyboardEvent.KEY_UP , stopHero);
stage.addEventListener(Event.ENTER_FRAME , onEnter);

//and all the handlers
function moveHero(e:KeyboardEvent)
{
    if (e.keyCode == 37)
    {
        vx = -5;
    } 
    else if (e.keyCode == 38)
    {
        vy = -10;
    } 
    else if (e.keyCode == 39)
    {
        vx = 5;
    } 
    else if (e.keyCode == 40)
    {
        vy = 10;
    }
}
function stopHero(e:KeyboardEvent)
{
    //when key is up stop miving the hero
    vx = 0;
    vy = 0;
}
function onEnter(e:Event):void
{
    //updtae hero position 
    hero.x += vx;
    hero.y += vy;
}

现在我的问题是,当用户在他的手指下同时有上下键或左右键并突然交替按下它们时,英雄在对按键的响应方面表现出明显的滞后

【问题讨论】:

  • 按键应该设置布尔值,并且在你的输入框监听器中你应该根据这些布尔值移动角色。操作本身不应发生在按键处理程序中。
  • @BotMaster 为什么 OP 需要一个 enterframe 监听器?

标签: actionscript-3 flash events


【解决方案1】:

您必须完全按照 cmets 中所说的 BotMaster 进行操作,下面是它在 AS3 代码中的样子:

var keys:Array = new Array(255);

stage.addEventListener(KeyboardEvent.KEY_DOWN , keyDown);
stage.addEventListener(KeyboardEvent.KEY_UP , keyUp);
stage.addEventListener(Event.ENTER_FRAME , loop);

function keyDown(e:KeyboardEvent):void {
    keys[e.keyCode] = true;
}

function keyUp(e:KeyboardEvent):void {
    keys[e.keyCode] = false;
}

function loop(e:Event):void {
    if(keys[Keyboard.LEFT]) {
        trace("Moving left...");
    } else if(keys[Keyboard.RIGHT]) {
        trace("Moving right...");
    }
}

【讨论】:

  • 为什么我们需要KeyboardEvent.KEY_UPEvent.ENTER_FRAME
  • 我明白你在做什么,但是为什么我们需要一个使用 Event.ENTER_FRAME 的循环,而只有 KeyboardEvent.KEY_DOWN 可以完成这项工作?
  • 好吧,既然我们在谈论游戏开发,让我来告诉你任何游戏中最重要的结构元素 - 主循环。这是您所有逻辑发生的地方,您更新子系统并在屏幕上呈现图形的地方。键盘只是另一个应该向游戏逻辑系统提供反馈的实用程序。如果您要开始将游戏逻辑放入键盘处理程序中,那么您就是在自找麻烦。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-26
  • 2019-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多