Elephant Communicationsの制作スタッフが日々気になったことをお届けするブログです。

« 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

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)