<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>FlashImp &#187; metadata</title>
	<atom:link href="http://flashimp.ru/tag/metadata/feed" rel="self" type="application/rss+xml" />
	<link>http://flashimp.ru</link>
	<description>Flash Implosion new generation</description>
	<lastBuildDate>Fri, 02 Mar 2012 07:30:09 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Preloading in three frames system.</title>
		<link>http://flashimp.ru/39</link>
		<comments>http://flashimp.ru/39#comments</comments>
		<pubDate>Tue, 22 Dec 2009 10:49:12 +0000</pubDate>
		<dc:creator>Александр Козловский</dc:creator>
				<category><![CDATA[Накодил]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[metadata]]></category>
		<category><![CDATA[mxmlc]]></category>
		<category><![CDATA[preloading]]></category>

		<guid isPermaLink="false">http://flashimp.ru/?p=39</guid>
		<description><![CDATA[<pre lang="xml">
<![CDATA[
<flex-config>
	<compiler>
		<keep-as3-metadata>
			<name>App</name>
		</keep-as3-metadata>
	</compiler>
</flex-config>
]]>
</pre>



Для начала несколько слов прелюдии.
Примерно полтора года назад я накодил простенький передзагрузчик (<a title="Dreaming in Flash: Actionscript 3 Preloader" href="http://www.dreaminginflash.com/2007/11/13/actionscript-3-preloader/" target="_blank">аналог</a>), стартующий до инициализации главного класса приложения, и периодически его дополнял и частично переписывал. Таким образом один класс вырос в целую систему, поддерживающую модульную архитектуру, полиморфизм, и предзагрузку необходимых ассетов.
Эту разработку я частенько сам использую в больших многомодульных проектах, где есть одна или несколько библиотек (swc) и огромное количество модулей, эти библиотеки использующие; Предзагрузчик у всех модулей - один, следовательно вынесен в библиотеку, а не клонируется по всей команде разработчиков от проекта к проекту. При этом (частая ситуация) хорошо было бы, что бы все модули приложения могли работать как самостоятельно, так и внутри любого другого модуля, - т.е. полиморфизм. Вот эту ситуацию и возьму за основу.

По-сути, мое решение представляет из себя неслабое универсализированное расширение уже давно описанных метод: <a title="Flash-разработка: Делаем прелоадер для Flex-приложения. AS3." href="http://racer242.blogspot.com/2008/01/flex-as3.html" target="_blank">тут (по-русски)</a>, <a title="BIT-101 Blog: Preloaders in AS3" href="http://www.bit-101.com/blog/?p=946" target="_blank">тут</a> и <a title="Roger Gonzalez: Modular Applications (part 2)" href="http://blogs.adobe.com/rgonzalez/2006/06/modular_applications_part_2.html" target="_blank">тут</a> - настоятельно рекомендую ознакомиться перед продолжением.

Теория.
Добавляя в Главный Класс метадату:
<pre lang="actionscript3">[Frame(factoryClass="ru.kozlovskij.preload.Preloader")]</pre>
мы получаем вот такой результат:
[Схема с нашим классом]

Но все было бы чудесно, если б не одна проблема: Наш предзагрузчик понятия не имеет об имени главного класса приложения, который ему надо инстанциировать, а заниматься жестким хардкодом в большом проекте - непозволительная роскошь. Первая мысль была такова:
В каждом проекте-модуле использовать в качестве предзагрузчика субкласс того основного, что находится в библиотеке и остается неизменным. В этом субклассе мы просто переопределяем значение protected переменной <strong>MAINCLASS_NAME</strong>, ранее заведенной в основном классе и далее используем ее при инстанциировании нужного нам главного класса приложения. Но это мне вскоре надоело (неудобно) и было придумано более интересное решение:
Предзагрузчик наш остается в библиотеке, не имеет никаких субклассов (можно даже сделать его final). После загрузки всей свифки он сам найдет нужное ему имя класса в метаданных, а в голове главного класса мы просто впишем свой кастомный метатэг:
<pre lang="actionscript3">[App(className='ИмяГлавногоКласса')]</pre>
Что бы компиллер "увидел" наш метатэг, в параметры компилятора (в свойствах проекта) впишем:
<code>-load-config cfg.xml</code>
(про параметры компилятора подробности <a title="About the application compiler options" href="http://livedocs.adobe.com/livecycle/es/sdkHelp/programmer/lcds/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&#38;file=compilers_09.html" target="_blank">тут</a>)
А в конфиге мы явно укажем, что на наш метатэг стоит обратить внимание:

<em>cfg.xml</em>:
<pre lang="xml" escape="true">
&#60;flex-config&#62;
	&#60;compiler&#62;
	&#60;keep-as3-metadata&#62;
	&#60;name&#62;App&#60;/name&#62;
	&#60;/keep-as3-metadata&#62;
	&#60;/compiler&#62;
&#60;/flex-config&#62;
</pre>

<em>Main.as</em> - главный класс нашего приложения:
<pre lang="actionscript3">package {
	import flash.display.FrameLabel;
	import flash.display.MovieClip;
	import flash.events.Event;
	import flash.utils.*;

	import ru.kozlovskij.core.Application;
	import ru.kozlovskij.preload.Preloader;

	/**
	* SWF metadata
	*/
	[SWF(backgroundColor='0xFFCC00', width='500', height='500')]

	/**
	* The frameworks must be initialized by SystemManager.
	* This factoryClass will be automatically subclassed by any
	* MXML applications that don't explicitly specify a different
	* factoryClass.
	*
	* NOTE: Minimize the non-Flash classes you import here.
	* Any dependencies of SystemManager have to load in frame 1,
	* before the preloader, or anything else, can be displayed.
	*/
	[Frame(factoryClass='ru.kozlovskij.preload.Preloader')]
	//[Frame(factoryClass='exampleClasses.MyPreloader')]

	/**
	* Custom metadata tags
	*/
	[App(type='module', className='Main')]
	[copyrights(firstName='Aleksandr', lastName='Kozlovskij', url='http://Kozlovskij.ru', blog='http://FlashImp.ru')]
	public class Main extends Application
	{
		public function Main()
		{
			super();
			addEventListener(Preloader.PRELOADER_DONE, preloaderDoneHandler);
		}

		private function preloaderDoneHandler(e:Event):void
		{
			//initialize...
			for(var i:int; i &#60; (parent as MovieClip).currentLabels.length; ++i)
				trace('FrameLabel:', '[', FrameLabel((parent as MovieClip).currentLabels[i]).name,
					  ',', FrameLabel((parent as MovieClip).currentLabels[i]).frame, ']');
			(parent as MovieClip).nextFrame();
			parent.addChild(new (flash.utils.getDefinitionByName('exampleClasses.CustomFrame') as Class)());
		}
	}
}</pre>
Метод <strong>preloaderDoneHandler</strong> вызывается, когда от предзагрузчика мы получаем событие об окончании загрузки всего необходимого (+ассеты?). В <strong>preloaderDoneHandler</strong> мы, удовлетворения ради, выводим в трэйс все, имеющиеся в нашем распоряжении (в родителе-предзагрузчике) фрэймы. В последних двух строках мы переходим в третий кадр и инстанциируем класс, который был загружен последним - об этом чуток ниже.
Во многих моих реализациях данного подхода я либо создавал в <strong>Main</strong> классе метод, возвращающий массив урлов к тому, что еще необходимо загрузить, что было несколько криво и не гибко, либо записывал эту информацию в метаданные, что позволяло предзагрузчику все необходимое скачать еще до инициализации главного класса, а он в свою очередь рождался "на всем готовом". Нюансы реализацию такой инициализации приложения я покажу позже, а сейчас - простой пример того самого предзагрузчика:

<em>Preloader.as</em> - собственно, сам прелоудер:
<pre lang="actionscript3">package ru.kozlovskij.preload
{
	import flash.display.DisplayObject;
	import flash.display.MovieClip;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	import flash.system.ApplicationDomain;
	import flash.utils.ByteArray;

	import ru.etcs.utils.ClassExplorer;

	[Event(name="preloaderDone", type="ru.kozlovskij.preload.Preloader")]
	public class Preloader extends MovieClip
	{
		public static const PRELOADER_DONE:String = 'preloaderDone';

		protected var MAINCLASS_NAME:String;

		protected var preloaderGraphics:IPreloaderGraphics;

		private var Main:Class;
		private var main:DisplayObject;

		protected var _standalone:Boolean = true;
		protected function get standalone():Boolean
		{return _standalone;}

		public function Preloader(preloaderGraphics:IPreloaderGraphics = null)
		{
			stop();

			this.preloaderGraphics = preloaderGraphics ? preloaderGraphics : new PreloaderGraphics();

			if(stage)
				stage.scaleMode = StageScaleMode.NO_SCALE,
				stage.align = StageAlign.TOP_LEFT,
				stage.frameRate = 31,
				createGraphics(),
				stage.addEventListener(Event.RESIZE, resizeHandler);
			else
				_standalone = false;

			addEventListener(Event.ENTER_FRAME, enterFrameHandler);

			resizeHandler();
		}

		protected function createGraphics():void
		{
			addChild(preloaderGraphics as DisplayObject);
		}

		private function enterFrameHandler(e:Event):void
		{
			//percent = current / total
			var percent:Number = root.loaderInfo.bytesLoaded / root.loaderInfo.bytesTotal;
			preloaderGraphics.percent = percent * 100;

			//trace(Math.round(100 * percent) + '%');

			if(framesLoaded == totalFrames)
			{
				removeEventListener(Event.ENTER_FRAME, enterFrameHandler);

				//Move to the next frame when we're done
				//Moving to frame 1(!)
				nextFrame();

				preinit();
			}
		}

		protected function resizeHandler(e:Event = null):void
		{
			preloaderGraphics.x = stage ? stage.stageWidth / 2 : root.width / 2,
			preloaderGraphics.y = stage ? stage.stageHeight / 2 : root.height / 2;
		}

		private function preinit(mainclass_name_from_metadata:String = null):void
		{
			var needThrow:Boolean = true;
			MAINCLASS_NAME = mainclass_name_from_metadata ? mainclass_name_from_metadata :
							 MAINCLASS_NAME ? MAINCLASS_NAME : null;
			MAINCLASS_NAME ? null : (needThrow = false, getMETAMainClassName());
			if(needThrow &#38;&#38; !MAINCLASS_NAME)
			{
				clear();
				throw new Error(this.toString() + ': Main Class Definition eq null');
			}

			var has:Boolean = ApplicationDomain.currentDomain.hasDefinition(MAINCLASS_NAME);
			if(has)//if main app
				Main = ApplicationDomain.currentDomain.getDefinition(MAINCLASS_NAME) as Class;
			else
			{
				has = loaderInfo.applicationDomain.hasDefinition(MAINCLASS_NAME);
				if(has)//if module app
					Main = loaderInfo.applicationDomain.getDefinition(MAINCLASS_NAME) as Class;
			}

			if(has)
			{
				//and instantiate our Main class
				main = new Main();

				//get urls, whot need to additional preloading before starting application (in next post..)

				init();
				clear();
			}
			else
			if(needThrow)
			{
				clear();
				throw new Error(this.toString() + ': Main Class Definition NOT FOUND');
			}
		}

		private function init():void
		{
			//finally we add main class to the DisplayList and dispatching event
			addChild(main as DisplayObject).dispatchEvent(new Event(PRELOADER_DONE));

			//stage.addChild(main as DisplayObject) - only if we make a standalone app.
		}

		public function clear():void
		{
			//killing &#38; clearing preloaderGraphics :)
			IPreloaderGraphics(removeChild(preloaderGraphics as DisplayObject)).clear();

			standalone ? (stage.removeEventListener(Event.RESIZE, resizeHandler), stage.removeChild(this)) : null;
		}

		//-----------------------------------------------------//
		private function getMETAMainClassName():void
		{
			var bytes:ByteArray = new ByteArray();
				bytes.objectEncoding = 3;
				bytes.writeBytes(loaderInfo.bytes);
				bytes.position = 0;
			var explorer:ClassExplorer = new ClassExplorer();
				explorer.loadBytes(bytes);
				explorer.addEventListener(Event.COMPLETE, explorerWorkCompleteHandler);
		}

		private function explorerWorkCompleteHandler(e:Event):void
		{
			var explorer:ClassExplorer = e.target as ClassExplorer;
			var xml:XML = explorer.getDefinitionInfo();
			//trace(xml.toXMLString());
			var className:String;
			className = xml.definition/*.(@name == 'frame2')*/.script.classTrait.metadata.(@name == 'App').arg.(@key == 'className').@value.toString();
			preinit(className);
		}
	}
}</pre>
Как видно, в данной реализации я оставил возможность наследовать этот класс и переопределять значение переменной <strong>MAINCLASS_NAME</strong>. Так же в конструктор можно передать экземпляр визуализатора процесса загрузки, реализующий интерфейс <strong>IPreloaderGraphics</strong>. По умолчанию создается инстанс <strong>PreloaderGraphics</strong> - простейший субкласс <strong>DisplayObject</strong>'a, содержащий в себе текстовое поле для отображения процентов - это я тоже упростил:)

<em>ru.kozlovskij.preload.PreloaderGraphics</em>:
<pre lang="actionscript3">package ru.kozlovskij.preload
{
	import flash.display.Sprite;
	import flash.text.TextField;
	import flash.text.TextFormat;
	import flash.text.TextFormatAlign;

	public class PreloaderGraphics extends Sprite implements IPreloaderGraphics
	{
		private var text:TextField = new TextField();

		public function PreloaderGraphics()
		{
			super();

			addChild(text);

			text.defaultTextFormat = new TextFormat('Tahoma');
			text.defaultTextFormat.align = TextFormatAlign.CENTER,
			text.defaultTextFormat.size = 13,
			text.defaultTextFormat.letterSpacing = 1,
			text.defaultTextFormat.bold = true;

			text.borderColor = text.textColor = 0x0,
			text.selectable = !(text.border = true),
			text.width = 100,
			text.height = 50;

			percent = 0;
		}

		private var _percent:Number = 0;
		public function set percent(value:Number):void
		{
			_percent = value;
			text.text = 'Loading...\n' + uint(value) + '%';
		}

		public function get percent():Number
		{
			return _percent;
		}

		public function clear():void
		{
			removeChild(text);
		}
	}
}</pre>
Вернемся к <strong>ru.kozlovskij.preload.Preloader</strong>. Как это все работает?
Запускается конструктор, подписываемся на событие <strong>Event.ENTER_FRAME</strong> и постоянно проверяем, не завершилась ли загрузка; Загрузка завершена, находим в метаданные и в них - имя главного класса (<strong>preinit</strong>-&#62;<strong>getMETAMainClassName</strong>-&#62;<strong>explorerWorkCompleteHandler</strong>-&#62;<strong>preinit</strong>), инициализируем главный класс, не забыв перед этим перескочить на второй кадр, - вот такая последовательность.
В демонстрируемой реализации в качестве "поисковика метадаты" я использовал <strong>ClassExplorer</strong>, за что отдельное спасибо <a title=" Записки о Flash:  ClassExplorer" href="http://etcs.ru/blog/as3/classexplorer/" target="_blank">автору</a>.
Для наших целей пришлось немного его подправить. Не помню уже где и что исправлял - интересующимся поможет любой мержер, например, <a title="Araxis Merge" href="http://www.araxis.com/merge/?gclid=CIzW9-b97J4CFUQM3god2REvNA" target="_blank">Araxis Merge</a>, который я считаю очень достойным.

Единственный минус - это то, что при каждом добавлении нового метатэга, необходимо прописывать его в конфиге компиляции.

Теперь от третьим кадре:
Для того, чтобы в нашем рутовом классе (рутовый он только в случае, если приложение самостоятельное, не модуль), являющимся по-совместительству предзагрузчиком, при компиляции создался третий кадр, конфигурационный файл необходимо дополнить следующим образом:

<em>cfg.xml</em>:
<pre lang="xml" escape="true">
&#60;flex-config&#62;
	&#60;compiler&#62;
		&#60;keep-as3-metadata&#62;
			&#60;name&#62;App&#60;/name&#62;
		&#60;/keep-as3-metadata&#62;
	&#60;/compiler&#62;
	&#60;frames&#62;
		&#60;frame&#62;
			&#60;label&#62;newFrameName&#60;/label&#62;
			&#60;classname&#62;exampleClasses.CustomFrame&#60;/classname&#62;
		&#60;/frame&#62;
	&#60;/frames&#62;
&#60;/flex-config&#62;
</pre>
Класс <strong>exampleClasses.CustomFrame</strong> будет экспортирован во фрэйм "<strong>newFrameName</strong>". Третьим этот фрэйм будет потому, что два уже есть.
По непонятной мне причине, добавлять ноды для четвертого, пятого и т.д. фрэймов - бесполезно.

Теперь смотрим в <em>Main.as</em> на метод <strong>preloaderDoneHandler</strong>. Последние два строки - по-сути, тоже самое, что и в <strong>ru.kozlovskij.preload::Preloader</strong>, т.е. переход на следующий кадр и инициализация соответствующего класса.

Уф.. Вот и все. Наконец, <a title="download src (free))" href="http://FlashImp.ru/files/39/PreloadingDemo1.zip">исходный код (экспорт проекта)</a>.

П.С.: Совет: Не подписывайтесь на <strong>ProgressEvent.PROGRESS</strong> к собственному же <strong>loaderInfo</strong>!]]></description>
			<content:encoded><![CDATA[<p>Для начала несколько слов прелюдии.<br />
Примерно полтора года назад я накодил простенький передзагрузчик (<a title="Dreaming in Flash: Actionscript 3 Preloader" href="http://www.dreaminginflash.com/2007/11/13/actionscript-3-preloader/" target="_blank">аналог</a>), стартующий до инициализации главного класса приложения, и периодически его дополнял и частично переписывал. Таким образом один класс вырос в целую систему, поддерживающую модульную архитектуру, полиморфизм, и предзагрузку необходимых ассетов.<br />
Эту разработку я частенько сам использую в больших многомодульных проектах, где есть одна или несколько библиотек (swc) и огромное количество модулей, эти библиотеки использующие; Предзагрузчик у всех модулей - один, следовательно вынесен в библиотеку, а не клонируется по всей команде разработчиков от проекта к проекту. При этом (частая ситуация) хорошо было бы, что бы все модули приложения могли работать как самостоятельно, так и внутри любого другого модуля, - т.е. полиморфизм. Вот эту ситуацию и возьму за основу.</p>
<p>По-сути, мое решение представляет из себя неслабое универсализированное расширение уже давно описанных метод: <a title="Flash-разработка: Делаем прелоадер для Flex-приложения. AS3." href="http://racer242.blogspot.com/2008/01/flex-as3.html" target="_blank">тут (по-русски)</a>, <a title="BIT-101 Blog: Preloaders in AS3" href="http://www.bit-101.com/blog/?p=946" target="_blank">тут</a> и <a title="Roger Gonzalez: Modular Applications (part 2)" href="http://blogs.adobe.com/rgonzalez/2006/06/modular_applications_part_2.html" target="_blank">тут</a> - настоятельно рекомендую ознакомиться перед продолжением.</p>
<p>Теория.<br />
Добавляя в Главный Класс метадату:</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #000000;">&#91;</span>Frame<span style="color: #000000;">&#40;</span>factoryClass=<span style="color: #990000;">&quot;ru.kozlovskij.preload.Preloader&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span></pre></div></div>

<p>мы получаем вот такой результат:<br />
[Схема с нашим классом]</p>
<p>Но все было бы чудесно, если б не одна проблема: Наш предзагрузчик понятия не имеет об имени главного класса приложения, который ему надо инстанциировать, а заниматься жестким хардкодом в большом проекте - непозволительная роскошь. Первая мысль была такова:<br />
В каждом проекте-модуле использовать в качестве предзагрузчика субкласс того основного, что находится в библиотеке и остается неизменным. В этом субклассе мы просто переопределяем значение protected переменной <strong>MAINCLASS_NAME</strong>, ранее заведенной в основном классе и далее используем ее при инстанциировании нужного нам главного класса приложения. Но это мне вскоре надоело (неудобно) и было придумано более интересное решение:<br />
Предзагрузчик наш остается в библиотеке, не имеет никаких субклассов (можно даже сделать его final). После загрузки всей свифки он сам найдет нужное ему имя класса в метаданных, а в голове главного класса мы просто впишем свой кастомный метатэг:</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #000000;">&#91;</span>App<span style="color: #000000;">&#40;</span>className=<span style="color: #990000;">'ИмяГлавногоКласса'</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span></pre></div></div>

<p>Что бы компиллер "увидел" наш метатэг, в параметры компилятора (в свойствах проекта) впишем:<br />
<code>-load-config cfg.xml</code><br />
(про параметры компилятора подробности <a title="About the application compiler options" href="http://livedocs.adobe.com/livecycle/es/sdkHelp/programmer/lcds/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&amp;file=compilers_09.html" target="_blank">тут</a>)<br />
А в конфиге мы явно укажем, что на наш метатэг стоит обратить внимание:</p>
<p><em>cfg.xml</em>:</p>
<pre lang="xml" escape="true">
&lt;flex-config&gt;
	&lt;compiler&gt;
	&lt;keep-as3-metadata&gt;
	&lt;name&gt;App&lt;/name&gt;
	&lt;/keep-as3-metadata&gt;
	&lt;/compiler&gt;
&lt;/flex-config&gt;
</pre>
<p><em>Main.as</em> - главный класс нашего приложения:</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #9900cc; font-weight: bold;">package</span> <span style="color: #000000;">&#123;</span>
	<span style="color: #0033ff; font-weight: bold;">import</span> <span style="color: #004993;">flash.display</span>.<span style="color: #004993;">FrameLabel</span>;
	<span style="color: #0033ff; font-weight: bold;">import</span> <span style="color: #004993;">flash.display</span>.<span style="color: #004993;">MovieClip</span>;
	<span style="color: #0033ff; font-weight: bold;">import</span> <span style="color: #004993;">flash.events</span>.<span style="color: #004993;">Event</span>;
	<span style="color: #0033ff; font-weight: bold;">import</span> <span style="color: #004993;">flash.utils</span>.<span style="color: #000000; font-weight: bold;">*</span>;
&nbsp;
	<span style="color: #0033ff; font-weight: bold;">import</span> ru.kozlovskij.core.Application;
	<span style="color: #0033ff; font-weight: bold;">import</span> ru.kozlovskij.preload.Preloader;
&nbsp;
	<span style="color: #3f5fbf;">/**
	* SWF metadata
	*/</span>
	<span style="color: #000000;">&#91;</span>SWF<span style="color: #000000;">&#40;</span><span style="color: #004993;">backgroundColor</span>=<span style="color: #990000;">'0xFFCC00'</span>, <span style="color: #004993;">width</span>=<span style="color: #990000;">'500'</span>, <span style="color: #004993;">height</span>=<span style="color: #990000;">'500'</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>
&nbsp;
	<span style="color: #3f5fbf;">/**
	* The frameworks must be initialized by SystemManager.
	* This factoryClass will be automatically subclassed by any
	* MXML applications that don't explicitly specify a different
	* factoryClass.
	*
	* NOTE: Minimize the non-Flash classes you import here.
	* Any dependencies of SystemManager have to load in frame 1,
	* before the preloader, or anything else, can be displayed.
	*/</span>
	<span style="color: #000000;">&#91;</span>Frame<span style="color: #000000;">&#40;</span>factoryClass=<span style="color: #990000;">'ru.kozlovskij.preload.Preloader'</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>
	<span style="color: #009900;">//[Frame(factoryClass='exampleClasses.MyPreloader')]</span>
&nbsp;
	<span style="color: #3f5fbf;">/**
	* Custom metadata tags
	*/</span>
	<span style="color: #000000;">&#91;</span>App<span style="color: #000000;">&#40;</span><span style="color: #004993;">type</span>=<span style="color: #990000;">'module'</span>, className=<span style="color: #990000;">'Main'</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>
	<span style="color: #000000;">&#91;</span>copyrights<span style="color: #000000;">&#40;</span>firstName=<span style="color: #990000;">'Aleksandr'</span>, lastName=<span style="color: #990000;">'Kozlovskij'</span>, <span style="color: #004993;">url</span>=<span style="color: #990000;">'http://Kozlovskij.ru'</span>, blog=<span style="color: #990000;">'http://FlashImp.ru'</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>
	<span style="color: #0033ff; font-weight: bold;">public</span> <span style="color: #9900cc; font-weight: bold;">class</span> Main extends Application
	<span style="color: #000000;">&#123;</span>
		<span style="color: #0033ff; font-weight: bold;">public</span> <span style="color: #339966; font-weight: bold;">function</span> Main<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
		<span style="color: #000000;">&#123;</span>
			<span style="color: #0033ff; font-weight: bold;">super</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
			<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span>Preloader.PRELOADER_DONE, preloaderDoneHandler<span style="color: #000000;">&#41;</span>;
		<span style="color: #000000;">&#125;</span>
&nbsp;
		<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> preloaderDoneHandler<span style="color: #000000;">&#40;</span>e<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Event</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
		<span style="color: #000000;">&#123;</span>
			<span style="color: #009900;">//initialize...</span>
			<span style="color: #0033ff; font-weight: bold;">for</span><span style="color: #000000;">&#40;</span><span style="color: #6699cc; font-weight: bold;">var</span> i<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">int</span>; i <span style="color: #000000; font-weight: bold;">&amp;</span>lt; <span style="color: #000000;">&#40;</span><span style="color: #004993;">parent</span> <span style="color: #0033ff; font-weight: bold;">as</span> <span style="color: #004993;">MovieClip</span><span style="color: #000000;">&#41;</span>.<span style="color: #004993;">currentLabels</span>.<span style="color: #004993;">length</span>; <span style="color: #000000; font-weight: bold;">++</span>i<span style="color: #000000;">&#41;</span>
				<span style="color: #004993;">trace</span><span style="color: #000000;">&#40;</span><span style="color: #990000;">'FrameLabel:'</span>, <span style="color: #990000;">'['</span>, <span style="color: #004993;">FrameLabel</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">parent</span> <span style="color: #0033ff; font-weight: bold;">as</span> <span style="color: #004993;">MovieClip</span><span style="color: #000000;">&#41;</span>.<span style="color: #004993;">currentLabels</span><span style="color: #000000;">&#91;</span>i<span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span>.<span style="color: #004993;">name</span>,
					  <span style="color: #990000;">','</span>, <span style="color: #004993;">FrameLabel</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">parent</span> <span style="color: #0033ff; font-weight: bold;">as</span> <span style="color: #004993;">MovieClip</span><span style="color: #000000;">&#41;</span>.<span style="color: #004993;">currentLabels</span><span style="color: #000000;">&#91;</span>i<span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span>.<span style="color: #004993;">frame</span>, <span style="color: #990000;">']'</span><span style="color: #000000;">&#41;</span>;
			<span style="color: #000000;">&#40;</span><span style="color: #004993;">parent</span> <span style="color: #0033ff; font-weight: bold;">as</span> <span style="color: #004993;">MovieClip</span><span style="color: #000000;">&#41;</span>.<span style="color: #004993;">nextFrame</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
			<span style="color: #004993;">parent</span>.<span style="color: #004993;">addChild</span><span style="color: #000000;">&#40;</span><span style="color: #0033ff; font-weight: bold;">new</span> <span style="color: #000000;">&#40;</span><span style="color: #004993;">flash.utils</span>.<span style="color: #004993;">getDefinitionByName</span><span style="color: #000000;">&#40;</span><span style="color: #990000;">'exampleClasses.CustomFrame'</span><span style="color: #000000;">&#41;</span> <span style="color: #0033ff; font-weight: bold;">as</span> <span style="color: #004993;">Class</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
		<span style="color: #000000;">&#125;</span>
	<span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Метод <strong>preloaderDoneHandler</strong> вызывается, когда от предзагрузчика мы получаем событие об окончании загрузки всего необходимого (+ассеты?). В <strong>preloaderDoneHandler</strong> мы, удовлетворения ради, выводим в трэйс все, имеющиеся в нашем распоряжении (в родителе-предзагрузчике) фрэймы. В последних двух строках мы переходим в третий кадр и инстанциируем класс, который был загружен последним - об этом чуток ниже.<br />
Во многих моих реализациях данного подхода я либо создавал в <strong>Main</strong> классе метод, возвращающий массив урлов к тому, что еще необходимо загрузить, что было несколько криво и не гибко, либо записывал эту информацию в метаданные, что позволяло предзагрузчику все необходимое скачать еще до инициализации главного класса, а он в свою очередь рождался "на всем готовом". Нюансы реализацию такой инициализации приложения я покажу позже, а сейчас - простой пример того самого предзагрузчика:</p>
<p><em>Preloader.as</em> - собственно, сам прелоудер:</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #9900cc; font-weight: bold;">package</span> ru.kozlovskij.preload
<span style="color: #000000;">&#123;</span>
	<span style="color: #0033ff; font-weight: bold;">import</span> <span style="color: #004993;">flash.display</span>.<span style="color: #004993;">DisplayObject</span>;
	<span style="color: #0033ff; font-weight: bold;">import</span> <span style="color: #004993;">flash.display</span>.<span style="color: #004993;">MovieClip</span>;
	<span style="color: #0033ff; font-weight: bold;">import</span> <span style="color: #004993;">flash.display</span>.<span style="color: #004993;">StageAlign</span>;
	<span style="color: #0033ff; font-weight: bold;">import</span> <span style="color: #004993;">flash.display</span>.<span style="color: #004993;">StageScaleMode</span>;
	<span style="color: #0033ff; font-weight: bold;">import</span> <span style="color: #004993;">flash.events</span>.<span style="color: #004993;">Event</span>;
	<span style="color: #0033ff; font-weight: bold;">import</span> <span style="color: #004993;">flash.system</span>.<span style="color: #004993;">ApplicationDomain</span>;
	<span style="color: #0033ff; font-weight: bold;">import</span> <span style="color: #004993;">flash.utils</span>.<span style="color: #004993;">ByteArray</span>;
&nbsp;
	<span style="color: #0033ff; font-weight: bold;">import</span> ru.etcs.utils.ClassExplorer;
&nbsp;
	<span style="color: #000000;">&#91;</span><span style="color: #004993;">Event</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">name</span>=<span style="color: #990000;">&quot;preloaderDone&quot;</span>, <span style="color: #004993;">type</span>=<span style="color: #990000;">&quot;ru.kozlovskij.preload.Preloader&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>
	<span style="color: #0033ff; font-weight: bold;">public</span> <span style="color: #9900cc; font-weight: bold;">class</span> Preloader extends <span style="color: #004993;">MovieClip</span>
	<span style="color: #000000;">&#123;</span>
		<span style="color: #0033ff; font-weight: bold;">public</span> static const PRELOADER_DONE<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">String</span> = <span style="color: #990000;">'preloaderDone'</span>;
&nbsp;
		<span style="color: #0033ff; font-weight: bold;">protected</span> <span style="color: #6699cc; font-weight: bold;">var</span> MAINCLASS_NAME<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">String</span>;
&nbsp;
		<span style="color: #0033ff; font-weight: bold;">protected</span> <span style="color: #6699cc; font-weight: bold;">var</span> preloaderGraphics<span style="color: #000000; font-weight: bold;">:</span>IPreloaderGraphics;
&nbsp;
		<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #6699cc; font-weight: bold;">var</span> Main<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Class</span>;
		<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #6699cc; font-weight: bold;">var</span> main<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">DisplayObject</span>;
&nbsp;
		<span style="color: #0033ff; font-weight: bold;">protected</span> <span style="color: #6699cc; font-weight: bold;">var</span> _standalone<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Boolean</span> = <span style="color: #0033ff; font-weight: bold;">true</span>;
		<span style="color: #0033ff; font-weight: bold;">protected</span> <span style="color: #339966; font-weight: bold;">function</span> <span style="color: #0033ff; font-weight: bold;">get</span> standalone<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Boolean</span>
		<span style="color: #000000;">&#123;</span><span style="color: #0033ff; font-weight: bold;">return</span> _standalone;<span style="color: #000000;">&#125;</span>
&nbsp;
		<span style="color: #0033ff; font-weight: bold;">public</span> <span style="color: #339966; font-weight: bold;">function</span> Preloader<span style="color: #000000;">&#40;</span>preloaderGraphics<span style="color: #000000; font-weight: bold;">:</span>IPreloaderGraphics = <span style="color: #0033ff; font-weight: bold;">null</span><span style="color: #000000;">&#41;</span>
		<span style="color: #000000;">&#123;</span>
			<span style="color: #004993;">stop</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
			<span style="color: #0033ff; font-weight: bold;">this</span>.preloaderGraphics = preloaderGraphics <span style="color: #000000; font-weight: bold;">?</span> preloaderGraphics <span style="color: #000000; font-weight: bold;">:</span> <span style="color: #0033ff; font-weight: bold;">new</span> PreloaderGraphics<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
			<span style="color: #0033ff; font-weight: bold;">if</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">stage</span><span style="color: #000000;">&#41;</span>
				<span style="color: #004993;">stage</span>.<span style="color: #004993;">scaleMode</span> = <span style="color: #004993;">StageScaleMode</span>.<span style="color: #004993;">NO_SCALE</span>,
				<span style="color: #004993;">stage</span>.<span style="color: #004993;">align</span> = <span style="color: #004993;">StageAlign</span>.<span style="color: #004993;">TOP_LEFT</span>,
				<span style="color: #004993;">stage</span>.<span style="color: #004993;">frameRate</span> = <span style="color: #000000; font-weight:bold;">31</span>,
				createGraphics<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>,
				<span style="color: #004993;">stage</span>.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">Event</span>.<span style="color: #004993;">RESIZE</span>, resizeHandler<span style="color: #000000;">&#41;</span>;
			<span style="color: #0033ff; font-weight: bold;">else</span>
				_standalone = <span style="color: #0033ff; font-weight: bold;">false</span>;
&nbsp;
			<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">Event</span>.<span style="color: #004993;">ENTER_FRAME</span>, enterFrameHandler<span style="color: #000000;">&#41;</span>;
&nbsp;
			resizeHandler<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
		<span style="color: #000000;">&#125;</span>
&nbsp;
		<span style="color: #0033ff; font-weight: bold;">protected</span> <span style="color: #339966; font-weight: bold;">function</span> createGraphics<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
		<span style="color: #000000;">&#123;</span>
			<span style="color: #004993;">addChild</span><span style="color: #000000;">&#40;</span>preloaderGraphics <span style="color: #0033ff; font-weight: bold;">as</span> <span style="color: #004993;">DisplayObject</span><span style="color: #000000;">&#41;</span>;
		<span style="color: #000000;">&#125;</span>
&nbsp;
		<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> enterFrameHandler<span style="color: #000000;">&#40;</span>e<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Event</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
		<span style="color: #000000;">&#123;</span>
			<span style="color: #009900;">//percent = current / total</span>
			<span style="color: #6699cc; font-weight: bold;">var</span> percent<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Number</span> = <span style="color: #004993;">root</span>.<span style="color: #004993;">loaderInfo</span>.<span style="color: #004993;">bytesLoaded</span> <span style="color: #000000; font-weight: bold;">/</span> <span style="color: #004993;">root</span>.<span style="color: #004993;">loaderInfo</span>.<span style="color: #004993;">bytesTotal</span>;
			preloaderGraphics.percent = percent <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000; font-weight:bold;">100</span>;
&nbsp;
			<span style="color: #009900;">//trace(Math.round(100 * percent) + '%');</span>
&nbsp;
			<span style="color: #0033ff; font-weight: bold;">if</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">framesLoaded</span> == <span style="color: #004993;">totalFrames</span><span style="color: #000000;">&#41;</span>
			<span style="color: #000000;">&#123;</span>
				<span style="color: #004993;">removeEventListener</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">Event</span>.<span style="color: #004993;">ENTER_FRAME</span>, enterFrameHandler<span style="color: #000000;">&#41;</span>;
&nbsp;
				<span style="color: #009900;">//Move to the next frame when we're done</span>
				<span style="color: #009900;">//Moving to frame 1(!)</span>
				<span style="color: #004993;">nextFrame</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
				preinit<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
			<span style="color: #000000;">&#125;</span>
		<span style="color: #000000;">&#125;</span>
&nbsp;
		<span style="color: #0033ff; font-weight: bold;">protected</span> <span style="color: #339966; font-weight: bold;">function</span> resizeHandler<span style="color: #000000;">&#40;</span>e<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Event</span> = <span style="color: #0033ff; font-weight: bold;">null</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
		<span style="color: #000000;">&#123;</span>
			preloaderGraphics.<span style="color: #004993;">x</span> = <span style="color: #004993;">stage</span> <span style="color: #000000; font-weight: bold;">?</span> <span style="color: #004993;">stage</span>.<span style="color: #004993;">stageWidth</span> <span style="color: #000000; font-weight: bold;">/</span> <span style="color: #000000; font-weight:bold;">2</span> <span style="color: #000000; font-weight: bold;">:</span> <span style="color: #004993;">root</span>.<span style="color: #004993;">width</span> <span style="color: #000000; font-weight: bold;">/</span> <span style="color: #000000; font-weight:bold;">2</span>,
			preloaderGraphics.<span style="color: #004993;">y</span> = <span style="color: #004993;">stage</span> <span style="color: #000000; font-weight: bold;">?</span> <span style="color: #004993;">stage</span>.<span style="color: #004993;">stageHeight</span> <span style="color: #000000; font-weight: bold;">/</span> <span style="color: #000000; font-weight:bold;">2</span> <span style="color: #000000; font-weight: bold;">:</span> <span style="color: #004993;">root</span>.<span style="color: #004993;">height</span> <span style="color: #000000; font-weight: bold;">/</span> <span style="color: #000000; font-weight:bold;">2</span>;
		<span style="color: #000000;">&#125;</span>
&nbsp;
		<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> preinit<span style="color: #000000;">&#40;</span>mainclass_name_from_metadata<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">String</span> = <span style="color: #0033ff; font-weight: bold;">null</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
		<span style="color: #000000;">&#123;</span>
			<span style="color: #6699cc; font-weight: bold;">var</span> needThrow<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Boolean</span> = <span style="color: #0033ff; font-weight: bold;">true</span>;
			MAINCLASS_NAME = mainclass_name_from_metadata <span style="color: #000000; font-weight: bold;">?</span> mainclass_name_from_metadata <span style="color: #000000; font-weight: bold;">:</span>
							 MAINCLASS_NAME <span style="color: #000000; font-weight: bold;">?</span> MAINCLASS_NAME <span style="color: #000000; font-weight: bold;">:</span> <span style="color: #0033ff; font-weight: bold;">null</span>;
			MAINCLASS_NAME <span style="color: #000000; font-weight: bold;">?</span> <span style="color: #0033ff; font-weight: bold;">null</span> <span style="color: #000000; font-weight: bold;">:</span> <span style="color: #000000;">&#40;</span>needThrow = <span style="color: #0033ff; font-weight: bold;">false</span>, getMETAMainClassName<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
			<span style="color: #0033ff; font-weight: bold;">if</span><span style="color: #000000;">&#40;</span>needThrow <span style="color: #000000; font-weight: bold;">&amp;</span>amp;<span style="color: #000000; font-weight: bold;">&amp;</span>amp; <span style="color: #000000; font-weight: bold;">!</span>MAINCLASS_NAME<span style="color: #000000;">&#41;</span>
			<span style="color: #000000;">&#123;</span>
				<span style="color: #004993;">clear</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
				<span style="color: #0033ff; font-weight: bold;">throw</span> <span style="color: #0033ff; font-weight: bold;">new</span> <span style="color: #004993;">Error</span><span style="color: #000000;">&#40;</span><span style="color: #0033ff; font-weight: bold;">this</span>.<span style="color: #004993;">toString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000; font-weight: bold;">+</span> <span style="color: #990000;">': Main Class Definition eq null'</span><span style="color: #000000;">&#41;</span>;
			<span style="color: #000000;">&#125;</span>
&nbsp;
			<span style="color: #6699cc; font-weight: bold;">var</span> has<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Boolean</span> = <span style="color: #004993;">ApplicationDomain</span>.<span style="color: #004993;">currentDomain</span>.<span style="color: #004993;">hasDefinition</span><span style="color: #000000;">&#40;</span>MAINCLASS_NAME<span style="color: #000000;">&#41;</span>;
			<span style="color: #0033ff; font-weight: bold;">if</span><span style="color: #000000;">&#40;</span>has<span style="color: #000000;">&#41;</span><span style="color: #009900;">//if main app</span>
				Main = <span style="color: #004993;">ApplicationDomain</span>.<span style="color: #004993;">currentDomain</span>.<span style="color: #004993;">getDefinition</span><span style="color: #000000;">&#40;</span>MAINCLASS_NAME<span style="color: #000000;">&#41;</span> <span style="color: #0033ff; font-weight: bold;">as</span> <span style="color: #004993;">Class</span>;
			<span style="color: #0033ff; font-weight: bold;">else</span>
			<span style="color: #000000;">&#123;</span>
				has = <span style="color: #004993;">loaderInfo</span>.<span style="color: #004993;">applicationDomain</span>.<span style="color: #004993;">hasDefinition</span><span style="color: #000000;">&#40;</span>MAINCLASS_NAME<span style="color: #000000;">&#41;</span>;
				<span style="color: #0033ff; font-weight: bold;">if</span><span style="color: #000000;">&#40;</span>has<span style="color: #000000;">&#41;</span><span style="color: #009900;">//if module app</span>
					Main = <span style="color: #004993;">loaderInfo</span>.<span style="color: #004993;">applicationDomain</span>.<span style="color: #004993;">getDefinition</span><span style="color: #000000;">&#40;</span>MAINCLASS_NAME<span style="color: #000000;">&#41;</span> <span style="color: #0033ff; font-weight: bold;">as</span> <span style="color: #004993;">Class</span>;
			<span style="color: #000000;">&#125;</span>
&nbsp;
			<span style="color: #0033ff; font-weight: bold;">if</span><span style="color: #000000;">&#40;</span>has<span style="color: #000000;">&#41;</span>
			<span style="color: #000000;">&#123;</span>
				<span style="color: #009900;">//and instantiate our Main class</span>
				main = <span style="color: #0033ff; font-weight: bold;">new</span> Main<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
				<span style="color: #009900;">//get urls, whot need to additional preloading before starting application (in next post..)</span>
&nbsp;
				<span style="color: #004993;">init</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
				<span style="color: #004993;">clear</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
			<span style="color: #000000;">&#125;</span>
			<span style="color: #0033ff; font-weight: bold;">else</span>
			<span style="color: #0033ff; font-weight: bold;">if</span><span style="color: #000000;">&#40;</span>needThrow<span style="color: #000000;">&#41;</span>
			<span style="color: #000000;">&#123;</span>
				<span style="color: #004993;">clear</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
				<span style="color: #0033ff; font-weight: bold;">throw</span> <span style="color: #0033ff; font-weight: bold;">new</span> <span style="color: #004993;">Error</span><span style="color: #000000;">&#40;</span><span style="color: #0033ff; font-weight: bold;">this</span>.<span style="color: #004993;">toString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000; font-weight: bold;">+</span> <span style="color: #990000;">': Main Class Definition NOT FOUND'</span><span style="color: #000000;">&#41;</span>;
			<span style="color: #000000;">&#125;</span>
		<span style="color: #000000;">&#125;</span>
&nbsp;
		<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> <span style="color: #004993;">init</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
		<span style="color: #000000;">&#123;</span>
			<span style="color: #009900;">//finally we add main class to the DisplayList and dispatching event</span>
			<span style="color: #004993;">addChild</span><span style="color: #000000;">&#40;</span>main <span style="color: #0033ff; font-weight: bold;">as</span> <span style="color: #004993;">DisplayObject</span><span style="color: #000000;">&#41;</span>.<span style="color: #004993;">dispatchEvent</span><span style="color: #000000;">&#40;</span><span style="color: #0033ff; font-weight: bold;">new</span> <span style="color: #004993;">Event</span><span style="color: #000000;">&#40;</span>PRELOADER_DONE<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
			<span style="color: #009900;">//stage.addChild(main as DisplayObject) - only if we make a standalone app.</span>
		<span style="color: #000000;">&#125;</span>
&nbsp;
		<span style="color: #0033ff; font-weight: bold;">public</span> <span style="color: #339966; font-weight: bold;">function</span> <span style="color: #004993;">clear</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
		<span style="color: #000000;">&#123;</span>
			<span style="color: #009900;">//killing &amp;amp; clearing preloaderGraphics :)</span>
			IPreloaderGraphics<span style="color: #000000;">&#40;</span><span style="color: #004993;">removeChild</span><span style="color: #000000;">&#40;</span>preloaderGraphics <span style="color: #0033ff; font-weight: bold;">as</span> <span style="color: #004993;">DisplayObject</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>.<span style="color: #004993;">clear</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
			standalone <span style="color: #000000; font-weight: bold;">?</span> <span style="color: #000000;">&#40;</span><span style="color: #004993;">stage</span>.<span style="color: #004993;">removeEventListener</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">Event</span>.<span style="color: #004993;">RESIZE</span>, resizeHandler<span style="color: #000000;">&#41;</span>, <span style="color: #004993;">stage</span>.<span style="color: #004993;">removeChild</span><span style="color: #000000;">&#40;</span><span style="color: #0033ff; font-weight: bold;">this</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000; font-weight: bold;">:</span> <span style="color: #0033ff; font-weight: bold;">null</span>;
		<span style="color: #000000;">&#125;</span>
&nbsp;
		<span style="color: #009900;">//-----------------------------------------------------//</span>
		<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> getMETAMainClassName<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
		<span style="color: #000000;">&#123;</span>
			<span style="color: #6699cc; font-weight: bold;">var</span> bytes<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">ByteArray</span> = <span style="color: #0033ff; font-weight: bold;">new</span> <span style="color: #004993;">ByteArray</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
				bytes.<span style="color: #004993;">objectEncoding</span> = <span style="color: #000000; font-weight:bold;">3</span>;
				bytes.<span style="color: #004993;">writeBytes</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">loaderInfo</span>.bytes<span style="color: #000000;">&#41;</span>;
				bytes.<span style="color: #004993;">position</span> = <span style="color: #000000; font-weight:bold;">0</span>;
			<span style="color: #6699cc; font-weight: bold;">var</span> explorer<span style="color: #000000; font-weight: bold;">:</span>ClassExplorer = <span style="color: #0033ff; font-weight: bold;">new</span> ClassExplorer<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
				explorer.<span style="color: #004993;">loadBytes</span><span style="color: #000000;">&#40;</span>bytes<span style="color: #000000;">&#41;</span>;
				explorer.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">Event</span>.<span style="color: #004993;">COMPLETE</span>, explorerWorkCompleteHandler<span style="color: #000000;">&#41;</span>;
		<span style="color: #000000;">&#125;</span>
&nbsp;
		<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #339966; font-weight: bold;">function</span> explorerWorkCompleteHandler<span style="color: #000000;">&#40;</span>e<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Event</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
		<span style="color: #000000;">&#123;</span>
			<span style="color: #6699cc; font-weight: bold;">var</span> explorer<span style="color: #000000; font-weight: bold;">:</span>ClassExplorer = e.<span style="color: #004993;">target</span> <span style="color: #0033ff; font-weight: bold;">as</span> ClassExplorer;
			<span style="color: #6699cc; font-weight: bold;">var</span> xml<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">XML</span> = explorer.getDefinitionInfo<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
			<span style="color: #009900;">//trace(xml.toXMLString());</span>
			<span style="color: #6699cc; font-weight: bold;">var</span> className<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">String</span>;
			className = xml.definition<span style="color: #3f5fbf;">/*.(@name == 'frame2')*/</span>.script.classTrait.metadata.<span style="color: #000000;">&#40;</span>@<span style="color: #004993;">name</span> == <span style="color: #990000;">'App'</span><span style="color: #000000;">&#41;</span>.arg.<span style="color: #000000;">&#40;</span>@key == <span style="color: #990000;">'className'</span><span style="color: #000000;">&#41;</span>.@<span style="color: #004993;">value</span>.<span style="color: #004993;">toString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
			preinit<span style="color: #000000;">&#40;</span>className<span style="color: #000000;">&#41;</span>;
		<span style="color: #000000;">&#125;</span>
	<span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Как видно, в данной реализации я оставил возможность наследовать этот класс и переопределять значение переменной <strong>MAINCLASS_NAME</strong>. Так же в конструктор можно передать экземпляр визуализатора процесса загрузки, реализующий интерфейс <strong>IPreloaderGraphics</strong>. По умолчанию создается инстанс <strong>PreloaderGraphics</strong> - простейший субкласс <strong>DisplayObject</strong>'a, содержащий в себе текстовое поле для отображения процентов - это я тоже упростил:)</p>
<p><em>ru.kozlovskij.preload.PreloaderGraphics</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #9900cc; font-weight: bold;">package</span> ru.kozlovskij.preload
<span style="color: #000000;">&#123;</span>
	<span style="color: #0033ff; font-weight: bold;">import</span> <span style="color: #004993;">flash.display</span>.<span style="color: #004993;">Sprite</span>;
	<span style="color: #0033ff; font-weight: bold;">import</span> <span style="color: #004993;">flash.text</span>.<span style="color: #004993;">TextField</span>;
	<span style="color: #0033ff; font-weight: bold;">import</span> <span style="color: #004993;">flash.text</span>.<span style="color: #004993;">TextFormat</span>;
	<span style="color: #0033ff; font-weight: bold;">import</span> <span style="color: #004993;">flash.text</span>.<span style="color: #004993;">TextFormatAlign</span>;
&nbsp;
	<span style="color: #0033ff; font-weight: bold;">public</span> <span style="color: #9900cc; font-weight: bold;">class</span> PreloaderGraphics extends <span style="color: #004993;">Sprite</span> implements IPreloaderGraphics
	<span style="color: #000000;">&#123;</span>
		<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #6699cc; font-weight: bold;">var</span> <span style="color: #004993;">text</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">TextField</span> = <span style="color: #0033ff; font-weight: bold;">new</span> <span style="color: #004993;">TextField</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
		<span style="color: #0033ff; font-weight: bold;">public</span> <span style="color: #339966; font-weight: bold;">function</span> PreloaderGraphics<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
		<span style="color: #000000;">&#123;</span>
			<span style="color: #0033ff; font-weight: bold;">super</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
			<span style="color: #004993;">addChild</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">text</span><span style="color: #000000;">&#41;</span>;
&nbsp;
			<span style="color: #004993;">text</span>.<span style="color: #004993;">defaultTextFormat</span> = <span style="color: #0033ff; font-weight: bold;">new</span> <span style="color: #004993;">TextFormat</span><span style="color: #000000;">&#40;</span><span style="color: #990000;">'Tahoma'</span><span style="color: #000000;">&#41;</span>;
			<span style="color: #004993;">text</span>.<span style="color: #004993;">defaultTextFormat</span>.<span style="color: #004993;">align</span> = <span style="color: #004993;">TextFormatAlign</span>.<span style="color: #004993;">CENTER</span>,
			<span style="color: #004993;">text</span>.<span style="color: #004993;">defaultTextFormat</span>.<span style="color: #004993;">size</span> = <span style="color: #000000; font-weight:bold;">13</span>,
			<span style="color: #004993;">text</span>.<span style="color: #004993;">defaultTextFormat</span>.<span style="color: #004993;">letterSpacing</span> = <span style="color: #000000; font-weight:bold;">1</span>,
			<span style="color: #004993;">text</span>.<span style="color: #004993;">defaultTextFormat</span>.<span style="color: #004993;">bold</span> = <span style="color: #0033ff; font-weight: bold;">true</span>;
&nbsp;
			<span style="color: #004993;">text</span>.<span style="color: #004993;">borderColor</span> = <span style="color: #004993;">text</span>.<span style="color: #004993;">textColor</span> = 0x0,
			<span style="color: #004993;">text</span>.<span style="color: #004993;">selectable</span> = <span style="color: #000000; font-weight: bold;">!</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">text</span>.<span style="color: #004993;">border</span> = <span style="color: #0033ff; font-weight: bold;">true</span><span style="color: #000000;">&#41;</span>,
			<span style="color: #004993;">text</span>.<span style="color: #004993;">width</span> = <span style="color: #000000; font-weight:bold;">100</span>,
			<span style="color: #004993;">text</span>.<span style="color: #004993;">height</span> = <span style="color: #000000; font-weight:bold;">50</span>;
&nbsp;
			percent = <span style="color: #000000; font-weight:bold;">0</span>;
		<span style="color: #000000;">&#125;</span>
&nbsp;
		<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #6699cc; font-weight: bold;">var</span> _percent<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Number</span> = <span style="color: #000000; font-weight:bold;">0</span>;
		<span style="color: #0033ff; font-weight: bold;">public</span> <span style="color: #339966; font-weight: bold;">function</span> <span style="color: #0033ff; font-weight: bold;">set</span> percent<span style="color: #000000;">&#40;</span><span style="color: #004993;">value</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Number</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
		<span style="color: #000000;">&#123;</span>
			_percent = <span style="color: #004993;">value</span>;
			<span style="color: #004993;">text</span>.<span style="color: #004993;">text</span> = <span style="color: #990000;">'Loading...<span style="">\n</span>'</span> <span style="color: #000000; font-weight: bold;">+</span> <span style="color: #004993;">uint</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">value</span><span style="color: #000000;">&#41;</span> <span style="color: #000000; font-weight: bold;">+</span> <span style="color: #990000;">'%'</span>;
		<span style="color: #000000;">&#125;</span>
&nbsp;
		<span style="color: #0033ff; font-weight: bold;">public</span> <span style="color: #339966; font-weight: bold;">function</span> <span style="color: #0033ff; font-weight: bold;">get</span> percent<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Number</span>
		<span style="color: #000000;">&#123;</span>
			<span style="color: #0033ff; font-weight: bold;">return</span> _percent;
		<span style="color: #000000;">&#125;</span>
&nbsp;
		<span style="color: #0033ff; font-weight: bold;">public</span> <span style="color: #339966; font-weight: bold;">function</span> <span style="color: #004993;">clear</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #0033ff; font-weight: bold;">void</span>
		<span style="color: #000000;">&#123;</span>
			<span style="color: #004993;">removeChild</span><span style="color: #000000;">&#40;</span><span style="color: #004993;">text</span><span style="color: #000000;">&#41;</span>;
		<span style="color: #000000;">&#125;</span>
	<span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Вернемся к <strong>ru.kozlovskij.preload.Preloader</strong>. Как это все работает?<br />
Запускается конструктор, подписываемся на событие <strong>Event.ENTER_FRAME</strong> и постоянно проверяем, не завершилась ли загрузка; Загрузка завершена, находим в метаданные и в них - имя главного класса (<strong>preinit</strong>-&gt;<strong>getMETAMainClassName</strong>-&gt;<strong>explorerWorkCompleteHandler</strong>-&gt;<strong>preinit</strong>), инициализируем главный класс, не забыв перед этим перескочить на второй кадр, - вот такая последовательность.<br />
В демонстрируемой реализации в качестве "поисковика метадаты" я использовал <strong>ClassExplorer</strong>, за что отдельное спасибо <a title=" Записки о Flash:  ClassExplorer" href="http://etcs.ru/blog/as3/classexplorer/" target="_blank">автору</a>.<br />
Для наших целей пришлось немного его подправить. Не помню уже где и что исправлял - интересующимся поможет любой мержер, например, <a title="Araxis Merge" href="http://www.araxis.com/merge/?gclid=CIzW9-b97J4CFUQM3god2REvNA" target="_blank">Araxis Merge</a>, который я считаю очень достойным.</p>
<p>Единственный минус - это то, что при каждом добавлении нового метатэга, необходимо прописывать его в конфиге компиляции.</p>
<p>Теперь от третьим кадре:<br />
Для того, чтобы в нашем рутовом классе (рутовый он только в случае, если приложение самостоятельное, не модуль), являющимся по-совместительству предзагрузчиком, при компиляции создался третий кадр, конфигурационный файл необходимо дополнить следующим образом:</p>
<p><em>cfg.xml</em>:</p>
<pre lang="xml" escape="true">
&lt;flex-config&gt;
	&lt;compiler&gt;
		&lt;keep-as3-metadata&gt;
			&lt;name&gt;App&lt;/name&gt;
		&lt;/keep-as3-metadata&gt;
	&lt;/compiler&gt;
	&lt;frames&gt;
		&lt;frame&gt;
			&lt;label&gt;newFrameName&lt;/label&gt;
			&lt;classname&gt;exampleClasses.CustomFrame&lt;/classname&gt;
		&lt;/frame&gt;
	&lt;/frames&gt;
&lt;/flex-config&gt;
</pre>
<p>Класс <strong>exampleClasses.CustomFrame</strong> будет экспортирован во фрэйм "<strong>newFrameName</strong>". Третьим этот фрэйм будет потому, что два уже есть.<br />
По непонятной мне причине, добавлять ноды для четвертого, пятого и т.д. фрэймов - бесполезно.</p>
<p>Теперь смотрим в <em>Main.as</em> на метод <strong>preloaderDoneHandler</strong>. Последние два строки - по-сути, тоже самое, что и в <strong>ru.kozlovskij.preload::Preloader</strong>, т.е. переход на следующий кадр и инициализация соответствующего класса.</p>
<p>Уф.. Вот и все. Наконец, <a title="download src (free))" href="http://FlashImp.ru/files/39/PreloadingDemo1.zip">исходный код (экспорт проекта)</a>.</p>
<p>П.С.: Совет: Не подписывайтесь на <strong>ProgressEvent.PROGRESS</strong> к собственному же <strong>loaderInfo</strong>!</p>
]]></content:encoded>
			<wfw:commentRss>http://flashimp.ru/39/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>

