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);
}
}
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.0. You must first register this handler for the event using addEventListener ( 'keyDown', callback_handler).
private function onKeyDown(event:KeyboardEvent):void{
...................^
----------------------------------------------------------------
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.0. You 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.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


