
« mouseZoomライブラリ公開! | メイン | Google Developer Day 2009 に行ってきました »
月曜日, 6 01, 2009
mouseZoomライブラリでハマったマウスイベントの処理について。
AS3では、イベントハンドラで渡される MouseEvent の target は、
addEventListener()したオブジェクトではなく、
イベントターゲットを表し、MouseEvent.localXはイベントターゲット上のマウスのX座標を表す。
なので、複数のDisplayObjectを格納するSprite上でマウスが動く度にハンドラ内で
Sprite上でのマウスの座標を取得したい場合、ハンドラの引数である
MouseEventインスタンスから値を取得して、
Sprite.globalToLocal(new Point(MouseEvent.stageX, MouseEvent.stageY)):Point
とすればよいはず。
でも、これだと予期せぬ挙動を示します。突然どっか飛んでしまったり。
おかげでmouseZoomライブラリを初公開したときはmouseChildren=falseとして、
中のコンテンツがイベントを受け取れないようにすることでこのバグを回避していました。
ただ、これでは使い物にならないため、他の方法を模索した結果、下記の方法で上手く動くようになりました。
new Point(Sprite.mouseX, Sprite.mouseY)
ハンドラの引数ではなく、ハンドラが呼ばれた時点での新たにマウスの位置を取得しているので、
厳密にはずれる場合がありそうですが、こちらのほうが安定して動きます。すでにリポジトリに反映済みです。
このエントリーのトラックバックURL:
http://lab.elephant-com.co.jp/cgi-bin/mt/mt-tb.cgi/141



