フレーム更新イベントとキーボードイベントはどのような順番で呼び出されるのか調べてみた。
package { import flash.display.*; import flash.events.*; public class test extends Sprite { private var FrameNo:int = 0; public function test() { trace("test"); stage.addEventListener(Event.ENTER_FRAME, onEnterFrame0); stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown); stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp); stage.addEventListener(Event.ENTER_FRAME, onEnterFrame1); } public function onEnterFrame0(e:Event):void { FrameNo++; trace("Frame0 " + FrameNo); } public function onEnterFrame1(e:Event):void { trace("Frame1 " + FrameNo); } public function onKeyDown(e:KeyboardEvent):void { trace("keydown " + FrameNo); } public function onKeyUp(e:KeyboardEvent):void { trace("keyup " + FrameNo); } } }
このプログラムを実行結果のログは次のとおり。
test Frame0 1 Frame1 1 Frame0 2 Frame1 2 ...(中略) Frame0 24 Frame1 24 Frame0 25 Frame1 25 keydown 25 Frame0 26 Frame1 26 Frame0 27 Frame1 27 keyup 27 Frame0 28 Frame1 28 Frame0 29 Frame1 29
イベントの登録は二つのフレーム更新の間にキーボードイベントを登録しているが、呼び出された順番はフレーム更新二つのあとにキーボードイベント。キーボードイベントはフレーム更新のあとに行われるようだ。
いま作っているクラスではイベントは登録された順番で動作する前提で作っていたので、実装方法を変更しなくては。