AS3中的键盘事件无法工作

3
这是一个让我头痛了两个小时才解决的问题。我决定在这里发布它,以帮助其他人不要抓狂 :)。
基本上,问题是我在我的Flash Builder环境中没有接收到键盘事件(相同的错误/问题在Adobe Flash CS5中也可见)。我设置了stage.focus = stage,但没有帮助。我添加了其他事件侦听器(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
这段代码一直没有按照上述的方式工作。问题是为什么它不起作用。最终,我找到了答案,并在此发布问题供其他人回答(或者我最终自己回答)。一个提示是,环境是错误的原因。 - eLouai
3个回答

4
使用键盘命令需要监听键盘事件。这个过程与监听AS3中的任何其他事件相同。您需要使用 addEventListener() 方法向 KeyboardEvent 注册。但是,与其他对象不同,由于键盘不必附加到项目中的任何特定对象,因此通常将 Keyboard Event 注册到 stage 上。在下面的代码中,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");
}
}

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接