获取已发布密钥的代码

时间:2013-05-18 11:36:44

标签: actionscript-2 keycode keyrelease

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

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

函数使用Key.getCode()方法检查按下了哪个键。它适用于myKeyDown,但它对于myKeyUp来说是错误的。如果(例如)我首先按A(向左移动),然后按W(跳转),然后释放W然后释放A,则会发生错误。玩家不会停止移动(即使这是你发布时应该发生的事情) 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;
    }
}
}

1 个答案:

答案 0 :(得分: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();
  }
}