マスクをするときの注意

今日のハマりどころはマスクです。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);

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