今度は久々にFlashに関して

AS2までは、入れ子になったMovieClipから一番上にあたる _root に対して、そこのタイムラインに書かれているScriptの関数を叩く際には、 _root.hoge(); と書けば、 function hoge(){} 関数が実行できました。

AS3になって、XもYもrootもアンダーバー _ をつけなくなり、入れ子になったMovieClipからアンダーバーのない root.hoge(); で関数を実行できるのかとおもったっら違うみたいでした。。。今更感がいなめないですが、、メモします。

ActionScript3
1
MovieClip(root).hoge();

ActionScript3.0の場合は、このように書くとhoge関数が実行できました。rootも1つのMovieClipですよー!っていうことですね。もう忘れないw

補足

この方法でアクセスできなかったパターンがありました。

TypeError: Error #1034: 強制型変換に失敗しました。flash.display::Stage@4e9df99 を flash.display.MovieClip に変換できません。

このようなエラーが出てしまい、タイムラインに書いている関数にアクセスすることができませんでした。条件は下記のとおり。
1. リンケージでクラスを作ってmyMcにする。
1. new myMc();をstage.addChild();する。
1. 作ったクラスの再生途中でMovieClip(root).hoge();関数が実行できない。

ActionScript3
1
2
3
4
5
6
var mc:MovieClip = new myMc();
stage.addChild(mc);
// myMcの中にある関数でここを実行
function hoge():void{
    trace("ほげ");
}

原因は、addChildする場所に問題があるみたいです。この例ではstageに対してaddChild();していますが、メインのタイムラインに書いてある関数はrootに対してアクセスすることができるので、stageはMovieClipに変換できません。というアラーとっぽいです。rootはタイムラインを含むでっかいMovieClipなので、リンケージで設定したクラスに書かれている関数でメインのタイムラインに書いているfunctionにアクセスしようとするには、newしたクラスのMovieClipはMovie(root)にaddChildしてあげなければなりません。

ActionScript3
1
2
3
4
5
6
var mc:MovieClip = new myMc();
MovieClip(root).addChild(mc);
// myMcの中にある関数でここを実行
function hoge():void{
    trace("ほげ");
}

こうかくことによって、hoge();にアクセスすることができます。もうお気づきかと思いますが、addChild();の前に何も書かなくても大丈夫です。でも、なんか気持ち悪いですよね。前面背面にアクセスしたいときに、どこにaddChild();したかわからなくなりますよね。その場合は、タイムラインはでっかいMovieClipなんで、自分自身を指す「this」と書いてあげるとわかりやすいかもしれません。

ActionScript3
1
2
3
4
5
6
var mc:MovieClip = new myMc();
this.addChild(mc);
// myMcの中にある関数でここを実行
function hoge():void{
    trace("ほげ");
}

説明がながくなっちゃいましたが、ようはstageにaddChildしなければ大丈夫です。