メインクラスはマウスイベントを受け取れないのか??
下のようなコードを書いた場合に、FooやBarをクリックすればメッセージが表示されるが、それ以外のところをクリックしても表示されない。
package { import flash.display.*; import flash.events.*; public class Client extends Sprite { public function Client() { graphics.beginFill(0x00FF00); graphics.drawRect(0, 0, 100, 100); alpha = 0.3; var f:Foo = new Foo(); f.setup(this); addChild(new Bar()) } } } import flash.display.*; import flash.events.*; class Foo extends Sprite{ public function Foo(){ graphics.beginFill(0x00FF00); graphics.drawRect(0, 0, 50, 50); alpha = 0.5; } public function setup(target:Client):void{ target.addEventListener(MouseEvent.MOUSE_DOWN, eventhandler); target.addChild(this); } public function eventhandler(e:Event):void{ log("hi!"); } } class Bar extends Sprite{ public function Bar(){ graphics.beginFill(0x00FF00); graphics.drawRect(0, 0, 50, 50); alpha = 0.5; x = 50; y = 50; } }
- マウスイベント - クジラ Flash ActionScript3 Tips
ハマッたところ
マウスイベントを得るために、ルートに対して、addEventListerしてみたが、どうもステージ全域のイベントを検出してくれなかった。そこで、わざわざ子のSpriteを作って、そこにイベントを追加してみたら、うまく動いた。
むう、同じ挙動かも。仕様なのかな?
メインクラスのコンストラクタにこう書き足してみた。子スプライトのないところをクリックしたときに、親スプライトではなくstageが表示される。
stage.addEventListener(MouseEvent.MOUSE_UP, function(e:Event):void{log(e.target)}); // stage
mouseEnableはtrue。
log(this.mouseEnabled); // true
-
-
-
- -
-
-
結局こんな感じでSpriteでもStageでも受け取れるようにした。
public function setup(target:DisplayObjectContainer):void{ target.addEventListener(MouseEvent.MOUSE_DOWN, eventhandler); target.addChild(this); }
-
-
-
- -
-
-
ダメだ。MOUSE_OVERやMOUSE_OUTでいろいろするのを作りたかったのだけど、これだとrascutでは画面全体がstageだからテストがしづらい。メインのクラス以外にもう一枚Spriteを配置するのが一番スマートか。。。