*ドキュメントクラス超解説 [#ebbef1f2]

**某beinteractiveさんによる超解説 [#x7b6d971]

ドキュメントクラスが実行されるのは、1フレーム目がロードされきった時なので、&br;
これよりも前に色々書き出されてるといつまでたってもプリローダとかが実行されない。&br;
&br;
#ref("sample1.png",left,wrap)
&br;

「いろいろ」の部分を 2フレーム目に持っていき、ドキュメントクラスをすぐ実行できるようにしたい。&br;
こんな感じに2フレーム目にいろいろMCなど配置する。&br;
&br;
#ref("sample2.png",left,wrap)
&br;

ドキュメントクラスはどうするか?
&br;
#geshi(ActionScript){{

package
{
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.display.Stage;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.utils.getDefinitionByName;

	public class DocumentRoot extends MovieClip
	{
		public function DocumentRoot() 
		{
			stage.scaleMode = StageScaleMode.NO_SCALE;
			stage.align = StageAlign.LEFT;

			addEventListener(Event.ENTER_FRAME, _initialHandler);
		}
		
		private function _initialHandler(e:Event):void 
		{
			//3フレーム目まで到達すればロードが完了
			if (currentFrame == 3) {
				removeEventListener(Event.ENTER_FRAME, _initialHandler);
				stop();

				initialize();
			} else {
				var percent:Number = (loaderInfo.bytesLoaded / loaderInfo.bytesTotal) * 100;
				trace("Loading... " + percent + "%");
			}
		}

		protected function initialize():void
		{
			//var s:Sample1 = new Sample1();
			var sample1:Class = getDefinitionByName('Sample1') as Class;
			var s:Sprite = new sample1();
		}
	}
}

}}


基本的に、「あるクラスが使うクラス」は、そのクラスが実行される前に全てロードされてる必要がある。&br;
ということは、その「あるクラス」よりも、確実に前にロードされるように SWF に配置する必要がある。&br;
&br;
DocumentRoot の中で var s: Sample1 = new Sample1() としてしまうと、&br;
DocumentRoot クラスが「使うクラス」である「Sample1」クラスは、DocumentRoot クラスよりも前に読み込まなきゃいけない。&br;
つまり、Sample1 が読み込み終わるまで DocumentRoot が実行されないので、意味が無い。&br;
こんな図のような感じになってしまう。&br;
&br;
#ref("sample3.png",left,wrap)
&br;

で、ここで出てくるのが getDefinitionByName &br;
クラスは取得するけど、「このクラスはこのクラスが必要です」とまでは主張しない。&br;
するとこんな図のような感じになる。&br;
&br;
#ref("sample4.png",left,wrap)
&br;

となって、見事 2フレーム目に埋め込まれる。&br;

&br;
#ref("sample5.png",left,wrap)
&br;

そうすると、1フレーム目では Sample1 クラスはロードされていないんだけど、&br;
3フレーム目になればきちんとロードされていて、getDefinitionByName で取得できる、という状況が出来上がる。&br;
つまり、getDefinitionByName を使うのは、確実に1フレーム目ではなく2フレーム目に埋め込むため。&br;

**サンプル [#had847ef]
-flaファイル:[[DocumentClass.zip:http://sample.minaco.net/flash/documentclass/DocumentClass.zip]]
-flaファイル:[[DocumentClass.zip:http://wiki.minaco.net/data/flash/documentclass/DocumentClass.zip]]

**参考 [#n1af68ec]
-[[Flash/ドキュメントクラス>Flash/ドキュメントクラス]]
-[[Flash/関数/getDefinitionByName>Flash/関数/getDefinitionByName]]



&br;
*Comment [#t26a3b4e]
#comment_nospam
&br;
#counter

IP:121.2.158.234 TIME:"2009-06-09 (火) 21:17:18" REFERER:"http://wiki.minaco.net/index.php?cmd=edit&page=Flash%2F%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E3%82%AF%E3%83%A9%E3%82%B9%E8%B6%85%E8%A7%A3%E8%AA%AC" USER_AGENT:"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; ja-JP-mac; rv:1.9.0.10) Gecko/2009042315 Firefox/3.0.10"

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS