スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

カテゴリ : スポンサー広告

吉里吉里イベント発生順メモ

「onKeyDownとonKeyPress」や「onMouseDownとonClick」など似たような関数たくさんあるけど、どんな順番で呼ばれるの?というメモ。
前提:イベントシステムについて

まずは結果見てわかりそうなところ
・ウィンドウのactionは、ウィンドウ、レイヤの関数が呼ばれた直後に呼ばれる
ただしレイヤのonHitTestではactionは呼ばれない

・レイヤよりも先にウィンドウのアクションが呼ばれる
Window.onMouseWheelの後にLayer.onMouseWheelなど

・onHitTestは結構呼ばれまくる。
実際のイベントと1対1では対応しない
レイヤの上にマウス置いてるだけでも定期的に呼ばれます
Layer.enabledがfalseだろうが呼ばれます

・なんだか複雑でめんどくさい
呼び出し順に依存するロジックにはしない方が良さそう


以下実際に試した結果。
Window.actionは全て直前のイベントについての呼び出しです。

■レイヤにフォーカスがあるときにマウスホイールを回す
Window.onMouseWheel
Window.action
Layer.onMouseWheel
Window.action

■レイヤにフォーカスがあるときにキーを押す
Window.onKeyDown
Window.action
Layer.onKeyDown
Window.action
Window.onKeyPress
Window.action
Layer.onKeyPress
Window.action

■レイヤにフォーカスがあるときにキーを離す
Window.onKeyUp
Window.action
Layer.onKeyUp
Window.action

■レイヤ上でマウス左ボタンを押す
Window.onMouseDown
Window.action
Layer.onHitTest
Layer.onHitTest
Layer.onMouseDown
Window.action
Window.onMouseMove
Window.action
Window.onClick
Window.action
Layer.onHitTest
Layer.onClick
Window.action

■マウス左ボタンを離す
WIndow.onMouseUp
Window.action
Layer.onMouseUp
Window.action

■レイヤ上でマウスを動かす
Window.onMouseMove
Window.action
Layer.onHitTest
Layer.onMouseMove
Window.action

■レイヤAからレイヤBにマウス移動
Window.onMouseMove
Window.action
LayerB.onHitTest
LayerA.onMouseLeave
Window.action
LayerB.onHitTest
LayerB.onMouseEnter
Window.action
LayerB.onHitTest
LayerB.onMouseMove
Window.action
Window.onMouseMove
Window.action

■レイヤAにフォーカスがあるときにタブキーを押す(レイヤBへフォーカス移動)
Window.onKeyDown
Window.action
LayerA.onSearchNextFocusable
Window.action
LayerB.onBeforeFocus
Window.action
LayerA.onBlur
Window.action
LayerB.onFocus
Window.action
Window.onKeyPress
Window.action
LayerB.onKeyPress
Window.action

■レイヤ上でダブルクリック
Window.onMouseDown
Window.action
Layer.onHitTest
Layer.onHitTest
Layer.onMouseDown
Window.action
Window.onMouseMove
Window.action
Window.onClick
Window.action
Layer.onHitTest
Layer.onClick
Window.action
Window.onMouseUp
Window.action
Layer.onMouseUp
Window.action
Layer.onHitTest
Window.onMouseMove
Window.action
Layer.onHitTest
Window.onDoubleClick
Window.action
Layer.onHitTest
Layer.onDoubleClick
Window.action
Window.onMouseDown
Window.action
Layer.onHitTest
Layer.onHitTest
Layer.onMouseDown
Window.action
Window.onMouseMove
Window.action
Window.onMouseUp
Window.action
Layer.onMouseUp
Window.action


おまけで試すときに使ったコード。ScriptsEx便利
何かイベント起きるたびにコンソールに記録されていきます。
// プラグイン読み込み
Plugins.link("ScriptsEx.dll");

// ウィンドウとレイヤを生成
var win = new Window();
win.visible = true;
var parentLayer = new Layer(win, null);
parentLayer.setPos(006464);
parentLayer.fillRect(0064640xFF0000FF);
parentLayer.visible = true;
var childLayer = new Layer(win, parentLayer);
childLayer.setPos(003232);
childLayer.fillRect(0032320xFF000000);
childLayer.visible = true;


/**
 * イベント関連の関数をメッセージ出力するように上書きする
 * @param obj 上書きするオブジェクト
 * @param msg 出力するメッセージ
 */

function eventOverride(obj, msg)
{
  var keys= Scripts.getObjectKeys(obj);
  for (var i = 0; i < keys.count; ++i) {
    var key = keys[i];
    if (key.substr(0,2) === "on" && obj[key] instanceof "Function") {
      // 名前が"on"で始まる関数を上書き
      obj[key] = function(*) {
        global.Debug.message(msg, funcName, *); // メッセージと関数名、引数を出力
        orgFunc(*); // 元の関数を呼ぶ
      } incontextof %[ msg:msg, funcName:key, orgFunc:obj[key] ];
    }
  }
}
eventOverride(win, "Window:");
eventOverride(parentLayer, "ParentLayer:");
eventOverride(childLayer, "ChildLayer:");
// ウィンドウのactionもメッセージ出力するように上書き
win.actionTargetNames = %[ win => "Window", parentLayer => "ParentLayer", childLayer => "ChildLayer" ];
win.action = function(ev) {
  var target = ev.target;
  var type = ev.type;
  delete ev.target;
  delete ev.type;
  var args = [];
  args.assign(ev);
  global.Debug.message("Window:""Action", actionTargetNames[target], type, args*);
incontextof win;
スポンサーサイト

タグ : 吉里吉里 TJS

カテゴリ : 吉里吉里

コメントの投稿

非公開コメント

最新記事
カテゴリ

openclose

記事一覧
Twitter
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。