2013-05-18 102 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(); 
    } 
}