2013-05-18 67 views
1

我正在尝试使用操作脚本2.0制作一个简单的平台游戏,但是我从键盘获取输入时遇到了问题。我有两个函数“myKeyDown”和“myKeyUp”,无论何时按下/释放键都会被调用。获取已发布密钥的代码

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

该函数检查使用Key.getCode()方法按下哪个键。它适用于myKeyDown,但它是myKeyUp的bug。如果(例如)我先按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(); 
    } 
}