getChildByNameの謎


通常、タイムラインで配置したオブジェクトや、外部から読み込んだswfに名前をつけようとしても

Error: Error #2078: タイムラインに配置されたオブジェクトの name プロパティは修正できません。

というエラーが出て名前を変更できない。

それならば、と思ってカスタムクラスを作って、

private var _name:String;
public override function get name():String{return _name;}
public override function set name(value:String):void{_name = value;}

ってやって無理矢理名前をセットできるようにしてみましたが、これをやると、

//hogeを名前をつけられるようにしたオブジェクトとする
hoge.name = 'test';//エラーは出ない
OBJ.addChild(hoge);
trace(OBJ.getChildByName('test'));//結果はnull
trace(OBJ.getChildAt(0).name)//結果はtest

という謎の状態になってしまいました。

カスタムクラスのsetterで

super.name = value;

とするとやはりエラーが出るので、setterのnameは上のような動作ではなく、違う動作をすると思われます。何か内部的なIDを割り振っているんでしょうか。あるいは子の名前のリストを内部的に持っているとか?

別の方法で何とかしましたが、思いつきだけで動かしていると痛い目に遭いますね・・・。

余談:

既にunloadしているMovieClipをもう1度unloadしようとすると、エラーになる。

自分でunloadを仕込んだのに忘れてunloadしようとしたら

Error #2099: 読み込み中のオブジェクトは、十分に読み込まれていないので、その情報を表示することができません。

というエラーが。loaderが取得できないのかと思ったら、そもそもその前に削除していたという・・・。まあ確かにloaderが取得できない、という想像は正しいですがw

BitmapとShapeの扱い


ビットマップはタイムラインに置いておくと、パブリッシュ時にShapeに変換される(ただし、AS書き出ししていると、Bitmapになる)。というような話を前に書いてましたが、もうちょっと調べた話。

タイムラインに置いたShapeは隣接レイヤーにShapeがあると統合される。これは上記ビットマップのデータにも有効であり、AS書き出しをしていなければShapeに統合される。

したがって、レイヤー3つに

画像/画像/Shape

という感じでデータをタイムラインに置き、そのクリップ内で

trace(this.numChildren);

すると結果は

1

となる。

このとき、真ん中の画像をASに書き出しすると、

3

となる。

trace(this.getChildAt(0));
trace(this.getChildAt(1));
trace(this.getChildAt(2));

の結果は

[object Shape]
[object Bitmap]
[object Shape]

になる。

勝手にShapeが合成されない方法を編み出したらきっと便利かもしれない。今のところ一番手っ取り早そうなのはシンボルに変換することだろうか。スクリプトで書けばまったく問題にならない部分ではありますが。