我正在尝试使用动作脚本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;
}
}
}
答案 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();
}
}