2011-03-24 67 views
3

KeyboardEvent對象中,我瞭解按鍵事件,是否有辦法知道事件是第一次按鍵還是按住按鍵時重複? 我想在按下某個鍵時切換設置;我可以聽到按鍵動作,但我更喜歡在按鍵被按下時採取動作......只要我能夠在按鍵重複事件生成時阻止它來回切換。僅在AS3中檢測到第一個按鍵事件

回答

3

最簡單的方法是使用KEY_DOWN偵聽器中的標記刪除或禁用KEY_DOWN偵聽器,然後在KEY_UP中添加或啓用它。

+0

這將禁用所有按鍵跟蹤,但是,如果在按下時按下另一個按鍵,該怎麼辦?在實踐中,你應該點擊一個按鈕,也許這不會是一個問題......可能是一個更簡潔的方法。 – 2011-03-24 17:32:22

+0

是的,你是對的。這就是像@Chris這樣的解決方案所發揮的作用。你真的需要爲你的情況量身定做。 – mpdonadio 2011-03-24 17:47:53

8

測試和工程

import flash.events.KeyboardEvent; 

stage.addEventListener(KeyboardEvent.KEY_DOWN, onDown); 
stage.addEventListener(KeyboardEvent.KEY_UP, onUp); 

var keys:Object = {}; 

function onDown(e:KeyboardEvent):void { 
    if(! Boolean(e.keyCode in keys)) { 
     trace("First Time");   
     keys[e.keyCode] = true; 
    }  
} 

function onUp(e:KeyboardEvent):void { 
    delete keys[e.keyCode]; 
} 

在對象存儲鍵碼的概念和使用刪除鍵起來的最初來自Senoculars庫。請參閱http://www.senocular.com/flash/actionscript/

+0

這是一個明顯的方法,但有點醜。我希望事件簡單地存儲這些信息,我_think_ Win32可能會這麼做,這可能是我期望有一種方式。 – 2011-03-24 17:32:45

+0

酷,這是一個好主意,在這裏使用Dictionnay而不是一個普通的對象。 var keys:Dictionary = new Dictionary(); – YopSolo 2013-08-27 08:38:50

+0

你可以肯定地使用字典。唯一的是你不會利用任何字典功能,比如它的方法。否則我同意 – Chris 2013-08-27 10:19:20

0
stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown); 

private function onKeyDown(event:KeyboardEvent):void 
{ 
    if (event.keyCode == Keyboard.SPACE) 
    { 

     stage.removeEventListener(KeyboardEvent.KEY_DOWN, onKeyDown); 

     stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp); 

    } 
} 

private function onKeyUp(event:KeyboardEvent):void 
{ 
    if (event.keyCode == Keyboard.SPACE) 

     stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown); 

     stage.removeEventListener(KeyboardEvent.KEY_UP, onKeyUp); 

    } 
}