1

我正在尝试使用动作脚本 2.0 制作一个简单的平台游戏,但我在从键盘获取输入时遇到问题。我有两个函数“myKeyDown”和“myKeyUp”,只要按下/释放一个键就会被调用。

keyListener.onKeyDown = function(){
myKeyDown();
}
keyListener.onKeyUp = function(){
myKeyUp();
}

这些函数使用 Key.getCode() 方法检查按下了哪个键。它适用于 myKeyDown,但适用于 myKeyUp。如果(例如)我先按 A(向左移动),然后按 W(跳跃),然后释放 W,然后释放 A,就会发生错误。玩家不会停止移动(即使这是你释放时应该发生的情况一个)

我理解这里的问题。Key.getcode 返回最后按下的键的代码,我想要的是最后释放的键的代码。我一直在寻找这样的功能几个小时,但我没有找到任何东西。

这是 myKeyDown 和 myKeyUp 函数的代码

function myKeyDown(){
//A
if(Key.getCode() == 65){
    velX=-3;
}else
//D
if(Key.getCode() == 68){
    velX=3;
}else
//W
if(Key.getCode() == 87){
    if(isInAir == false){
        jump();
    }
}

}

function myKeyUp(){
//A
if(Key.getCode() == 65){
    if(velX==-3){
        velX=0;
    }
}else
//D
if(Key.getCode() == 68){
    if(velX==3){
        velX=0;
    }
}
}
4

1 回答 1

0

对于这样的情况,当您需要按住/释放多个键时,稍微不同的方法会更好地处理键。

您可以做的是使用 onEnterFrame 事件侦听器来检查按下的键,以防事件必须是连续的。

一个例子

var my_keys:Array = new Array();
my_keys["jump"]=false;
my_keys["right"]=false;
my_keys["left"]=false;

//keydown sets the variables to true
keyListener.onKeyDown = function(){
  code=Key.getCode();
  if(code==65){
    my_keys["left"]=true;
  }
  if(code==68){
    my_keys["right"]=true;
  }
  if(code==87){
    my_keys["jump"]=true;
  }
  //etc, etc, anything else you wish
  //of course, this doesn't prevent you from calling additional one-time events from the keydown!
}
//keyup unsets the button variables 
keyListener.onKeyUp = function(){
  code=Key.getCode();
  if(code==65){
    my_keys["left"]=false;
  }
  if(code==68){
    my_keys["right"]=false;
  }
  if(code==87){
    my_keys["jump"]=false;
  }
}

现在,在游戏的每一点,您都有一组被按下的键存储在 my_keys 数组中。当然,您可以在 keyDown/keyUp 中使用更通用的函数,并将 Key.getCode 本身作为索引直接传递到数组中,而不是标题数组(如my_keys[Key.getCode()]=true;),这样写起来会更短。但是,我发现这作为示例更具说明性,请随时根据需要修改代码

你现在想要的是一个函数,它可以根据按下的键来处理行为。

在您的情况下,例如,这可能是:

this.onEnterFrame=function(){ //you don't have to use "this" movieclip reference if you have other enterframe events in the movieclip. just don't forget to modify the objcet paths
  if(my_keys["left"]){
    velX=-3;
  }
  if(my_keys["right"]){
    velX=+3;
  }
  if((my_keys["jump"])&&(!isInAir)){ //note that i added !isInAir instead of (isInAir==false). this is an equivalent expression, it's just shorter and nicer
    jump();
  }
}
于 2013-05-23T16:30:34.513 回答