2011-10-03 94 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"); 
} 
} 

}