
ActionScript2.0では外部asファイルとしてクラスを作成する事ができます。クラスを作成すると、スコープやらなにやらそのクラス内で処理を行う事ができるので、なれると非常に便利だったりします。また、お気に入りのテキストエディタで作業ができるというのもポイントが高いです。Flashのアクションスクリプトエディタはやっぱりなんだかんだいって使いづらいです。
さらに、Flashファイル内のフレームアクションやボタンアクション、ムービークリップアクションを多用していると、いろんな所にActionScriptが書かれる訳ですから、更新の必要が出てきた時なんかになかなか対応が難しいなんて自体に陥る場合もあります。その点、外部クラスとして全ての処理を保持しておくと見やすいですし、更新もさくさく(いくかどうかはスキル次第ですが)。
というわけでまず外部クラスを使って、_rootに表示されているムービークリップ「b_mc」をクリックすると「クリック!」と表示されるクラスを作ってみましょう。
class SampleClick {
var base:MovieClip;
function SampleClick(mc:MovieClip){
basemc = mc;
setBtn();
}
function setBtn():Void{
basemc.b_mc.onRelesae = function(){
trace("クリック!");
}
}
}
以上のコードをテキストエディタにコピペして、対象の.fla(_root上にインスタンス名「b_mc」ムービークリップが配置されている.fla)と同じディレクトリにSampleClick.asとして保存してください。
var sample = new SampleClick(this);
そしてFlash側の_rootのフレームアクションに上の一行のコードを書いてください。これで_rootをスコープとした外部クラス「SampleClick」が呼び出され、実行されます。出力パネルに「クリック!」と表示されたら成功です。
このサンプルの肝は、_root.b_mc.onReleaseとせず、basemc.b_mc.onReleaseとしているところ。わざわざ_rootをthisと指定し、それを変数に入れているのはなぜかという所になります。
理由は、もしこのファイルがloadMovieなんかで別のSWFからロードされる時、_rootを使っていたらこのSWFを読み出す親側のSWFの_rootをさす事になってしまいます。もちろんロックルートなんかで_rootのスコープ固定する事ができますが、それはそれでややこしくなってしまうので(あえて親側の_rootにアクセスしたい時とか)、_rootを生かしつつ直感的に作る方法として以上のような方法を取るのです。
ところでこの方法だとonReleaseの関数からクラス内の別の関数を呼び出す事が出来ません。なぜかと言うと、別の関数例えば「helloWorld()」を作ったとして、onRelease文の中にhelloWorld()を実行しようとしても、onReleaseの中ではonReleaseの中でしか実行出来ないのでhelloWorldを実行できません。同様にbasemcもonReleaseの中では利用できません。
というわけで以下のようにします。
class SampleClick2 {
var basemc;
function SampleClick2(mc:MovieClip){
basemc = mc;
setBtn();
}
function setBtn():Void{
var scope = this;
basemc.b_mc.onRelease = function(){
scope.helloWorld();
}
}
function helloWorld():Void{
trace("HELLO WORLD");
}
}
こんどは「SampleClick2.as」として保存し、フレームアクションは以下のようにします。
var sample = new SampleClick2(this);
onReleaseの関数内からクラス内の別の関数を呼び出すには「ローカル変数」でクラスのスコープを先に宣言しておいてそのローカル変数を利用してクラス内の別の関数を呼び出します。onReleaseならローカル変数なら利用可能です。
ちなみにActionScript3.0ではどうなるかは次のエントリーで。

