マスクをするときの注意

今日のハマりどころはマスクです。AS2.0ではMovieClip.setMask()でしたが、AS3.0ではDisplayObjectクラスのmaskプロパティに置き換えられています。このように「AS2のあのプロパティ、メソッドは、AS3ではどこ行ったんだ?」と疑問に思うことがありますが、そんなときは【ActionScript 2.0からの移行】というページがドキュメントの付録に用意されているので、参照してみるのもいいかと思います。

さて、このDisplayObject.maskプロパティには同じようにDisplayObjectを代入することができます。MyMask、MyObjというDisplayObjectのサブクラスがある場合、以下のようにするとmyObjインスタンスをmyMaskインスタンスでマスクすることができます。

var myMask:MyMask = new MyMask();
var myObj:MyObj = new Obj();
myObj.mask = myMask;
addChild(myObj);

ですが、ここで注意。上記のような書き方だと、仮にmyObjの親のDispalyObjectContainerが移動するなどした場合、親オブジェクトの移動と同時にMyObjは移動するのですが、ディスプレーツリーに登録されていないmyMaskは移動しないので、結果としてマスク位置がずれてしまいます。これを防ぐためには、myMaskも親オブジェクトのディスプレーツリーにきちんとaddChild()して登録しておく必要があります。
addChild()しても、maskプロパティに格納されたDisplayObject自体は表示されませんので、myMask.visible = falseとかする必要もありません。

var myMask:MyMask = new MyMask();
addChild(myMask);  //myMaskもディスプレーツリーに登録
var myObj:MyObj = new Obj();
myObj.mask = myMask;
addChild(myObj);

今回のマスクにしてもそうなのですが、ハマりどころもドキュメントを読めば大抵のことはきちんと書かれているのですが、ハマらない限りじっくりとドキュメントを精査することはないから、まぁこうやって学んでいくしかないのかなと。

LoaderオブジェクトでaddChild()はダメ

AS3.0をやってみると、予想通り分からないことばかりで、blogネタに困らない今日この頃。こうやってハマった経験を晒すことくらいしか、Flash業界に貢献できないのが悲しいところです。

今日のハマりどころはLoaderオブジェクトです。これは外部のswfや画像ファイルを動的に読み込むためのクラスですね。このクラスはDisplayObjectContainerのサブクラス(つまり子オブジェクトを持てる)で、load()メソッドで読み込まれた外部データは、ロードが完了すると自動的に、Loaderクラスの子オブジェクトとなり、Loader.contentプロパティから参照することもできるようになります。

さて、問題はaddChild()。Loaderオブジェクトの中に、子オブジェクトとしてTextFieldを追加する以下のようなコードをコンパイルすると、「LoaderクラスはaddChildを実装していません」というような趣旨のアラートが表示されてしまいます。DidpalyObjectContainerのサブクラスなのに、addChild()を実装していない?なぜ?

package {
  
  import flash.display.Loader;
  import flash.text.TextField;
	
  public class MyLoader extends Loader {
    public function MyLoader() {
      var textfield:TextField = new TextField();
      textfield.text = "Text";
      addChild(textfield);
    }
  }

}

それもそのはず。ドキュメントにも書いてありましたが、LoaderオブジェクトはaddChild()、addChildAt()、removeChild()、removeChildAt()、および setChildIndex() といったメソッドを(使用できないように?)オーバーライドしているとのことなのです。そして、子オブジェクトとして持てるのは、load()で読み込むオブジェクト1つだけだったのです。

僕から言わせれば、コイツはせっかく親から譲り受けた才能を台無しにしてしまうような親不孝息子にしか見えないのですが、まぁ僕も他人様のことをとやかく言えるほどの人格者ではありませんので、そういう奴なんだと理解してやろうと思います。

さぁ、次はどんな罠にハマるのかなw。