MouseEvent 検出処理周りの大幅な変更
ここ最近 UI 関連のライブラリを再構築してく中(現在はスクロールバー関連処理再構築中)、マウスイベント(MouseEvent)は Stage インスタンスのみから検出できるようにするべきではないか、と考えました。
以下予定している今後についてまとめ書きを行いました。
変更内容
(a) MouseEvent を扱うクラスは一つ
・MouseEvent は Stage インスタンスからのみ検出する
・各種 DisplayObject への MouseEvent 検出処理定義は削除
・検出したい MouseEvent はあらかじめ一通り定義しておく
(b) MouseEvent.MOUSE_OUT, MouseEvent.MOUSE_OVER 処理削除
・Rectangle を用いて、領域上にマウスが存在するかを判定する
→ Rectangle.contains 等を利用
(c) 領域がクリックされたかどうかを判定
・(a)でマウスクリックを検出された時
(b)の領域内にマウスポインタが存在する場合 とする
ポイント
・各所に散らばっていた addEventListener の MouseEvent 処理は不要となる
・DisplayObject 関連インスタンスを生成せずともマウス状況に対する処理が扱える
数値上で計算を行っておき、任意のタイミングで DisplayObject 関連インスタンスを生成し表示・位置設定、といった描画処理を行う事が可能となります。
不要なインスタンスや処理を定義する箇所が減り、なおかつ処理が分割され、見やすいクラス設計が可能となります。
まだ実際に変更作業は行っていないので、あくまで「おそらく」の話となります。
別途考慮が必要になる点
Stage インスタンスに addEventListener で MouseEvent を検出するようにするため いつでも MouseEvent は発生するようになる
DisplayObjectContainer の表示重なり具合を考慮する必要がでてきます。
この SimpleButton は手前に Sprite が表示されているから、マウスクリック判定は無効とする、等です。
複雑な形状の判定
シンプルな UI ならば矩形領域判定で十分かと思われますが、複雑な形状の UI に対して領域クリック調査などを行いたい場合は別途考慮が必要となりそうです。
---
UI 関連ライブラリ全体(特にボタン(SimpleButton)の扱い)に修正が入りそうです。
個人的なコーディングスタイルがよりいっそう統一されたものになりそうです。
考え方にどこか欠陥は必ずありそうです。変更作業を行いながら気づくかもしれません。
やっぱりこうしないほうがいいや、といった事もあるかも。