メインクラスはマウスイベントを受け取れないのか??

下のようなコードを書いた場合に、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;
  }
}

ハマッたところ

マウスイベントを得るために、ルートに対して、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を配置するのが一番スマートか。。。