愚人呓语 eidiot's blog. My flapdoodles.

27七/06

自作聪明的Flash 9

  AS2的 Key.isDown() 在AS3里已经 Removed 了,想要监听键盘事件只能 addEventListener。本来想用一个 Sprite 监听:

public class Test extends Sprite{
    
public function Test(){
        
addEventListener(KeyboardEvent.KEY_DOWN,onKeyDown);
    
}
    
private function onKeyDown(event:KeyboardEvent):void{
        
trace(event.keyCode);
    
}
}

这样需要保证始终聚焦这个 Sprite :

stage.focus = this;

不可行。于是把 Listener 加到 stage 上:

stage.addEventListener(KeyboardEvent.KEY_DOWN,onKeyDown);

Flash 9 却抛了个 Warning :

**Error**  : Line -1, Column -1 :
Warning Report:
---------------
[Coach] Warning #1090: EventHandler was not added as a listener.
----------------------------------------------------------------
 
F:\...\Test.as(20): Migration issue: The onKeyDown event handler is not triggered automatically by Flash Player at run time in ActionScript 3.0You must first register this handler for the event using addEventListener ( 'keyDown', callback_handler).
        
private function onKeyDown(event:KeyboardEvent):void{
    ...................^
----------------------------------------------------------------

意思是说我的onKeyDown方法必须注册为这个事件的侦听器。但是我已经注册了啊,只不过改监听 Sprite 广播的事件为监听 Stage 的

//新的
stage.addEventListener(KeyboardEvent.KEY_DOWN,onKeyDown);
//旧的
addEventListener(KeyboardEvent.KEY_DOWN,onKeyDown);

难道stage不广播 keyDown 事件?看了一下文档,不是这么回事。那究竟为何?到网上找了半天没有相关的资料。最后仔细看了看它的 Warning 内容,多测试了几种代码,终于搞清楚了,原来是 Flash 9自作聪明。
  AS2有 onKeyDown 事件,到AS3里改为 keyDown 。当Flash 9发现有人使用AS2的语法定义onKeyDown方法,它就去找有没有addEventListener,以此判断是否错误的语法调用。我开始是直接 addEventListener ,能被Flash检测到,但后来在前面加了个 stage. ,它就找不到了,认为是我不懂AS3而错误地使用了AS2的语法,于是抛了个 Warning。
  奇怪的是,如果把方法定义为 static 就没有这个 Warning 了。

private static function onKeyDown(event:KeyboardEvent):void{

最后改个方法名,一切OK。
  以后要注意避免使用AS2里旧有的 onPress ,onMouseDown 之类作为 Listener 名,免得 Flash9 再自作聪明。

  • Coder

    老大,按你写的,我怎么调不通啊.
    提示:[Compiler] Error #1114: The public attribute can only be used inside a package.
    把整个正确代码贴出来吧,这样改很容易就乱了.

  • http://eidiot.net eidiot

    这个不是一个完整的范例
    所以没有全部的代码
    关于AS3类的书写格式可以参考学习笔记系列的范例