2011-10-03 97 views
3

這讓我感到頭痛了2個小時,然後才明白了。
我決定把它發佈在這裏,以幫助別人不拉他們的頭髮:)。鍵盤事件as3不能正常工作

本質上,這個錯誤是我沒有收到我的Flash builder環境中的鍵盤事件(使用adobe flash cs5可以看到相同的bug /問題)。我設置stage.focus =舞臺,沒有幫助。我添加了其他事件監聽器(mouse_down,frame_enter),這些監聽器工作正常,我添加了MovieClip子項並在這些子項上監聽事件,但仍然是同樣的問題。

package 
{ 
    public class Test extends Sprite 
    { 

    public function Test() 
    { 
     this.addEventListener(Event.ADDED_TO_STAGE,init); 
    } 

    public function init(stage:Stage):void 
    { 
     this.removeEventListener(Event.ADDED_TO_STAGE,init); 
     stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed); 
     stage.addEventListener(KeyboardEvent.KEY_UP, keyReleased); 
    } 


    private function keyPressed(e:KeyboardEvent):void 
    { 
     trace("keyPressed"); 
    } 

    private function keyReleased(e:KeyboardEvent):void 
    { 
     trace("keyReleased"); 
    } 
    } 
} 
+1

此代碼可用嗎?或者不工作? – apscience

+0

此代碼無法正常工作,完全如上所述。問題是爲什麼它不起作用。我終於弄明白了,在這裏發佈問題讓其他人回答(或者我最終會自己回答)。一個線索,環境是錯誤的原因。 – eLouai

回答

3

使用鍵盤命令需要監聽鍵盤事件。此過程與在AS3中偵聽任何其他事件的過程相同。您需要使用addEventListener()方法註冊KeyboardEvent。但是,與其他對象不同,由於鍵盤不必附加到項目中的任何特定對象,所以鍵盤事件通常在階段中註冊。在下面的代碼中,每次鍵盤按鍵被按下時,stage對象都會註冊一個鍵盤事件。

與AS2不同,在AS3鍵盤事件不是全局的。它們被髮布到舞臺上,並且它們通過顯示列表跳到顯示對象所關注的任何位置。

package 
{ 
import flash.display.*; 
import flash.events.*; 

    public class Test extends Sprite 
    { 
    public function Test() 
    { 
    init(); 
    } 

    public function init():void 
    { 
     stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed); 
     stage.addEventListener(KeyboardEvent.KEY_UP, keyReleased); 
    } 


    private function keyPressed(e:KeyboardEvent):void 
    { 
     trace("keyPressed"); 
    } 

    private function keyReleased(e:KeyboardEvent):void 
    { 
    trace("keyReleased"); 
    } 
    } 
} 
2
public function init(stage:Stage):void 

ADDED_TO_STAGE is a `listener Event` not a stage instance. 

所以不是stage:Stage使用event:Event

你需要導入所需的類。

1

標出了改變的路線。你的代碼不會順便編譯,檢查錯誤日誌。

package { 

import flash.display.Sprite; /// changed line 
import flash.events.Event; /// changed line 
import flash.events.KeyboardEvent; /// changed line 


public class Test extends Sprite 
{ 

public function Test() 
{ 
    this.addEventListener(Event.ADDED_TO_STAGE,init); 
    /* i like it this way 
    stage ? init(null) : addEventListener(Event.ADDED_TO_STAGE,init); 
    */ 

} 

public function init(e:Event):void /// changed line 
{ 
    this.removeEventListener(Event.ADDED_TO_STAGE,init); 
    stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed); 
    stage.addEventListener(KeyboardEvent.KEY_UP, keyReleased); 
} 


private function keyPressed(e:KeyboardEvent):void 
{ 
    trace("keyPressed"); 
} 

private function keyReleased(e:KeyboardEvent):void 
{ 
    trace("keyReleased"); 
} 
} 

}