<?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; Накодил</title>
	<atom:link href="http://flashimp.ru/category/%d0%bd%d0%b0%d0%ba%d0%be%d0%b4%d0%b8%d0%bb/feed" rel="self" type="application/rss+xml" />
	<link>http://flashimp.ru</link>
	<description>Flash Implosion new generation</description>
	<lastBuildDate>Fri, 30 Dec 2011 10:55:53 +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>Структуры данных: MagicObject</title>
		<link>http://flashimp.ru/149</link>
		<comments>http://flashimp.ru/149#comments</comments>
		<pubDate>Thu, 29 Dec 2011 16:06:32 +0000</pubDate>
		<dc:creator>Александр Козловский</dc:creator>
				<category><![CDATA[Накодил]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[Collections]]></category>
		<category><![CDATA[E4X]]></category>
		<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false">http://flashimp.ru/?p=149</guid>
		<description><![CDATA[source:

<em>Название MagicObject, имхо, явно лучше E4XMap и подобных названий.</em>

<strong>Intro.</strong>

В играх я частенько использую машины состояний и сложные структуры данных (коллекции, карты..) , сильно упрощающие разработку. Что актуально, кстати, не только для игр, но для риа вообще.

Сегодня хочу поделиться простенькой реализацией e4x в Объекте, где основной фишкой является расширение нативного e4x, который не позволяет callDescendants.

Например вот так:
<pre lang="actionscript3">object..method(args)</pre>
<strong>Зачем это нужно?</strong>
Допустим, дано:
- StateMachine и сложное дерево состояний;
- Анимация игрового объекта завязана на состояния, точнее, на смены состояний;
- Есть VO (ValueObjects) и есть рендеры, которые визуализируют изменения в VO;
- Рендеры имеют сложную иерархию, уровни вложенности.

<strong>Как происходит</strong> изменение состояния и отображение изменений при использовании MagicObject:
- Изменяем состояние в StateMachine;
- При удачном изменении состояния обновляем данные в VO;
- Вызываем обновление во всех рендерах внутри игрового уровня:
<pre lang="actionscript3">// magic = MagicObject instance
// magic[keyA] = Renderer instance
// magic[keyB] = Renderer instance
// magic[keyB][keyC] = Renderer instance - sub-renderer
// magic.subMagic.[keyD] = Renderer instance - sub-renderer
(magic..update)();
// или так:
(magic..update)(magic.changes);</pre>
Метод update() вызовется последовательно у всех объектов, имеющих этот метод.

<strong>Поясню как работает:</strong>
magic..update достаёт со всех уровней вложенности значения всех полей с именем update. Если там есть экземпляры класса Function, то всё это хозяйство оборачивается noname-фукцией, а ей задаются все свойства массива (для итеративного пробега) и пары, типа ключ-значение, где значение - каждое найденое поле с именем update.
<strong>На примере:</strong>
<pre lang="actionscript3">const result:Object = magic..update;
// можно вызвать:
result(); // or result(args);
// можно получить определённый элемент:
for(var key:String in magic)
	trace('in', magic, ':', key, '=', magic[key]),
	// или вызвать:
	magic[key] is Function &#038;& magic[key]();</pre>
<strong>History tracking:</strong>
<pre lang="actionscript3">const magic:MagicObject = new MagicObject();
magic.x = 0;
magic.x = 1;
 
// вернёт все изменения на первом уровней вложенности:
trace(magic.changes); // :Vector.<MagicNode>
 
// вернёт все изменения на всех уровнях вложенности:
trace(magic..changes); // [:Vector.<MagicNode>,..] или Vector.<MagicNode> если элемент один.
 
// чистим историю изменений:
magic.clearChanges();
// or magic..clearChanges();</pre>
<strong>Уведомления об изменениях:</strong>
Создали экземпляр:
<pre lang="actionscript3"> const magic:MagicObject = new MagicObject();</pre>
Дали ссылку на колбэк:
<pre lang="actionscript3">magic.notificationCallback = function():void
	{
		trace('new changes:', magic.changes);
	}</pre>
или так:
<pre lang="actionscript3">magic.notificationCallback = function(changes:Vector.<MagicNode>):void
	{
		trace('new changes:', changes);
	}</pre>
сдели какие-то изменения:
<pre lang="actionscript3"> magic.x = 0;
magic.x = 1;</pre>
.. и мы сразу получаем эти изменения в колбэк.

<a title="on BitBucket" href="https://bitbucket.org/Aleksandr_Kozlovskij/data-utils/src/fe542ffd764c/src/ru/kozlovskij/utils/data/MagicObject.as">Собственно сам класс лежит здесь.</a>

Вот <strong>пример расширения на деле:</strong>
<pre lang="actionscript3">package ru.kozlovskij.game.objects.data
{
	import ru.kozlovskij.utils.data.MagicNode;
	import ru.kozlovskij.utils.data.MagicObject;
 
	/**
	 * @author Aleksandr Kozlovskij (created: Dec 27, 2011)
	 */
	public dynamic class GameObjectData extends MagicObject
	{
		protected static const PRIVATE_ACCESSOR_PREFIX:String = '_';
 
		private var _notificationCallback:Function;
 
		//------------ constructor ------------//
 
		public function GameObjectData()
		{
			super();
			super.notificationCallback = __notificationCallback;
		}
 
		//------------ initialize ------------//
 
		//--------------- ctrl ---------------//
 
		//------------ get / set -------------//
 
		public function get selected():Boolean
		{
			return this._selected;
		}
 
		public function set selected(value:Boolean):void
		{
			this._selected = value;
		}
 
 
		override public function get notificationCallback():Function
		{
			return _notificationCallback;
		}
 
		override public function set notificationCallback(value:Function):void
		{
			_notificationCallback = value;
		}
 
		//------- handlers / callbacks -------//
 
		protected function __notificationCallback(changes:Vector.<MagicNode>):void
		{
			const ns:Namespace = nodeResetNS;
			for each(var node:MagicNode in changes)
			{
				const property:String = node.public::property;
				if(property.charAt() == PRIVATE_ACCESSOR_PREFIX)
					node.ns::property = property.substr(1);
			}
 
			// finally:
			_notificationCallback &#038;& (_notificationCallback.length ? _notificationCallback(changes) : _notificationCallback());
		}
	}
}</pre>
Получилось несколько сумбурно и возможно что-то забыл упомянуть.
Комментарии, идеи и замечания очень приветствуются. Надеюсь, кому-то это пригодится.]]></description>
			<content:encoded><![CDATA[<p>source:</p>
<p><em>Название MagicObject, имхо, явно лучше E4XMap и подобных названий.</em></p>
<p><strong>Intro.</strong></p>
<p>В играх я частенько использую машины состояний и сложные структуры данных (коллекции, карты..) , сильно упрощающие разработку. Что актуально, кстати, не только для игр, но для риа вообще.</p>
<p>Сегодня хочу поделиться простенькой реализацией e4x в Объекте, где основной фишкой является расширение нативного e4x, который не позволяет callDescendants.</p>
<p>Например вот так:</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript3" style="font-family:monospace;">object..<span style="color: #004993;">method</span><span style="color: #000000;">&#40;</span>args<span style="color: #000000;">&#41;</span></pre></div></div>

<p><strong>Зачем это нужно?</strong><br />
Допустим, дано:<br />
- StateMachine и сложное дерево состояний;<br />
- Анимация игрового объекта завязана на состояния, точнее, на смены состояний;<br />
- Есть VO (ValueObjects) и есть рендеры, которые визуализируют изменения в VO;<br />
- Рендеры имеют сложную иерархию, уровни вложенности.</p>
<p><strong>Как происходит</strong> изменение состояния и отображение изменений при использовании MagicObject:<br />
- Изменяем состояние в StateMachine;<br />
- При удачном изменении состояния обновляем данные в VO;<br />
- Вызываем обновление во всех рендерах внутри игрового уровня:</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #009900;">// magic = MagicObject instance</span>
<span style="color: #009900;">// magic[keyA] = Renderer instance</span>
<span style="color: #009900;">// magic[keyB] = Renderer instance</span>
<span style="color: #009900;">// magic[keyB][keyC] = Renderer instance - sub-renderer</span>
<span style="color: #009900;">// magic.subMagic.[keyD] = Renderer instance - sub-renderer</span>
<span style="color: #000000;">&#40;</span>magic..update<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
<span style="color: #009900;">// или так:</span>
<span style="color: #000000;">&#40;</span>magic..update<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#40;</span>magic.changes<span style="color: #000000;">&#41;</span>;</pre></div></div>

<p>Метод update() вызовется последовательно у всех объектов, имеющих этот метод.</p>
<p><strong>Поясню как работает:</strong><br />
magic..update достаёт со всех уровней вложенности значения всех полей с именем update. Если там есть экземпляры класса Function, то всё это хозяйство оборачивается noname-фукцией, а ей задаются все свойства массива (для итеративного пробега) и пары, типа ключ-значение, где значение - каждое найденое поле с именем update.<br />
<strong>На примере:</strong></p>

<div class="wp_syntax"><div class="code"><pre class="actionscript3" style="font-family:monospace;">const result<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Object</span> = magic..update;
<span style="color: #009900;">// можно вызвать:</span>
result<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>; <span style="color: #009900;">// or result(args);</span>
<span style="color: #009900;">// можно получить определённый элемент:</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> key<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">String</span> <span style="color: #0033ff; font-weight: bold;">in</span> magic<span style="color: #000000;">&#41;</span>
	<span style="color: #004993;">trace</span><span style="color: #000000;">&#40;</span><span style="color: #990000;">'in'</span>, magic, <span style="color: #990000;">':'</span>, key, <span style="color: #990000;">'='</span>, magic<span style="color: #000000;">&#91;</span>key<span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span>,
	<span style="color: #009900;">// или вызвать:</span>
	magic<span style="color: #000000;">&#91;</span>key<span style="color: #000000;">&#93;</span> <span style="color: #0033ff; font-weight: bold;">is</span> <span style="color: #004993;">Function</span> <span style="color: #000000; font-weight: bold;">&amp;&amp;</span> magic<span style="color: #000000;">&#91;</span>key<span style="color: #000000;">&#93;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;</pre></div></div>

<p><strong>History tracking:</strong></p>

<div class="wp_syntax"><div class="code"><pre class="actionscript3" style="font-family:monospace;">const magic<span style="color: #000000; font-weight: bold;">:</span>MagicObject = <span style="color: #0033ff; font-weight: bold;">new</span> MagicObject<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
magic.<span style="color: #004993;">x</span> = <span style="color: #000000; font-weight:bold;">0</span>;
magic.<span style="color: #004993;">x</span> = <span style="color: #000000; font-weight:bold;">1</span>;
&nbsp;
<span style="color: #009900;">// вернёт все изменения на первом уровней вложенности:</span>
<span style="color: #004993;">trace</span><span style="color: #000000;">&#40;</span>magic.changes<span style="color: #000000;">&#41;</span>; <span style="color: #009900;">// :Vector.&lt;MagicNode&gt;</span>
&nbsp;
<span style="color: #009900;">// вернёт все изменения на всех уровнях вложенности:</span>
<span style="color: #004993;">trace</span><span style="color: #000000;">&#40;</span>magic..changes<span style="color: #000000;">&#41;</span>; <span style="color: #009900;">// [:Vector.&lt;MagicNode&gt;,..] или Vector.&lt;MagicNode&gt; если элемент один.</span>
&nbsp;
<span style="color: #009900;">// чистим историю изменений:</span>
magic.clearChanges<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
<span style="color: #009900;">// or magic..clearChanges();</span></pre></div></div>

<p><strong>Уведомления об изменениях:</strong><br />
Создали экземпляр:</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript3" style="font-family:monospace;"> const magic<span style="color: #000000; font-weight: bold;">:</span>MagicObject = <span style="color: #0033ff; font-weight: bold;">new</span> MagicObject<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;</pre></div></div>

<p>Дали ссылку на колбэк:</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript3" style="font-family:monospace;">magic.notificationCallback = <span style="color: #339966; font-weight: bold;">function</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;">trace</span><span style="color: #000000;">&#40;</span><span style="color: #990000;">'new changes:'</span>, magic.changes<span style="color: #000000;">&#41;</span>;
	<span style="color: #000000;">&#125;</span></pre></div></div>

<p>или так:</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript3" style="font-family:monospace;">magic.notificationCallback = <span style="color: #339966; font-weight: bold;">function</span><span style="color: #000000;">&#40;</span>changes<span style="color: #000000; font-weight: bold;">:</span>Vector.<span style="color: #000000; font-weight: bold;">&lt;</span>MagicNode<span style="color: #000000; font-weight: bold;">&gt;</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;">trace</span><span style="color: #000000;">&#40;</span><span style="color: #990000;">'new changes:'</span>, changes<span style="color: #000000;">&#41;</span>;
	<span style="color: #000000;">&#125;</span></pre></div></div>

<p>сдели какие-то изменения:</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript3" style="font-family:monospace;"> magic.<span style="color: #004993;">x</span> = <span style="color: #000000; font-weight:bold;">0</span>;
magic.<span style="color: #004993;">x</span> = <span style="color: #000000; font-weight:bold;">1</span>;</pre></div></div>

<p>.. и мы сразу получаем эти изменения в колбэк.</p>
<p><a title="on BitBucket" href="https://bitbucket.org/Aleksandr_Kozlovskij/data-utils/src/fe542ffd764c/src/ru/kozlovskij/utils/data/MagicObject.as">Собственно сам класс лежит здесь.</a></p>
<p>Вот <strong>пример расширения на деле:</strong></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.game.objects.<span style="color: #004993;">data</span>
<span style="color: #000000;">&#123;</span>
	<span style="color: #0033ff; font-weight: bold;">import</span> ru.kozlovskij.utils.<span style="color: #004993;">data</span>.MagicNode;
	<span style="color: #0033ff; font-weight: bold;">import</span> ru.kozlovskij.utils.<span style="color: #004993;">data</span>.MagicObject;
&nbsp;
	<span style="color: #3f5fbf;">/**
	 * @author Aleksandr Kozlovskij (created: Dec 27, 2011)
	 */</span>
	<span style="color: #0033ff; font-weight: bold;">public</span> dynamic <span style="color: #9900cc; font-weight: bold;">class</span> GameObjectData extends MagicObject
	<span style="color: #000000;">&#123;</span>
		<span style="color: #0033ff; font-weight: bold;">protected</span> static const PRIVATE_ACCESSOR_PREFIX<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">String</span> = <span style="color: #990000;">'_'</span>;
&nbsp;
		<span style="color: #0033ff; font-weight: bold;">private</span> <span style="color: #6699cc; font-weight: bold;">var</span> _notificationCallback<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Function</span>;
&nbsp;
		<span style="color: #009900;">//------------ constructor ------------//</span>
&nbsp;
		<span style="color: #0033ff; font-weight: bold;">public</span> <span style="color: #339966; font-weight: bold;">function</span> GameObjectData<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: #0033ff; font-weight: bold;">super</span>.notificationCallback = __notificationCallback;
		<span style="color: #000000;">&#125;</span>
&nbsp;
		<span style="color: #009900;">//------------ initialize ------------//</span>
&nbsp;
		<span style="color: #009900;">//--------------- ctrl ---------------//</span>
&nbsp;
		<span style="color: #009900;">//------------ get / set -------------//</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> selected<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> <span style="color: #0033ff; font-weight: bold;">this</span>._selected;
		<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;">set</span> selected<span style="color: #000000;">&#40;</span><span style="color: #004993;">value</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Boolean</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: #0033ff; font-weight: bold;">this</span>._selected = <span style="color: #004993;">value</span>;
		<span style="color: #000000;">&#125;</span>
&nbsp;
&nbsp;
		override <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> notificationCallback<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Function</span>
		<span style="color: #000000;">&#123;</span>
			<span style="color: #0033ff; font-weight: bold;">return</span> _notificationCallback;
		<span style="color: #000000;">&#125;</span>
&nbsp;
		override <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> notificationCallback<span style="color: #000000;">&#40;</span><span style="color: #004993;">value</span><span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Function</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>
			_notificationCallback = <span style="color: #004993;">value</span>;
		<span style="color: #000000;">&#125;</span>
&nbsp;
		<span style="color: #009900;">//------- handlers / callbacks -------//</span>
&nbsp;
		<span style="color: #0033ff; font-weight: bold;">protected</span> <span style="color: #339966; font-weight: bold;">function</span> __notificationCallback<span style="color: #000000;">&#40;</span>changes<span style="color: #000000; font-weight: bold;">:</span>Vector.<span style="color: #000000; font-weight: bold;">&lt;</span>MagicNode<span style="color: #000000; font-weight: bold;">&gt;</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>
			const ns<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Namespace</span> = nodeResetNS;
			<span style="color: #0033ff; font-weight: bold;">for</span> <span style="color: #0033ff; font-weight: bold;">each</span><span style="color: #000000;">&#40;</span><span style="color: #6699cc; font-weight: bold;">var</span> node<span style="color: #000000; font-weight: bold;">:</span>MagicNode <span style="color: #0033ff; font-weight: bold;">in</span> changes<span style="color: #000000;">&#41;</span>
			<span style="color: #000000;">&#123;</span>
				const property<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">String</span> = node.<span style="color: #0033ff; font-weight: bold;">public</span><span style="color: #000000; font-weight: bold;">::</span>property;
				<span style="color: #0033ff; font-weight: bold;">if</span><span style="color: #000000;">&#40;</span>property.<span style="color: #004993;">charAt</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> == PRIVATE_ACCESSOR_PREFIX<span style="color: #000000;">&#41;</span>
					node.ns<span style="color: #000000; font-weight: bold;">::</span>property = property.<span style="color: #004993;">substr</span><span style="color: #000000;">&#40;</span><span style="color: #000000; font-weight:bold;">1</span><span style="color: #000000;">&#41;</span>;
			<span style="color: #000000;">&#125;</span>
&nbsp;
			<span style="color: #009900;">// finally:</span>
			_notificationCallback <span style="color: #000000; font-weight: bold;">&amp;&amp;</span> <span style="color: #000000;">&#40;</span>_notificationCallback.<span style="color: #004993;">length</span> <span style="color: #000000; font-weight: bold;">?</span> _notificationCallback<span style="color: #000000;">&#40;</span>changes<span style="color: #000000;">&#41;</span> <span style="color: #000000; font-weight: bold;">:</span> _notificationCallback<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>Получилось несколько сумбурно и возможно что-то забыл упомянуть.<br />
Комментарии, идеи и замечания очень приветствуются. Надеюсь, кому-то это пригодится.</p>
]]></content:encoded>
			<wfw:commentRss>http://flashimp.ru/149/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Определятор статуса, типа и представления экранной клавиатуры.</title>
		<link>http://flashimp.ru/136</link>
		<comments>http://flashimp.ru/136#comments</comments>
		<pubDate>Fri, 28 Oct 2011 13:42:17 +0000</pubDate>
		<dc:creator>Александр Козловский</dc:creator>
				<category><![CDATA[Накодил]]></category>
		<category><![CDATA[AIR]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[iOS]]></category>

		<guid isPermaLink="false">http://flashimp.ru/?p=136</guid>
		<description><![CDATA[Приветствую, коллеги. Коротко о главном: В комбинации AIR + iOS + {желание работать с текстом, клавой} есть одна большая проблема - это и есть большая проблема. Нет событий от экранной клавиатуры (за некоторым исключением); Нет раздельных стилей в режиме редактирования; Нет обновлений фокуса и позиции мыши/пальца в режиме редактирования; Ещё много чего нет.. Предлагаю вам, [...]]]></description>
			<content:encoded><![CDATA[<p>Приветствую, коллеги.</p>
<p><strong>Коротко о главном:</strong><br />
В комбинации AIR + iOS + {желание работать с текстом, клавой} есть одна большая проблема - это и есть большая проблема.</p>
<li>Нет событий от экранной клавиатуры (за некоторым исключением);</li>
<li>Нет раздельных стилей в режиме редактирования;</li>
<li>Нет обновлений фокуса и позиции мыши/пальца в режиме редактирования;</li>
<li>Ещё много чего нет..</li>
<p></br><br />
Предлагаю вам, товарищи, мой детектор статуса, типа и представления экранной клавиатуры. Только для iOS. Актуализирован для работы под iOS 5.0.</p>
<p><img src="http://flashimp.ru/wp-content/uploads/6236812533b4792f55446191aebbaf1639ecae72-ipad_kb_split.png" alt="iOS Split Keyboard" width="100%" /><br />
<strong>Он скажет вам:</strong></p>
<li>Тип представления экранной клавиатуры</li>
<li>Экранная клавиатура активирована;</li>
<li>Экранная клавиатура деактивирована;</li>
<li>Сменился relatedObject;</li>
<li>Пользователь изменил тип представления экранной клавиатуры (сдвинул или раздвинул).</li>
<p><strong>Note:</strong><br />
Работает с обычными текстовыми полями и с новеньким StageText.<br />
В симуляторе не работает и не должно, ибо он крив и только лживо симулирует. Только iOS.</p>
<p>Это не ANE. Only pure AS3.</p>
<p>Да, только библиотека <a href="http://kozlovskij.ru/files/projects/iOSSoftKeyboardControllers/iOSSoftKeyboardControllers.swc">SWC</a> + <a href="http://kozlovskij.ru/files/projects/iOSSoftKeyboardControllers/iOSSoftKeyboardControllers.zip">демо-проект</a> + <a href="http://kozlovskij.ru/files/projects/iOSSoftKeyboardControllers/doc.zip">дока</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://flashimp.ru/136/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>UINativeWindow</title>
		<link>http://flashimp.ru/101</link>
		<comments>http://flashimp.ru/101#comments</comments>
		<pubDate>Wed, 28 Apr 2010 10:26:21 +0000</pubDate>
		<dc:creator>FIZZER</dc:creator>
				<category><![CDATA[Накодил]]></category>
		<category><![CDATA[AIR]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[native]]></category>

		<guid isPermaLink="false">http://flashimp.ru/?p=101</guid>
		<description><![CDATA[package ru.kozlovskij.air &#123; import flash.display.DisplayObject; import flash.display.DisplayObjectContainer; import flash.display.NativeWindow; import flash.display.NativeWindowInitOptions; import flash.events.Event; &#160; import mx.core.IUIComponent; import mx.events.FlexEvent; import mx.managers.WindowedSystemManager; &#160; /** * Composition of &#60;code&#62;NativeWindow&#60;/code&#62; and &#60;code&#62;IUIComponent&#60;/code&#62;. * * @author Aleksandr.Kozlovskiy */ public class UINativeWindow extends NativeWindow &#123; protected var systemManager:WindowedSystemManager; protected var childDisplayObject:IUIComponent; protected var rootDisplayObject:IUIComponent; &#160; /** * After initialization &#60;code&#62;childDisplayObject&#60;/code&#62; added [...]]]></description>
			<content:encoded><![CDATA[
<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.air
<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;">DisplayObjectContainer</span>;
	<span style="color: #0033ff; font-weight: bold;">import</span> <span style="color: #004993;">flash.display</span>.NativeWindow;
	<span style="color: #0033ff; font-weight: bold;">import</span> <span style="color: #004993;">flash.display</span>.NativeWindowInitOptions;
	<span style="color: #0033ff; font-weight: bold;">import</span> <span style="color: #004993;">flash.events</span>.<span style="color: #004993;">Event</span>;
&nbsp;
	<span style="color: #0033ff; font-weight: bold;">import</span> mx.core.IUIComponent;
	<span style="color: #0033ff; font-weight: bold;">import</span> mx.events.FlexEvent;
	<span style="color: #0033ff; font-weight: bold;">import</span> mx.managers.WindowedSystemManager;
&nbsp;
	<span style="color: #3f5fbf;">/**
	 * Composition of &lt;code&gt;NativeWindow&lt;/code&gt; and &lt;code&gt;IUIComponent&lt;/code&gt;.
	 * 
	 * @author Aleksandr.Kozlovskiy
	 */</span>	
	<span style="color: #0033ff; font-weight: bold;">public</span> <span style="color: #9900cc; font-weight: bold;">class</span> UINativeWindow extends NativeWindow
	<span style="color: #000000;">&#123;</span>
		<span style="color: #0033ff; font-weight: bold;">protected</span> <span style="color: #6699cc; font-weight: bold;">var</span> systemManager<span style="color: #000000; font-weight: bold;">:</span>WindowedSystemManager;
		<span style="color: #0033ff; font-weight: bold;">protected</span> <span style="color: #6699cc; font-weight: bold;">var</span> childDisplayObject<span style="color: #000000; font-weight: bold;">:</span>IUIComponent;
		<span style="color: #0033ff; font-weight: bold;">protected</span> <span style="color: #6699cc; font-weight: bold;">var</span> rootDisplayObject<span style="color: #000000; font-weight: bold;">:</span>IUIComponent;
&nbsp;
		<span style="color: #3f5fbf;">/**
		 * After initialization &lt;code&gt;childDisplayObject&lt;/code&gt; added to &lt;code&gt;systemManager&lt;/code&gt;'s displaylist.
		 * 
		 * 
		 * @param initOptions:NativeWindowInitOptions - Analogically NativeWindow initOptions.
		 * @param rootDisplayObject:IUIComponent - Root Application or other IUIComponent implementation. Mast extends DisplayObject.
		 * @param childDisplayObject:IUIComponent - Container. Child Application or other IUIComponent implementation. Mast extends DisplayObject.
		 * 
		 */</span>		
		<span style="color: #0033ff; font-weight: bold;">public</span> <span style="color: #339966; font-weight: bold;">function</span> UINativeWindow<span style="color: #000000;">&#40;</span>initOptions<span style="color: #000000; font-weight: bold;">:</span>NativeWindowInitOptions,
									   rootDisplayObject<span style="color: #000000; font-weight: bold;">:</span>IUIComponent,
									   childDisplayObject<span style="color: #000000; font-weight: bold;">:</span>IUIComponent<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>initOptions<span style="color: #000000;">&#41;</span>;
			<span style="color: #0033ff; font-weight: bold;">this</span>.rootDisplayObject = rootDisplayObject;
			<span style="color: #0033ff; font-weight: bold;">this</span>.childDisplayObject = childDisplayObject;
&nbsp;
			addChildren<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
			<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>, stageResizeHandler<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> addChildren<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>
			childDisplayObject.<span style="color: #004993;">addEventListener</span><span style="color: #000000;">&#40;</span>FlexEvent.CREATION_COMPLETE, childCreationCompleteHandler, <span style="color: #0033ff; font-weight: bold;">false</span>, <span style="color: #000000; font-weight:bold;">0</span>, <span style="color: #0033ff; font-weight: bold;">true</span><span style="color: #000000;">&#41;</span>;
			<span style="color: #000000;">&#40;</span><span style="color: #004993;">stage</span>.<span style="color: #004993;">addChild</span><span style="color: #000000;">&#40;</span>systemManager = <span style="color: #0033ff; font-weight: bold;">new</span> WindowedSystemManager<span style="color: #000000;">&#40;</span>rootDisplayObject<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span> <span style="color: #0033ff; font-weight: bold;">as</span> <span style="color: #004993;">DisplayObjectContainer</span><span style="color: #000000;">&#41;</span>
				.<span style="color: #004993;">addChild</span><span style="color: #000000;">&#40;</span>childDisplayObject <span style="color: #0033ff; font-weight: bold;">as</span> <span style="color: #004993;">DisplayObject</span><span style="color: #000000;">&#41;</span>;
&nbsp;
			stageResizeHandler<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> childCreationCompleteHandler<span style="color: #000000;">&#40;</span>e<span style="color: #000000; font-weight: bold;">:</span>FlexEvent<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>
			childDisplayObject.<span style="color: #004993;">removeEventListener</span><span style="color: #000000;">&#40;</span>FlexEvent.CREATION_COMPLETE, childCreationCompleteHandler<span style="color: #000000;">&#41;</span>;
			stageResizeHandler<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
		<span style="color: #000000;">&#125;</span>
&nbsp;
&nbsp;
		<span style="color: #009900;">// ------------------ resize ----------------------- //</span>
&nbsp;
		<span style="color: #0033ff; font-weight: bold;">protected</span> <span style="color: #339966; font-weight: bold;">function</span> stageResizeHandler<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>
			childDisplayObject.<span style="color: #004993;">width</span> = <span style="color: #004993;">stage</span>.<span style="color: #004993;">stageWidth</span>;
			childDisplayObject.<span style="color: #004993;">height</span> = <span style="color: #004993;">stage</span>.<span style="color: #004993;">stageHeight</span>;
		<span style="color: #000000;">&#125;</span>
	<span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://flashimp.ru/101/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<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>
		<item>
		<title>Pixel Bender batch compiler runner</title>
		<link>http://flashimp.ru/21</link>
		<comments>http://flashimp.ru/21#comments</comments>
		<pubDate>Mon, 23 Nov 2009 15:30:06 +0000</pubDate>
		<dc:creator>Александр Козловский</dc:creator>
				<category><![CDATA[Накодил]]></category>
		<category><![CDATA[assistant]]></category>
		<category><![CDATA[command line]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[FP10]]></category>
		<category><![CDATA[Pixel Bender]]></category>
		<category><![CDATA[VBS]]></category>

		<guid isPermaLink="false">http://flashimp.ru/?p=21</guid>
		<description><![CDATA[Написал VBS скриптец для пакетной компиляции .pbk файлов. Работает только под окнами. Как работает: Принимает пачку входящих параметров - [fullUrlFile.pbk ...], выбрасывает все, что не .pbk, для каждого вызывает компилятор. Принимает необязательные параметры: -pb-C:\url\to\pbutil.exe -bin-C:\url\to\ Написано кривовато, ибо в VBS я на момент написания абсолютно ничего не смыслел. Применять эту штуку удобно в случае, если [...]]]></description>
			<content:encoded><![CDATA[<p>Написал VBS скриптец для пакетной компиляции .pbk файлов. <strong>Работает только под окнами</strong>.</p>
<p>Как работает: Принимает пачку входящих параметров - [fullUrlFile.pbk ...], выбрасывает все, что не .pbk, для каждого вызывает компилятор.</p>
<p>Принимает необязательные параметры:</p>
<ul>
<li>-pb-C:\url\to\pbutil.exe</li>
<li>-bin-C:\url\to\</li>
</ul>
<p>Написано кривовато, ибо в VBS я на момент написания абсолютно ничего не смыслел.<br />
Применять эту штуку удобно в случае, если мы пишем и отлаживаем код в Pixel Bender Toolkit, а самих кернелов (.pbk) в проекте много. Приходится либо вызывать компиляцию для каждого обновленного ручками из Pixel Bender Toolkit-а, либо, если пользуемся плагином для <a title="eclipse" href="http://www.eclipse.org/">Eclipse</a> под названием <a title="PBDT" href="http://blog.joa-ebert.com/pbdt/">PBDT</a>, то сохранять каждый pbk, не, что тоже долго и неприятно.</p>
<p>Решение для Eclipse/<a title="Flex Builder 3" href="http://www.adobe.com/cfusion/entitlement/index.cfm?e=flexbuilder3">FB</a>: Просто подключаем этот vbs-скрипт как екстернал-компилятор и указываем в параметрах папку, куда следует складывать готовые .pbj. И все обновившиеся кернелы скомпилятся при следующем билде.</p>
<p>Конкретика:</p>
<ul>
<li> Создаем в Project &gt; Properties &gt; Builders &gt; .. новый билдер, называем его PBBCR;</li>
<li>Заменяем свой .externalToolBuilders\PBBCR.launch на аналог из скачанного <a title="PBBCR" href="http://flashimp.ru/files/21/PBBCR.rar">архива</a>;</li>
<li>Снова открываем Project &gt; Properties &gt; Builders &gt; PBBCR &gt; в поле Arguments первым параметром пишем/правим путь к PBBCR.vbs;</li>
<li>(опционально) Там же в поле Arguments пишем/правим путь к pbutil.exe (он есть в папке Pixel Bender-a начиная с 1.5.1 версии) и путь к папке, куда складывать бинарники .pbj.</li>
<li>Не забываем в списке билдеров Project &gt; Properties &gt; Builders &gt; поставить наш PBBCR на самый верх, дабы он срабатывал первый.</li>
</ul>
<p>Сам скрипт, пример .project, пример .launch в <a title="PBBCR" href="http://flashimp.ru/files/21/PBBCR.rar">архиве</a>.</p>
<p>Единственный нюанс: Если сами указываем output-папку и она реально не существует, ее необходимо создать самостоятельно - скрипт сам не умеет творить такие чудеса.</p>
]]></content:encoded>
			<wfw:commentRss>http://flashimp.ru/21/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

