<?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; Flash</title>
	<atom:link href="http://flashimp.ru/tag/flash/feed" rel="self" type="application/rss+xml" />
	<link>http://flashimp.ru</link>
	<description>Flash Implosion new generation</description>
	<lastBuildDate>Fri, 02 Mar 2012 07:30:09 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Структуры данных: 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>Wallaby prerelease</title>
		<link>http://flashimp.ru/118</link>
		<comments>http://flashimp.ru/118#comments</comments>
		<pubDate>Wed, 09 Mar 2011 08:44:17 +0000</pubDate>
		<dc:creator>Александр Козловский</dc:creator>
				<category><![CDATA[Новости]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[HTML5]]></category>

		<guid isPermaLink="false">http://flashimp.ru/?p=118</guid>
		<description><![CDATA[Вышел обещанный н MAX'e фрэймворк для конвертации Flash-контента в HTML5. На самом деле это AIR-приложение, сыренькое. Конвертируются только .FLA, состряпанные в Flash Pro CS5. Link on labs. Help.]]></description>
			<content:encoded><![CDATA[<p>Вышел обещанный н MAX'e фрэймворк для конвертации Flash-контента в HTML5.</p>
<p>На самом деле это AIR-приложение, сыренькое. Конвертируются только .FLA, состряпанные в Flash Pro CS5.</p>
<p><a href="http://labs.adobe.com/technologies/wallaby/" target="_blank">Link</a> on labs. Help.</p>
]]></content:encoded>
			<wfw:commentRss>http://flashimp.ru/118/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adobe Flash Player 10.3 Beta</title>
		<link>http://flashimp.ru/116</link>
		<comments>http://flashimp.ru/116#comments</comments>
		<pubDate>Wed, 09 Mar 2011 08:40:09 +0000</pubDate>
		<dc:creator>Александр Козловский</dc:creator>
				<category><![CDATA[Новости]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[FP10]]></category>

		<guid isPermaLink="false">http://flashimp.ru/?p=116</guid>
		<description><![CDATA[Flash Player 10.3 for Windows, Mac, and Linux introduces new developer features and enhanced user privacy protection, such as: Media Measurement Acoustic Echo Cancellation Integration with browser privacy control for local storage Native Control Panel Auto-Update Notification for Mac OS Link.]]></description>
			<content:encoded><![CDATA[<p>Flash Player 10.3 for Windows, Mac, and Linux introduces new developer features and enhanced user privacy protection, such as:</p>
<ul>
<li> Media Measurement</li>
<li> Acoustic Echo Cancellation</li>
<li> Integration with browser privacy control for local storage</li>
<li> Native Control Panel</li>
<li> Auto-Update Notification for Mac OS</li>
</ul>
<p><a href="http://labs.adobe.com/technologies/flashplatformruntimes/flashplayer10-3/" target="_blank">Link.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://flashimp.ru/116/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apple снимает ограничения для Flash &#8211; разработчиков.</title>
		<link>http://flashimp.ru/114</link>
		<comments>http://flashimp.ru/114#comments</comments>
		<pubDate>Thu, 09 Sep 2010 14:11:02 +0000</pubDate>
		<dc:creator>FIZZER</dc:creator>
				<category><![CDATA[Новости]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[iOS]]></category>

		<guid isPermaLink="false">http://flashimp.ru/?p=114</guid>
		<description><![CDATA[Сегодня Apple сообщили, что ограничения в использовании средств разработки под iOS будут сняты. "Мы снимаем все ограничения которые касаются средств разработки используемые для создания приложений под iOS, запрещенным остается только загрузка дополнительного кода созданным приложением. Это предоставит разработчикам больше свободы в выборе инструментов, в которых они нуждаются. В то же время безопасность приложений останется на [...]]]></description>
			<content:encoded><![CDATA[<p>Сегодня Apple сообщили, что ограничения в использовании средств разработки под iOS будут сняты.</p>
<p>"Мы снимаем все ограничения которые касаются средств разработки используемые для создания приложений под iOS, запрещенным остается только загрузка дополнительного кода созданным приложением. Это предоставит разработчикам больше свободы в выборе инструментов, в которых они нуждаются. В то же время безопасность приложений останется на том же уровне."</p>
]]></content:encoded>
			<wfw:commentRss>http://flashimp.ru/114/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>Анонс Flash Platform Game Technology Center</title>
		<link>http://flashimp.ru/80</link>
		<comments>http://flashimp.ru/80#comments</comments>
		<pubDate>Wed, 23 Dec 2009 18:08:50 +0000</pubDate>
		<dc:creator>Александр Козловский</dc:creator>
				<category><![CDATA[Новости]]></category>
		<category><![CDATA[Adobe]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[games]]></category>
		<category><![CDATA[services]]></category>

		<guid isPermaLink="false">http://flashimp.ru/?p=80</guid>
		<description><![CDATA[Позитивная новость для геймдива: В полку сервисов всеми любимой Adobe прибыло. Точнее, прибудет. Adobe анонсировала открытие Flash Platform Game Technology Center - ресурса для разработчиков игр на Flash Platform. Украдено у Алексея Яковенко. UPD: Только что на девнете была опубликована статья Danielle Deibler Introducing the Adobe Flash Platform Gaming.]]></description>
			<content:encoded><![CDATA[<p>Позитивная новость для геймдива:<br />
В полку сервисов всеми любимой Adobe прибыло. Точнее, прибудет.<br />
Adobe <a title="Анонс Flash Platform Game Technology Center" href="http://www.adobe.com/devnet/games/" target="_blank">анонсировала</a> открытие Flash Platform Game Technology Center - ресурса для разработчиков игр на Flash Platform.</p>
<p>Украдено у <a title="injun #576871 : Flash Platform Game Technology Center" href="http://injun.ru/?p=914" target="_blank">Алексея Яковенко</a>.</p>
<p>UPD: Только что на девнете была опубликована статья Danielle Deibler <a title="Adobe DEVNET:  Introducing the Adobe Flash Platform Gaming Technology Center" href="http://www.adobe.com/devnet/logged_in/ddeibler_flash_platform_games.html?devcon=f1" target="_blank">Introducing the Adobe Flash Platform Gaming</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://flashimp.ru/80/feed</wfw:commentRss>
		<slash:comments>0</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>
		<item>
		<title>Machinarium</title>
		<link>http://flashimp.ru/11</link>
		<comments>http://flashimp.ru/11#comments</comments>
		<pubDate>Fri, 20 Nov 2009 13:23:06 +0000</pubDate>
		<dc:creator>Александр Козловский</dc:creator>
				<category><![CDATA[Новости]]></category>
		<category><![CDATA[ART]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[games]]></category>

		<guid isPermaLink="false">http://flashimp.ru/?p=11</guid>
		<description><![CDATA[Шедевральная редкость от чешских творцов Amanita Design. Друг посоветовал, я в восторге, и рекомендую это чудо вам. Игрушка, квест в стиле Full Pipe. Конечно, на флэше. Сайт продукта.]]></description>
			<content:encoded><![CDATA[<p>Шедевральная редкость от чешских творцов <a title="creators" href="http://www.snowball.ru/machinarium/?page=creators" target="_blank">Amanita Design</a>.<br />
Друг посоветовал, я в восторге, и рекомендую это чудо вам.<br />
Игрушка, квест в стиле <a title="Полная Труба" href="http://www.pipestudio.ru/fullpipe/index.php?Lang=ru" target="_blank">Full Pipe</a>.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="400" height="300" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=7096871&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed type="application/x-shockwave-flash" width="400" height="300" src="http://vimeo.com/moogaloop.swf?clip_id=7096871&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" allowscriptaccess="always" allowfullscreen="true"></embed></object><br />
Конечно, на флэше. <a title="machinarium" href="http://www.snowball.ru/machinarium/" target="_blank">Сайт продукта</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://flashimp.ru/11/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

