ムービークリップをクラス化する

前回の追記

 日本語版もありました。ビデオのチュートリアル。英語版に比べると、かなりトピックが少ないですが、Appleなんかと比べると頑張ってる方だと思います。
 Adobe - Design Center - Video workshop[日本語版]
 他にもなんか、追記したり訂正したりすべきことが前回の内容にはあったような気がするけど、過去は振り向かないぜ。

 Σc ' _' )  < 人はそれを鳥頭と呼ぶ
 $ σ_σ$  < 単に海馬が腐ってんのよね

 で、今回はムービークリップをクラス化して、スクリプトで生成して使えるようにしよう、というか主な目的はスクリプトを外部ファイルかしよう、というところかもしんない。

とりあえず、クラス化

 かなり前の記事で、まだ正式リリース前のものだが特に問題はなさそうなので、ActionScript 3.0書き方教室を参考にムービークリップのクラス化を行う。
 以前のFlashは1フレーム目にタイムライン全体で使う関数の定義をするというパターンが使われていたが、いかにも泥臭い。
 ムービークリップを継承したクラスを制作することで、そのへんの定義をスマートにしましょう。ということだと思う。
 いいねスマート。ナイススマート。では早速制作。

  1. 適当なムービークリップを作る(生成されたことが分かりやすいように何か描いておくといい)
  2. 名前をつける(この名前はAS的には何からも参照されない。ライブラリでのIDでしかないので、日本語でつけても構わないぐらい)
  3. [詳細]の中にある、リンケージの[ActionScriptに書き出し]をチェック。
  4. クラス名をつける(デフォルトで2.でつけた名前が付く。これがASのクラス名となるので非常に重要)
    基本クラスはデフォルトでflash.display.MovieClip。これはスクリプトで定義する場合のextendsにあたる。これはそのままにしておく。
  5. [OK]を押す。
    「このクラスの定義がクラスパス内に見つからなかったため、定義は書き出し時にSWFファイル内に自動生成されます。」
    と注意ダイアログが出るが気にせず、さらに[OK]。

 これで、クラス作りの下準備が完了。
 一応はムービークリップの中に作った文字・絵・タイムラインを持った、新たなオブジェクトが定義されたともいえる。

 単にステージにオーサリングで置いては、クラス化されてるんだかなんだかわからないので、ActionScriptから使って見る。
 SampleClassというクラス名のオブジェクトを定義したとすると、コードは次のような感じ。
 タイムラインに次のスクリプトを書くと、ちゃんとさっき作ったムービークリップがステージに生成される。

var obj:SampleClass = new SampleClass();
addChild( obj );

クラス定義スクリプトを書く

 クラスパスにクラスと同名の.asファイルがあると、そのファイルを読み込んでクラスの定義に使われる。
 クラスパスは、グローバルクラスパスとドキュメントレベルのクラスパスがあり、それぞれの設定は以下の通り。

 グローバルクラスパスは、[環境設定...]-[ActionScript]-[ActionScript 3.0 設定...]で確認できる。具体的には以下のものがデフォルト。

 ドキュメントレベルのクラスパスは、[パブリッシュ設定...]-[Flash]、ActionScriptのバージョンの右にある[設定...]-[クラスパス]に設定。
 デフォルトでは何も設定されていない。
 詳しくは、ヘルプのクラスパスの変更を参照。

 ちなみにドキュメントクラスは、トップレベルつまりflaファイル全体のクラスとして設定されるもの。たぶん、グローバルな処理とか定数とか定義しておくところだと思う。
 ドキュメントプロパティの[ドキュメントクラス]の部分で設定できる。先ほどのドキュメントレベルのクラスパスを設定するダイアログでも設定できる。
 詳しくはドキュメントクラスの宣言を参照のこと。

 要はとりあえず同じ階層にクラスファイルを置けばイイということだ。
 クラス名.asという名前のテキストファイルを置いて、スクリプトを書く。
 この名前は、必ずクラス名と同じものにする必要がある。

package [パッケージ名] {
  class クラス名 {
    // プロパティ(変数)宣言
    function クラス名() {
      // インスタンス生成時の初期化処理
    }
    // メソッド(関数)定義
  }
}

 というかんじのが基本骨格。
 SampleClass.asの場合、次のようなスクリプトになる。パッケージ名は省略できる。 ムービークリップのプロパティで、flash.display.MovieClipを基本クラス(extends)に指定しているので、MovieClipを親クラスに指定する。コンストラクタにsuper();を書いて親を呼ぶ必要は特に無さそう。どうもそのへんは、パブリッシュ時によきに計らってくれているみたい。

package {
  import flash.display.MovieClip;
  public class SampleClass extends MovieClip {
    function SampleClass() {
    }
  }
}

 MovieClipの代わりに、Spriteを使うこともできる。ただしSpriteはタイムラインがない。
 1フレームしかないムービークリップなら、Spriteにしておいたほうが軽く扱いやすい。ActionScriptから使う場合はSpriteの方が基本。

package {
  import flash.display.Sprite;
  public class SampleClass extends Sprite {
    function SampleClass() {
    }
  }
}

ドキュメントクラスを使う

 以前から1フレームだけを特別扱いするのが、非常に気持ち悪い作法だと思ってたんだけど、これですっきりですわー。

 前々回作った漫才をドキュメントクラス化して、すっきりしておこう。

 importしなきゃいけないのがちょい面倒といえば面倒だし、分かりやすいといえば分かりやすい。
 以下のスクリプトをMain.asのファイル名で保存、ドキュメントプロパティのドキュメントクラスをMainにしておく。

package {
  import flash.display.MovieClip;
  import flash.text.TextField;
  import flash.net.URLRequest;
  import flash.net.URLLoader;
  import flash.utils.Timer;
  import flash.events.Event;
  import flash.events.TimerEvent;

  public class Main extends MovieClip {
	private var textio_xml:XML = new XML();
	private const XML_REQUEST:URLRequest = new URLRequest( "textio.xml" );
	private var XMLLoader:URLLoader;
	// Timer用
	private var pCounter:int = 0;
	private var timerObj:Timer;
	  
    function Main() {
		// XML読み込み用
		XMLLoader = new URLLoader( XML_REQUEST );
		XMLLoader.addEventListener( Event.COMPLETE, xmlLoaded );
    }

	function xmlLoaded(event:Event):void {
		textio_xml = XML( XMLLoader.data );
		var maxP:int = textio_xml.act[ 0 ].p.length();
		timerObj = new Timer( 1 ,maxP );
		timerObj.addEventListener( TimerEvent.TIMER, onTick );
		timerObj.start();
	}

	function onTick(e:TimerEvent):void {
		var curP:XML = textio_xml.act[0].p[ timerObj.currentCount - 1 ];
		timerObj.delay = curP.toString().length * 100;
		_txt.appendText( curP.@name.toString() + " : " + curP.toString() + "¥n" );
	}
  }
}

 外部エディタでも編集できるけど、Flash CS3で編集してターゲットを組み込むflaにしておけばシームレスに編集できる。
 まぁ、あいかわらずできが良くないエディタなので、大抵はお気に入りのコードエディタで書くとは思うんだけど。私の場合はmi

 今日はここまで。


2008-02-21