<?xml version="1.0" encoding="windows-1251"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>Форум Flasher.ru - Блоги</title>
		<link>http://www.flasher.ru/forum/blog.php</link>
		<description>Международный форум Flash-мастеров</description>
		<language>ru</language>
		<lastBuildDate>Thu, 17 May 2012 09:42:53 GMT</lastBuildDate>
		<generator>vBulletin</generator>
		<ttl>60</ttl>
		<image>
			<url>http://www.flasher.ru/forum/images/russian/style3/misc/rss.jpg</url>
			<title>Форум Flasher.ru - Блоги</title>
			<link>http://www.flasher.ru/forum/blog.php</link>
		</image>
		<item>
			<title>I4Logger - простой и компактный логгер</title>
			<link>http://www.flasher.ru/forum/blog.php?b=561</link>
			<pubDate>Sat, 05 May 2012 19:00:27 GMT</pubDate>
			<description><![CDATA[Пишу свой логгер для онлайн использования по большей части.  
[ATTACH]266[/ATTACH] 
На скрине видна первая сборочка.  
Что умеет : 
1. обычный print ( записывает названия класса коллера, класс объекта, его значение, если таковое есть). 
2. printMulti ( пишет в столбик, как показано в 20 строке,...]]></description>
			<content:encoded><![CDATA[<!-- BEGIN TEMPLATE: blog_entry_external -->
<div>Пишу свой логгер для онлайн использования по большей части. <br />
[ATTACH]266[/ATTACH]<br />
На скрине видна первая сборочка. <br />
Что умеет :<br />
1. обычный print ( записывает названия класса коллера, класс объекта, его значение, если таковое есть).<br />
2. printMulti ( пишет в столбик, как показано в 20 строке, сразу несколько объектов по принципу print ).<br />
3. Несколько типов сохранения логов.<br />
а) сохраняет на комп пользователя с вызовом соотв окна. При этом записываются либо ВСЕ строки, либо только те, которые были помечены брейком ( красная точка слева )<br />
б) записывает на сервер без участия пользователя. Что собственно удобно, для тестирования приложения пользователями.<br />
4. Легкий вес ( итоговый около 30 кб будет наверное ). Хотя может кому и тяжелый )))<br />
5. Полностью настраиваемый стиль, цвет каждого окна, цвет любого текста и т.п. Через стили debug.style.color = 0xFFFFFF;<br />
6. Вызывается и прячется по кнопке на клавиатуре назначенной вами, по дефолту &quot;\&quot; . <br />
7. Сворачивается до заголовка, окно так же можно таскать по сцене.<br />
8. Создается в 1 строчку new I4Logger(stage); , координаты устанавливаются по старинке debug.x = 100. <br />
9. Не расширяется от спрайта или мувиклипа, доступны и видны ТОЛЬКО те методы, которые действительно есть и требуются. <br />
<br />
Собственно выкладывать пока рано, только допиливаю, но хочу знать мнение ваше, нужно ли кому такое или нет? Если тема нафиг ни кому не нужна удалю и больше не вернемся к этому вопросу :)</div>


<!-- attachments -->
	<div style="margin-top:10px">

		
		
			<fieldset class="fieldset">
				<legend>Изображения</legend>
				<div style="padding:3px">
				<!-- BEGIN TEMPLATE: blog_entry_attachment_image -->
<img class="attach" src="http://www.flasher.ru/forum/blog_attachment.php?attachmentid=266&amp;stc=1&amp;d=1336243655" border="0" alt="" />&nbsp;
<!-- END TEMPLATE: blog_entry_attachment_image -->
				</div>
			</fieldset>
		
		
		

	</div>
<!-- / attachments -->

<!-- END TEMPLATE: blog_entry_external -->]]></content:encoded>
			<dc:creator>in4core</dc:creator>
			<guid isPermaLink="true">http://www.flasher.ru/forum/blog.php?b=561</guid>
		</item>
		<item>
			<title>Crowd инструмент для разработки приложений для соц сети</title>
			<link>http://www.flasher.ru/forum/blog.php?b=559</link>
			<pubDate>Wed, 25 Apr 2012 00:21:51 GMT</pubDate>
			<description>Добрый день. Я писал в своем блоге про вот такую вещь http://whyiscryingcoder.blogspot.com/2012/04/crowd-framework-release-01.html 
 
Фреймворк этот я использую в своих проектах. Если подобная вещь интересна как инструмент, то я продолжу его поддерживать и публиковать, если нет, то будет только...</description>
			<content:encoded><![CDATA[<!-- BEGIN TEMPLATE: blog_entry_external -->
<div>Добрый день. Я писал в своем блоге про вот такую вещь <a href="http://whyiscryingcoder.blogspot.com/2012/04/crowd-framework-release-01.html" target="_blank">http://whyiscryingcoder.blogspot.com...elease-01.html</a><br />
<br />
Фреймворк этот я использую в своих проектах. Если подобная вещь интересна как инструмент, то я продолжу его поддерживать и публиковать, если нет, то будет только мой. Так что хотелось бы узнать это кому-то нужно кроме меня или нет?<br />
<br />
Нужно? тогда постоянная поддержка, релизы, документация и все дела.<br />
Нет? ну так на нет и суда нет.<br />
<br />
Вопросы приветствуются</div>


<!-- END TEMPLATE: blog_entry_external -->]]></content:encoded>
			<dc:creator>ramshteks</dc:creator>
			<guid isPermaLink="true">http://www.flasher.ru/forum/blog.php?b=559</guid>
		</item>
		<item>
			<title>Совместная разработка пакета классов</title>
			<link>http://www.flasher.ru/forum/blog.php?b=558</link>
			<pubDate>Mon, 16 Apr 2012 16:07:39 GMT</pubDate>
			<description><![CDATA[Привет. Предлагаю новую "игру" для флешеров. Создать набор классов (некоторые могут ошибочно назвать это фреймворком) для упрощения решения повседневных задач начинающих и ленивых программистов, коих наверное большинство. 
 
Что это за набор? Суть очень проста. Одна задача - один класс. Никаких...]]></description>
			<content:encoded><![CDATA[<!-- BEGIN TEMPLATE: blog_entry_external -->
<div>Привет. Предлагаю новую &quot;игру&quot; для флешеров. Создать набор классов (некоторые могут ошибочно назвать это фреймворком) для упрощения решения повседневных задач начинающих и ленивых программистов, коих наверное большинство.<br />
<br />
Что это за набор? Суть очень проста. Одна задача - один класс. Никаких зависимостей от других не &quot;нативных&quot; классов. Пихать internal класс внутрь допускается.<br />
<br />
Какие могут быть задачи? Для этого нужно вспомнить рабочий опыт и на его основе придумать, чем помочь этому набору классов.<br />
<br />
Класс можно оставлять в комментариях, с указанием зачем это нужно. И после бурного обсуждения, что всё как всегда криво и косо, совместным решением утверждать его.<br />
<br />
Вот примеры классов, для тех кто хочет попробовать свои силы:<br />
<br />
<b>Call</b> - задержанный вызов функций.<br />
<!-- BEGIN TEMPLATE: bbcode_as3code -->
<div style="margin:20px; margin-top:5px">
	<div style="margin-bottom: 3px; width: 800px;" class="smallfont"><a href="#" onclick="collapseCode(this); return false;"><img style="margin-bottom: -3px;" border="0" src="images/russian/style3/buttons/collapse_thead_collapsed.gif" alt=""></a> Код AS3:</div>
	<pre dir="ltr" class="alt2" style="
		width: 800px;
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		height: 50px;
		text-align: left;
		overflow: auto;"><pre class="actionscript3" style="font-family:monospace;">Call.<span style="color: #6699cc;">nextFrame</span><span style="color: #66cc66;">&#40;</span>func, ...args<span style="color: #66cc66;">&#41;</span> <span style="color: #FF00FF;">//Вызываем функцию func передавая ей параметры args</span>
Call.forget<span style="color: #66cc66;">&#40;</span>func<span style="color: #66cc66;">&#41;</span> <span style="color: #FF00FF;">//Отменить вызов функции</span></pre></pre>
</div>
<!-- END TEMPLATE: bbcode_as3code -->*Учесть, что в задерживаемой функции, также может быть задержанный вызов, который не должен обработаться в ту же итерацию<br />
<br />
<b>Music</b> - работа со звуком. <br />
<!-- BEGIN TEMPLATE: bbcode_as3code -->
<div style="margin:20px; margin-top:5px">
	<div style="margin-bottom: 3px; width: 800px;" class="smallfont"><a href="#" onclick="collapseCode(this); return false;"><img style="margin-bottom: -3px;" border="0" src="images/russian/style3/buttons/collapse_thead_collapsed.gif" alt=""></a> Код AS3:</div>
	<pre dir="ltr" class="alt2" style="
		width: 800px;
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		height: 50px;
		text-align: left;
		overflow: auto;"><pre class="actionscript3" style="font-family:monospace;">Music.playSound<span style="color: #66cc66;">&#40;</span>&quot;http:<span style="color: #FF00FF;">//domain.com/sound.mp3&quot;).volume(56); //Фоновая музыка - только один поток</span>
Music.playUI<span style="color: #66cc66;">&#40;</span>ClickSound<span style="color: #66cc66;">&#41;</span> <span style="color: #FF00FF;">//Проигрывание кнопочек</span></pre></pre>
</div>
<!-- END TEMPLATE: bbcode_as3code -->*Запуск и остановка музыки с заплавлением громкости.<br />
* Простое изменение громкости и пана.<br />
* Проигрывание звуков кнопочек, менюшечек.<br />
* Отлов ошибок связанных с отсутствием правильно настроенного звука на компьютере<br />
<br />
<b>Tween</b> -Старый добрый твин c использованием Proxy. <br />
<!-- BEGIN TEMPLATE: bbcode_as3code -->
<div style="margin:20px; margin-top:5px">
	<div style="margin-bottom: 3px; width: 800px;" class="smallfont"><a href="#" onclick="collapseCode(this); return false;"><img style="margin-bottom: -3px;" border="0" src="images/russian/style3/buttons/collapse_thead_collapsed.gif" alt=""></a> Код AS3:</div>
	<pre dir="ltr" class="alt2" style="
		width: 800px;
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		height: 34px;
		text-align: left;
		overflow: auto;"><pre class="actionscript3" style="font-family:monospace;">Tween.bounce<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100; font-weight: bold;">this</span>, <span style="color: #6699cc;">time</span>, onTweenComplete<span style="color: #66cc66;">&#41;</span>.<span style="color: #6699cc;">x</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc; font-weight:bold;">100</span><span style="color: #66cc66;">&#41;</span>.easeFunctionArgument<span style="color: #66cc66;">&#40;</span>from, to<span style="color: #66cc66;">&#41;</span>;</pre></pre>
</div>
<!-- END TEMPLATE: bbcode_as3code -->*Использование прокси для создания записи в одну строку для заранее неизвестных твинируемых параметрах<br />
<br />
<b>ColorFilter</b> -Простой в использовании ColorMatrixFilter. <br />
<!-- BEGIN TEMPLATE: bbcode_as3code -->
<div style="margin:20px; margin-top:5px">
	<div style="margin-bottom: 3px; width: 800px;" class="smallfont"><a href="#" onclick="collapseCode(this); return false;"><img style="margin-bottom: -3px;" border="0" src="images/russian/style3/buttons/collapse_thead_collapsed.gif" alt=""></a> Код AS3:</div>
	<pre dir="ltr" class="alt2" style="
		width: 800px;
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		height: 34px;
		text-align: left;
		overflow: auto;"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #b1b100; font-weight: bold;">this</span>.<span style="color: #6699cc;">filters</span> = <span style="color: #66cc66;">&#91;</span>ColorFilter.hue<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc; font-weight:bold;">180</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #6699cc;">alpha</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc; font-weight:bold;">0.5</span><span style="color: #66cc66;">&#41;</span>.tint<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc; font-weight:bold;">0.5</span>, 0xffffff<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span>;</pre></pre>
</div>
<!-- END TEMPLATE: bbcode_as3code --><b>WebLoader</b> -Упрощённая загрузка всего чего можно.<br />
<!-- BEGIN TEMPLATE: bbcode_as3code -->
<div style="margin:20px; margin-top:5px">
	<div style="margin-bottom: 3px; width: 800px;" class="smallfont"><a href="#" onclick="collapseCode(this); return false;"><img style="margin-bottom: -3px;" border="0" src="images/russian/style3/buttons/collapse_thead_collapsed.gif" alt=""></a> Код AS3:</div>
	<pre dir="ltr" class="alt2" style="
		width: 800px;
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		height: 34px;
		text-align: left;
		overflow: auto;"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #6699cc;">addChild</span><span style="color: #66cc66;">&#40;</span>WebLoader.crossBitmap<span style="color: #66cc66;">&#40;</span>&quot;http:<span style="color: #FF00FF;">//vk.com/empty.png&quot;).center(100,200);</span></pre></pre>
</div>
<!-- END TEMPLATE: bbcode_as3code -->*Не загружать повторно картинку по тому же пути, в таком случае возвращать копию контента (например, чтобы добавлять на сцену много экземпляров)<br />
*функции bitmap(path:String, handler:Function = null):WebLoader, crossBitmap - в обход кроссдомена, xml, text, b т.д.<br />
* Если указана функция handler - выдавать результат конечного типа в неё. Иначе пытаться добавить визуальный объект внутрь контейнера.<br />
<br />
<b>Server</b> -взаимодействие с сервером через http.<br />
<!-- BEGIN TEMPLATE: bbcode_as3code -->
<div style="margin:20px; margin-top:5px">
	<div style="margin-bottom: 3px; width: 800px;" class="smallfont"><a href="#" onclick="collapseCode(this); return false;"><img style="margin-bottom: -3px;" border="0" src="images/russian/style3/buttons/collapse_thead_collapsed.gif" alt=""></a> Код AS3:</div>
	<pre dir="ltr" class="alt2" style="
		width: 800px;
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		height: 34px;
		text-align: left;
		overflow: auto;"><pre class="actionscript3" style="font-family:monospace;">Server.json<span style="color: #66cc66;">&#40;</span><span style="color: #6699cc;">data</span>:<span style="color: #66cc66; font-weight: bold;">*</span>, path, handler<span style="color: #66cc66;">&#41;</span></pre></pre>
</div>
<!-- END TEMPLATE: bbcode_as3code -->*Рассмотреть различные варианты типизации данных<br />
<br />
<b>MixFilter</b> -Удобный инструмент для микширования фильтров (когда на объект нужно накладывать динамически больше одного фильтра).<br />
<!-- BEGIN TEMPLATE: bbcode_as3code -->
<div style="margin:20px; margin-top:5px">
	<div style="margin-bottom: 3px; width: 800px;" class="smallfont"><a href="#" onclick="collapseCode(this); return false;"><img style="margin-bottom: -3px;" border="0" src="images/russian/style3/buttons/collapse_thead_collapsed.gif" alt=""></a> Код AS3:</div>
	<pre dir="ltr" class="alt2" style="
		width: 800px;
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		height: 50px;
		text-align: left;
		overflow: auto;"><pre class="actionscript3" style="font-family:monospace;">MixFilter.<span style="color: #6699cc;">add</span><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100; font-weight: bold;">this</span>, &quot;highlightarget&quot;, <span style="color: #6699cc;">filter</span><span style="color: #66cc66;">&#41;</span>;
MixFilter.remove<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100; font-weight: bold;">this</span>, &quot;highlightarget&quot;<span style="color: #66cc66;">&#41;</span>;</pre></pre>
</div>
<!-- END TEMPLATE: bbcode_as3code --><br />
<b>ObjectEvent</b> - Класс события с кастомным полем data:*, через статические методы можно подписываться на события, отписываться от всех разом, и т.д.<br />
<!-- BEGIN TEMPLATE: bbcode_as3code -->
<div style="margin:20px; margin-top:5px">
	<div style="margin-bottom: 3px; width: 800px;" class="smallfont"><a href="#" onclick="collapseCode(this); return false;"><img style="margin-bottom: -3px;" border="0" src="images/russian/style3/buttons/collapse_thead_collapsed.gif" alt=""></a> Код AS3:</div>
	<pre dir="ltr" class="alt2" style="
		width: 800px;
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		height: 66px;
		text-align: left;
		overflow: auto;"><pre class="actionscript3" style="font-family:monospace;">ObjectEvent.<span style="color: #6699cc;">addEventListener</span><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100; font-weight: bold;">this</span>, <span style="color: #6699cc;">MouseEvent</span>.<span style="color: #6699cc;">CLICK</span>, onClick<span style="color: #66cc66;">&#41;</span>;
ObjectEvent.removeAllListeners<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100; font-weight: bold;">this</span><span style="color: #66cc66;">&#41;</span>;
ObjectEvent.bubble<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100; font-weight: bold;">this</span>,&quot;complete&quot;<span style="color: #66cc66;">&#41;</span> <span style="color: #FF00FF;">//Всплывающее событие (plain - обычное)</span></pre></pre>
</div>
<!-- END TEMPLATE: bbcode_as3code -->Вот, что приходит на ум. Использование статических методов вовсе необязательно, просто я считаю такой формат лаконичным и понятным.<br />
<br />
Не бойтесь пробовать делать, если Вы только учитесь AS3. Для Вас это хорошая практика. А если уж совсем никак, поделитесь идеей, чего не хватает.<br />
<br />
Думаю будет очень востребованным набором, если найдутся желающие помочь =)</div>


<!-- END TEMPLATE: blog_entry_external -->]]></content:encoded>
			<dc:creator>Rzer</dc:creator>
			<guid isPermaLink="true">http://www.flasher.ru/forum/blog.php?b=558</guid>
		</item>
		<item>
			<title>MXML, Биндинг и другие страшные для ТРУЪ аскриптера вещи. Часть первая.</title>
			<link>http://www.flasher.ru/forum/blog.php?b=557</link>
			<pubDate>Sun, 15 Apr 2012 12:03:38 GMT</pubDate>
			<description>Вводная часть. (http://www.flasher.ru/forum/blog.php?b=554) 
 
Что же надо чтобы использовать mxml? 
1) Заводим флекс проект.   
Все примеры я делаю во Flash Builder, но в других IDE, думаю проблем не возникнет 
Не пугайтесь - он нужен чтобы подключился framework.swc, всё таки какую-то часть...</description>
			<content:encoded><![CDATA[<!-- BEGIN TEMPLATE: blog_entry_external -->
<div><a href="http://www.flasher.ru/forum/blog.php?b=554" target="_blank">Вводная часть.</a><br />
<br />
Что же надо чтобы использовать mxml?<br />
1) Заводим флекс проект.  <br />
Все примеры я делаю во Flash Builder, но в других IDE, думаю проблем не возникнет<br />
Не пугайтесь - он нужен чтобы подключился framework.swc, всё таки какую-то часть флексовского фрэймворка нам нужно будет использовать. <br />
Затем в опциях компилятора прописываем merged into code и добавляем в Additional compiler options опции<br />
<b>-keep</b>   - показывать сгенерённые классы (они будут лежать в bin-debug/generated)<br />
<b>-link-report=report.xml </b> - сформировать файл отчёта, будет в bin-debug/report.xml ) <br />
<b>-default-size 800 600</b> - уставновить размер флэшки. <br />
<br />
2) первое приложение.<br />
Так как я назвал проект no_flex_mxml, то билдер сгенерил мне класс no_flex_mxml.mxml в качестве дефолтного.<br />
пусть так и будет.<br />
смотрим содержание:<br />
<!-- BEGIN TEMPLATE: bbcode_as3code -->
<div style="margin:20px; margin-top:5px">
	<div style="margin-bottom: 3px; width: 800px;" class="smallfont"><a href="#" onclick="collapseCode(this); return false;"><img style="margin-bottom: -3px;" border="0" src="images/russian/style3/buttons/collapse_thead_collapsed.gif" alt=""></a> Код AS3:</div>
	<pre dir="ltr" class="alt2" style="
		width: 800px;
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		height: 146px;
		text-align: left;
		overflow: auto;"><pre class="actionscript3" style="font-family:monospace;">&lt;<span style="color: #66cc66; font-weight: bold;">?</span>xml <span style="color: #6699cc;">version</span>=&quot;<span style="color: #cc66cc; font-weight:bold;">1.0</span>&quot; encoding=&quot;utf-<span style="color: #cc66cc; font-weight:bold;">8</span>&quot;<span style="color: #66cc66; font-weight: bold;">?</span>&gt;
&lt;s:Application xmlns:fx=&quot;http:<span style="color: #FF00FF;">//ns.adobe.com/mxml/2009&quot;</span>
        xmlns:s=&quot;library:<span style="color: #FF00FF;">//ns.adobe.com/flex/spark&quot;</span>
        xmlns:mx=&quot;library:<span style="color: #FF00FF;">//ns.adobe.com/flex/mx&quot; minWidth=&quot;955&quot; minHeight=&quot;600&quot;&gt;</span>
    &lt;fx:Declarations&gt;
        &lt;<span style="color: #66cc66; font-weight: bold;">!</span>-- Place non-visual <span style="color: #6699cc;">elements</span> <span style="color: #66cc66;">&#40;</span>e.g., services, <span style="color: #6699cc;">value</span> objects<span style="color: #66cc66;">&#41;</span> here --&gt;
    &lt;/fx:Declarations&gt;
&lt;/s:Application&gt;</pre></pre>
</div>
<!-- END TEMPLATE: bbcode_as3code -->Видим, что главным классом этого приложения записан s:Application<br />
Видим какие-то xmlns.<br />
Это нэймспесы. По сути это псевдонимы для импортов.<br />
В общем видим, что флекса тут очень много.<br />
Давайте сделаем просто обычный спрайт.<br />
<!-- BEGIN TEMPLATE: bbcode_as3code -->
<div style="margin:20px; margin-top:5px">
	<div style="margin-bottom: 3px; width: 800px;" class="smallfont"><a href="#" onclick="collapseCode(this); return false;"><img style="margin-bottom: -3px;" border="0" src="images/russian/style3/buttons/collapse_thead_collapsed.gif" alt=""></a> Код AS3:</div>
	<pre dir="ltr" class="alt2" style="
		width: 800px;
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		height: 306px;
		text-align: left;
		overflow: auto;"><pre class="actionscript3" style="font-family:monospace;">&lt;<span style="color: #66cc66; font-weight: bold;">?</span>xml <span style="color: #6699cc;">version</span>=&quot;<span style="color: #cc66cc; font-weight:bold;">1.0</span>&quot; encoding=&quot;utf-<span style="color: #cc66cc; font-weight:bold;">8</span>&quot;<span style="color: #66cc66; font-weight: bold;">?</span>&gt;
&lt;mx:<span style="color: #6699cc;">Sprite</span> xmlns:fx=&quot;http:<span style="color: #FF00FF;">//ns.adobe.com/mxml/2009&quot;</span>
        xmlns:mx=&quot;library:<span style="color: #FF00FF;">//ns.adobe.com/flex/mx&quot;</span>
        <span style="color: #6699cc;">addedToStage</span>=&quot;init<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;&quot;
        &gt;
    &lt;fx:Declarations&gt;
        &lt;fx:<span style="color: #6699cc;">Number</span> id=&quot;property&quot; /&gt;
    &lt;/fx:Declarations&gt;
&nbsp;
    &lt;fx:Script&gt;&lt;!<span style="color: #66cc66;">&#91;</span>CDATA<span style="color: #66cc66;">&#91;</span>
        <span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">function</span> <span style="color: #6699cc;">init</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #b1b100; font-weight: bold;">void</span> <span style="color: #66cc66;">&#123;</span>
            <span style="color: #6699cc;">trace</span><span style="color: #66cc66;">&#40;</span>&quot;init&quot;<span style="color: #66cc66;">&#41;</span>;
	    property = <span style="color: #cc66cc; font-weight:bold;">10</span>;
        <span style="color: #66cc66;">&#125;</span>
    <span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#93;</span>&gt;
    &lt;/fx:Script&gt;
    &lt;mx:<span style="color: #6699cc;">Sprite</span> id=&quot;child&quot; <span style="color: #6699cc;">addedToStage</span>=&quot;trace<span style="color: #66cc66;">&#40;</span><span style="color: #990000;">'child added'</span><span style="color: #66cc66;">&#41;</span>;&quot; /&gt;
&lt;/mx:Sprite&gt;</pre></pre>
</div>
<!-- END TEMPLATE: bbcode_as3code -->Интересный момент: в спрайте мы видим свойство<br />
addedToStage  - это ещё одна фишка mxml - события генерируемые объектами выглядят как свойства и их значениями является код хэндлеров.<br />
Для того, чтобы работали автогенерации и подсказки, нужно описать правильно собственные события с помощью метатега Event.<br />
<br />
&lt;fx: Declarations&gt; - нужен для невизуальных объектов.<br />
Которые не размещаются внутри компонента.<br />
К сожалению, код помещенный выше, <br />
<!-- BEGIN TEMPLATE: bbcode_as3code -->
<div style="margin:20px; margin-top:5px">
	<div style="margin-bottom: 3px; width: 800px;" class="smallfont"><a href="#" onclick="collapseCode(this); return false;"><img style="margin-bottom: -3px;" border="0" src="images/russian/style3/buttons/collapse_thead_collapsed.gif" alt=""></a> Код AS3:</div>
	<pre dir="ltr" class="alt2" style="
		width: 800px;
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		height: 34px;
		text-align: left;
		overflow: auto;"><pre class="actionscript3" style="font-family:monospace;">&lt;mx:<span style="color: #6699cc;">Sprite</span> id=&quot;child&quot; <span style="color: #6699cc;">addedToStage</span>=&quot;trace<span style="color: #66cc66;">&#40;</span><span style="color: #990000;">'child added'</span><span style="color: #66cc66;">&#41;</span>;&quot; /&gt;</pre></pre>
</div>
<!-- END TEMPLATE: bbcode_as3code -->ошибочный.<br />
<!-- BEGIN TEMPLATE: bbcode_quote -->
<div style="margin:20px; margin-top:5px; ">
	<div class="smallfont" style="margin-bottom:2px">Цитата:</div>
	<table cellpadding="6" cellspacing="0" border="0" width="100%">
	<tr>
		<td class="alt2" style="border:1px inset">
			
				'Sprite' declaration must be contained within the &lt;Declarations&gt; tag since it does not implement 'mx.core.IUIComponent'.
			
		</td>
	</tr>
	</table>
</div>
<!-- END TEMPLATE: bbcode_quote -->Т.е. спрайт не является IUIComponent и не может быть там помещен. В следующей статье, я расскажу как обойти эту неприятность, а пока добавлять спрайт в список отображения будем вручную.<br />
<br />
<!-- BEGIN TEMPLATE: bbcode_as3code -->
<div style="margin:20px; margin-top:5px">
	<div style="margin-bottom: 3px; width: 800px;" class="smallfont"><a href="#" onclick="collapseCode(this); return false;"><img style="margin-bottom: -3px;" border="0" src="images/russian/style3/buttons/collapse_thead_collapsed.gif" alt=""></a> Код AS3:</div>
	<pre dir="ltr" class="alt2" style="
		width: 800px;
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		height: 322px;
		text-align: left;
		overflow: auto;"><pre class="actionscript3" style="font-family:monospace;">&lt;<span style="color: #66cc66; font-weight: bold;">?</span>xml <span style="color: #6699cc;">version</span>=&quot;<span style="color: #cc66cc; font-weight:bold;">1.0</span>&quot; encoding=&quot;utf-<span style="color: #cc66cc; font-weight:bold;">8</span>&quot;<span style="color: #66cc66; font-weight: bold;">?</span>&gt;
&lt;mx:<span style="color: #6699cc;">Sprite</span> xmlns:fx=&quot;http:<span style="color: #FF00FF;">//ns.adobe.com/mxml/2009&quot;</span>
        xmlns:mx=&quot;library:<span style="color: #FF00FF;">//ns.adobe.com/flex/mx&quot;</span>
        <span style="color: #6699cc;">addedToStage</span>=&quot;init<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;&quot;
        &gt;
    &lt;fx:Declarations&gt;
        &lt;fx:<span style="color: #6699cc;">Number</span> id=&quot;property&quot; /&gt;
        &lt;mx:<span style="color: #6699cc;">Sprite</span> id=&quot;child&quot; <span style="color: #6699cc;">addedToStage</span>=&quot;trace<span style="color: #66cc66;">&#40;</span><span style="color: #990000;">'child added'</span><span style="color: #66cc66;">&#41;</span>;&quot; /&gt;
    &lt;/fx:Declarations&gt;
&nbsp;
    &lt;fx:Script&gt;&lt;!<span style="color: #66cc66;">&#91;</span>CDATA<span style="color: #66cc66;">&#91;</span>
        <span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">function</span> <span style="color: #6699cc;">init</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #b1b100; font-weight: bold;">void</span> <span style="color: #66cc66;">&#123;</span>
            <span style="color: #6699cc;">trace</span><span style="color: #66cc66;">&#40;</span>&quot;init&quot;<span style="color: #66cc66;">&#41;</span>;
	    property = <span style="color: #cc66cc; font-weight:bold;">10</span>;
            <span style="color: #6699cc;">addChild</span><span style="color: #66cc66;">&#40;</span><span style="color: #6699cc;">child</span><span style="color: #66cc66;">&#41;</span>;
        <span style="color: #66cc66;">&#125;</span>
    <span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#93;</span>&gt;
    &lt;/fx:Script&gt;    
&lt;/mx:Sprite&gt;</pre></pre>
</div>
<!-- END TEMPLATE: bbcode_as3code -->Посмотрим, что же такого нагенерилось?<br />
Заходим в папочку bin-debug/generated и видим там 3 класса:<br />
<br />
<font color="Yellow">_no_flex_mxml-binding-generated.as</font><br />
<!-- BEGIN TEMPLATE: bbcode_as3code -->
<div style="margin:20px; margin-top:5px">
	<div style="margin-bottom: 3px; width: 800px;" class="smallfont"><a href="#" onclick="collapseCode(this); return false;"><img style="margin-bottom: -3px;" border="0" src="images/russian/style3/buttons/collapse_thead_collapsed.gif" alt=""></a> Код AS3:</div>
	<pre dir="ltr" class="alt2" style="
		width: 800px;
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		height: 498px;
		text-align: left;
		overflow: auto;"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #6699cc; font-weight: bold;">class</span> BindableProperty
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #FF00FF;">/*
	 * generated bindable wrapper for property child (public)
	 * - generated setter
	 * - generated getter
	 * - original public var 'child' moved to '_94631196child'
	 */</span>
&nbsp;
    <span style="color: #66cc66;">&#91;</span>Bindable<span style="color: #66cc66;">&#40;</span>event=&quot;propertyChange&quot;<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span>
    <span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">function</span> <span style="color: #b1b100; font-weight: bold;">get</span> <span style="color: #6699cc;">child</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #6699cc;">flash.display</span>.<span style="color: #6699cc;">Sprite</span>
    <span style="color: #66cc66;">&#123;</span>
        <span style="color: #b1b100; font-weight: bold;">return</span> <span style="color: #b1b100; font-weight: bold;">this</span>._94631196child;
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">function</span> <span style="color: #b1b100; font-weight: bold;">set</span> <span style="color: #6699cc;">child</span><span style="color: #66cc66;">&#40;</span><span style="color: #6699cc;">value</span>:<span style="color: #6699cc;">flash.display</span>.<span style="color: #6699cc;">Sprite</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #b1b100; font-weight: bold;">void</span>
    <span style="color: #66cc66;">&#123;</span>
    	<span style="color: #b1b100; font-weight: bold;">var</span> oldValue:<span style="color: #6699cc;">Object</span> = <span style="color: #b1b100; font-weight: bold;">this</span>._94631196child;
        <span style="color: #b1b100; font-weight: bold;">if</span> <span style="color: #66cc66;">&#40;</span>oldValue <span style="color: #66cc66; font-weight: bold;">!</span>== <span style="color: #6699cc;">value</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#123;</span>
            <span style="color: #b1b100; font-weight: bold;">this</span>._94631196child = value;
           <span style="color: #b1b100; font-weight: bold;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100; font-weight: bold;">this</span>.<span style="color: #6699cc;">hasEventListener</span><span style="color: #66cc66;">&#40;</span>&quot;propertyChange&quot;<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
               <span style="color: #b1b100; font-weight: bold;">this</span>.<span style="color: #6699cc;">dispatchEvent</span><span style="color: #66cc66;">&#40;</span>mx.events.PropertyChangeEvent.createUpdateEvent<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100; font-weight: bold;">this</span>, &quot;child&quot;, oldValue, <span style="color: #6699cc;">value</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
        <span style="color: #66cc66;">&#125;</span>
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #FF00FF;">/*
	 * generated bindable wrapper for property property (public)
	 * - generated setter
	 * - generated getter
	 * - original public var 'property' moved to '_993141291property'
	 */</span>
&nbsp;
    <span style="color: #66cc66;">&#91;</span>Bindable<span style="color: #66cc66;">&#40;</span>event=&quot;propertyChange&quot;<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span>
    <span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">function</span> <span style="color: #b1b100; font-weight: bold;">get</span> property<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #6699cc;">Number</span>
    <span style="color: #66cc66;">&#123;</span>
        <span style="color: #b1b100; font-weight: bold;">return</span> <span style="color: #b1b100; font-weight: bold;">this</span>._993141291property;
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">function</span> <span style="color: #b1b100; font-weight: bold;">set</span> property<span style="color: #66cc66;">&#40;</span><span style="color: #6699cc;">value</span>:<span style="color: #6699cc;">Number</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #b1b100; font-weight: bold;">void</span>
    <span style="color: #66cc66;">&#123;</span>
    	<span style="color: #b1b100; font-weight: bold;">var</span> oldValue:<span style="color: #6699cc;">Object</span> = <span style="color: #b1b100; font-weight: bold;">this</span>._993141291property;
        <span style="color: #b1b100; font-weight: bold;">if</span> <span style="color: #66cc66;">&#40;</span>oldValue <span style="color: #66cc66; font-weight: bold;">!</span>== <span style="color: #6699cc;">value</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#123;</span>
            <span style="color: #b1b100; font-weight: bold;">this</span>._993141291property = value;
           <span style="color: #b1b100; font-weight: bold;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100; font-weight: bold;">this</span>.<span style="color: #6699cc;">hasEventListener</span><span style="color: #66cc66;">&#40;</span>&quot;propertyChange&quot;<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
               <span style="color: #b1b100; font-weight: bold;">this</span>.<span style="color: #6699cc;">dispatchEvent</span><span style="color: #66cc66;">&#40;</span>mx.events.PropertyChangeEvent.createUpdateEvent<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100; font-weight: bold;">this</span>, &quot;property&quot;, oldValue, <span style="color: #6699cc;">value</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
        <span style="color: #66cc66;">&#125;</span>
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span></pre></pre>
</div>
<!-- END TEMPLATE: bbcode_as3code -->Этот класс отвечает за 2 заведённых в блоке fx свойства:<br />
child и property.<br />
Ничего сверхъестественного и сложного. Просто запомните, заводя свойства в mxml - они в итоге оказываются завернутыми в геттер и сеттер с отсылкой события об изменении.<br />
<br />
<font color="Yellow">no_flex_mxml-generated.as</font><br />
<!-- BEGIN TEMPLATE: bbcode_as3code -->
<div style="margin:20px; margin-top:5px">
	<div style="margin-bottom: 3px; width: 800px;" class="smallfont"><a href="#" onclick="collapseCode(this); return false;"><img style="margin-bottom: -3px;" border="0" src="images/russian/style3/buttons/collapse_thead_collapsed.gif" alt=""></a> Код AS3:</div>
	<pre dir="ltr" class="alt2" style="
		width: 800px;
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		height: 498px;
		text-align: left;
		overflow: auto;"><pre class="actionscript3" style="font-family:monospace;"> <span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">class</span> no_flex_mxml extends <span style="color: #6699cc;">flash.display</span>.<span style="color: #6699cc;">Sprite</span> <span style="color: #66cc66;">&#123;</span>
        <span style="color: #66cc66;">&#91;</span>Bindable<span style="color: #66cc66;">&#93;</span>
        <span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #b1b100; font-weight: bold;">var</span> <span style="color: #6699cc;">child</span>:<span style="color: #6699cc;">flash.display</span>.Sprite;
&nbsp;
        <span style="color: #66cc66;">&#91;</span>Inspectable<span style="color: #66cc66;">&#93;</span>
        <span style="color: #66cc66;">&#91;</span>Bindable<span style="color: #66cc66;">&#93;</span>
        <span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #b1b100; font-weight: bold;">var</span> property:Number;
&nbsp;
        <span style="color: #FF00FF;">//  constructor (non-Flex display object)</span>
        <span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">function</span> no_flex_mxml<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
            <span style="color: #b1b100; font-weight: bold;">super</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
            _no_flex_mxml_Sprite2_i<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
            <span style="color: #FF00FF;">// events</span>
            <span style="color: #b1b100; font-weight: bold;">this</span>.<span style="color: #6699cc;">addEventListener</span><span style="color: #66cc66;">&#40;</span>&quot;addedToStage&quot;, ___no_flex_mxml_Sprite1_addedToStage<span style="color: #66cc66;">&#41;</span>;
        <span style="color: #66cc66;">&#125;</span>
&nbsp;
&nbsp;
        <span style="color: #FF00FF;">//  scripts</span>
        <span style="color: #FF00FF;">//  &lt;Script&gt;, line 11 - 17 - </span>
		<span style="color: #FF00FF;">// Это скрипт который я написал в блоке fx:Script</span>
        <span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">function</span> <span style="color: #6699cc;">init</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #b1b100; font-weight: bold;">void</span> <span style="color: #66cc66;">&#123;</span>
            <span style="color: #6699cc;">trace</span><span style="color: #66cc66;">&#40;</span>&quot;init&quot;<span style="color: #66cc66;">&#41;</span>;
            property = <span style="color: #cc66cc; font-weight:bold;">10</span>;
            <span style="color: #6699cc;">addChild</span><span style="color: #66cc66;">&#40;</span><span style="color: #6699cc;">child</span><span style="color: #66cc66;">&#41;</span>;
        <span style="color: #66cc66;">&#125;</span>
&nbsp;
        <span style="color: #FF00FF;">//	supporting function definitions for properties, events, styles, effects</span>
        <span style="color: #b1b100; font-weight: bold;">private</span> <span style="color: #6699cc; font-weight: bold;">function</span> _no_flex_mxml_Sprite2_i<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #6699cc;">flash.display</span>.<span style="color: #6699cc;">Sprite</span> <span style="color: #66cc66;">&#123;</span>
            <span style="color: #b1b100; font-weight: bold;">var</span> temp:<span style="color: #6699cc;">flash.display</span>.<span style="color: #6699cc;">Sprite</span> = <span style="color: #b1b100; font-weight: bold;">new</span> <span style="color: #6699cc;">flash.display</span>.<span style="color: #6699cc;">Sprite</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
            temp.<span style="color: #6699cc;">addEventListener</span><span style="color: #66cc66;">&#40;</span>&quot;addedToStage&quot;, __child_addedToStage<span style="color: #66cc66;">&#41;</span>;
            <span style="color: #6699cc;">child</span> = temp;
            mx.binding.BindingManager.executeBindings<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100; font-weight: bold;">this</span>, &quot;child&quot;, <span style="color: #6699cc;">child</span><span style="color: #66cc66;">&#41;</span>;
            <span style="color: #b1b100; font-weight: bold;">return</span> temp;
        <span style="color: #66cc66;">&#125;</span>
&nbsp;
&nbsp;
        <span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">function</span> __child_addedToStage<span style="color: #66cc66;">&#40;</span>event:<span style="color: #6699cc;">flash.events</span>.<span style="color: #6699cc;">Event</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #b1b100; font-weight: bold;">void</span> <span style="color: #66cc66;">&#123;</span>
            <span style="color: #6699cc;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #990000;">'child added'</span><span style="color: #66cc66;">&#41;</span>;
        <span style="color: #66cc66;">&#125;</span>
&nbsp;
        <span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">function</span> ___no_flex_mxml_Sprite1_addedToStage<span style="color: #66cc66;">&#40;</span>event:<span style="color: #6699cc;">flash.events</span>.<span style="color: #6699cc;">Event</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #b1b100; font-weight: bold;">void</span> <span style="color: #66cc66;">&#123;</span>
            <span style="color: #6699cc;">init</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
        <span style="color: #66cc66;">&#125;</span>
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span></pre></pre>
</div>
<!-- END TEMPLATE: bbcode_as3code -->Тут, надеюсь, тоже всё понятно.<br />
<br />
 ну и <br />
<font color="Yellow">no_flex_mxml-interface.as</font><br />
<!-- BEGIN TEMPLATE: bbcode_as3code -->
<div style="margin:20px; margin-top:5px">
	<div style="margin-bottom: 3px; width: 800px;" class="smallfont"><a href="#" onclick="collapseCode(this); return false;"><img style="margin-bottom: -3px;" border="0" src="images/russian/style3/buttons/collapse_thead_collapsed.gif" alt=""></a> Код AS3:</div>
	<pre dir="ltr" class="alt2" style="
		width: 800px;
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		height: 290px;
		text-align: left;
		overflow: auto;"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">class</span> no_flex_mxml extends <span style="color: #6699cc;">flash.display</span>.<span style="color: #6699cc;">Sprite</span>
    <span style="color: #66cc66;">&#123;</span>
        <span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">function</span> no_flex_mxml<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><span style="color: #66cc66;">&#125;</span>
&nbsp;
        <span style="color: #66cc66;">&#91;</span>Bindable<span style="color: #66cc66;">&#93;</span>
        <span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #b1b100; font-weight: bold;">var</span> property : Number;
        <span style="color: #66cc66;">&#91;</span>Bindable<span style="color: #66cc66;">&#93;</span>
        <span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #b1b100; font-weight: bold;">var</span> <span style="color: #6699cc;">child</span> : <span style="color: #6699cc;">flash.display</span>.Sprite;
&nbsp;
        mx_internal <span style="color: #b1b100; font-weight: bold;">var</span> _bindings : Array;
        mx_internal <span style="color: #b1b100; font-weight: bold;">var</span> _watchers : Array;
        mx_internal <span style="color: #b1b100; font-weight: bold;">var</span> _bindingsByDestination : Object;
        mx_internal <span style="color: #b1b100; font-weight: bold;">var</span> _bindingsBeginWithWord : Object;
&nbsp;
        include &quot;C:/dev/workspace/no_flex_mxml/src/no_flex_mxml.mxml:<span style="color: #cc66cc; font-weight:bold;">11</span>,<span style="color: #cc66cc; font-weight:bold;">17</span>&quot;;
&nbsp;
    <span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#125;</span></pre></pre>
</div>
<!-- END TEMPLATE: bbcode_as3code -->В итоге в дебаг режиме флэшка весит 7.13 кБ.<br />
Много это или мало - решать вам. <br />
Главное, что можно понять из размера - флексфрэймворка здесь нет)<br />
<br />
Специально для этой статьи я  завёл публичный репозиторий: <a href="https://bitbucket.org/k0t0vich/no_flex_mxml" target="_blank">https://bitbucket.org/k0t0vich/no_flex_mxml</a><br />
пошагово - смотрите коммиты.</div>


<!-- END TEMPLATE: blog_entry_external -->]]></content:encoded>
			<dc:creator>Котяра</dc:creator>
			<guid isPermaLink="true">http://www.flasher.ru/forum/blog.php?b=557</guid>
		</item>
		<item>
			<title>Инверсия контроля</title>
			<link>http://www.flasher.ru/forum/blog.php?b=555</link>
			<pubDate>Fri, 13 Apr 2012 22:12:14 GMT</pubDate>
			<description>Инверсия контроля (Inversion of Control, IoC) - это *важный принцип* ООП 
 
Подождите, какой контроль? Контроль чего нужно инвертировать? 
Имеется в виду контроль над созданием зависимостей. 
 
Представим себе автомобиль,  
без мотора он не сможет работать, потому нужен мотор. 
public class Car{  
...</description>
			<content:encoded><![CDATA[<!-- BEGIN TEMPLATE: blog_entry_external -->
<div>Инверсия контроля (Inversion of Control, IoC) - это <font color="Orange"><b>важный принцип</b></font> ООП<br />
<br />
Подождите, какой контроль? Контроль чего нужно инвертировать?<br />
Имеется в виду контроль над созданием зависимостей.<br />
<br />
Представим себе автомобиль, <br />
без мотора он не сможет работать, потому нужен мотор.<br />
<!-- BEGIN TEMPLATE: bbcode_as3code -->
<div style="margin:20px; margin-top:5px">
	<div style="margin-bottom: 3px; width: 800px;" class="smallfont"><a href="#" onclick="collapseCode(this); return false;"><img style="margin-bottom: -3px;" border="0" src="images/russian/style3/buttons/collapse_thead_collapsed.gif" alt=""></a> Код AS3:</div>
	<pre dir="ltr" class="alt2" style="
		width: 800px;
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		height: 66px;
		text-align: left;
		overflow: auto;"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">class</span> Car<span style="color: #66cc66;">&#123;</span> 
    <span style="color: #b1b100; font-weight: bold;">private</span> <span style="color: #b1b100; font-weight: bold;">var</span> engine:IEngine = <span style="color: #b1b100; font-weight: bold;">new</span> Engine<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>; 
<span style="color: #66cc66;">&#125;</span></pre></pre>
</div>
<!-- END TEMPLATE: bbcode_as3code -->С первого взгляда выглядит как превосходный код. Но принцип инверсии тут не соблюдается.<br />
Дело в том, что автомобиль должен ездить и перевозить грузы, а не создавать моторы и другие запчасти.<br />
Создавая себе мотор, автомобиль занимается тем, для чего он не предназначен, и становится фабрикой на колёсах.<br />
<br />
<img src="http://www.flasher.ru/forum/blog_attachment.php?attachmentid=264&amp;stc=1&amp;d=1334400909" border="0" alt="" /><br />
<br />
Легко себе представить, во что превратится код этого класса, когда окажется, что автомобиль не может хорошо работать без колёс, руля, магнитолы с DVD, и большого количеств других важных частей.<br />
<br />
Согласно принципу инверсии контроля, автомобиль не должен думать о создании зависимостей, вместо этого, в приложении должен быть механизм который позаботится об этом и позволит автомобилю делать то для чего он предназначен.<br />
<br />
Есть и вторая проблема с этим автомобилем.<br />
Если вдруг потом понадобится заменить паровой двигатель на бензиновый, то придётся разбирать машину (рефакторить) и налаживать в ней производство нового типа двигателя, и так с каждой маркой машин.<br />
А если двигатели будет производить только моторный завод, то производство новых моторов достаточно будет наладить только один раз.<br />
<br />
Теперь, поняв в чём вред отсутствия инверсии контроля, <br />
можно перечислить <b><font color="Orange">выгоды</font></b> от её наличия:<br />
<ol style="list-style-type: decimal"><li>позволяет модулю сфокусироваться на своей задаче<br />
(не быть фабрикой на колёсах)</li>
<li>ослабляется связанность классов между собой <br />
(мотор больше не неотъемлемая часть автомобиля)</li>
<li>обеспечивает простоту замены модулей <br />
(вместо одного мотора всегда можно подсунуть другой мотор)</li>
<li>упрощает тестирование и ремонт <br />
(вместо мотора всегда можно подсунуть пустышку)</li>
</ol><br />
Реализовать этот принцип можно разными способами<ul><li>Внедрение зависимости (Dependency injection) <ul><li>Через конструктор (Constructor injection)</li>
<li>Через сеттер (Setter injection)</li>
<li>Через интерфейс (Interface injection)</li>
</ul></li>
<li>Патерн фабрика (Factory pattern)</li>
<li>Service locator (Service locator pattern)</li>
<li>IoC контейнер(Ioc-container)</li>
</ul><br />
Тут уже гугль вам в помощь.<br />
<br />
<br />
Приведу только пример с использованием <a href="https://github.com/tschneidereit/SwiftSuspenders" target="_blank">SwiftSuspenders </a><br />
(который используется в RobotLegs)<br />
<br />
<!-- BEGIN TEMPLATE: bbcode_as3code -->
<div style="margin:20px; margin-top:5px">
	<div style="margin-bottom: 3px; width: 800px;" class="smallfont"><a href="#" onclick="collapseCode(this); return false;"><img style="margin-bottom: -3px;" border="0" src="images/russian/style3/buttons/collapse_thead_collapsed.gif" alt=""></a> Код AS3:</div>
	<pre dir="ltr" class="alt2" style="
		width: 800px;
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		height: 498px;
		text-align: left;
		overflow: auto;"><pre class="actionscript3" style="font-family:monospace;">======= IEngine.<span style="color: #b1b100; font-weight: bold;">as</span> ========
<span style="color: #b1b100; font-weight: bold;">public</span> interface IEngine <span style="color: #66cc66;">&#123;</span><span style="color: #66cc66;">&#125;</span>
&nbsp;
======= Engine.<span style="color: #b1b100; font-weight: bold;">as</span> ========
<span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">class</span> Engine implements IEngine <span style="color: #66cc66;">&#123;</span>
	<span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">function</span> Engine<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
		<span style="color: #6699cc;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #990000;">'engine constructed'</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span>
&nbsp;
======= Car.<span style="color: #b1b100; font-weight: bold;">as</span> ========
<span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">class</span> Car <span style="color: #66cc66;">&#123;</span>
&nbsp;
	<span style="color: #66cc66;">&#91;</span>Inject<span style="color: #66cc66;">&#93;</span>
	<span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #b1b100; font-weight: bold;">var</span> engine:IEngine;
&nbsp;
	<span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">function</span> <span style="color: #6699cc;">start</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #b1b100; font-weight: bold;">void</span><span style="color: #66cc66;">&#123;</span>
		<span style="color: #b1b100; font-weight: bold;">if</span><span style="color: #66cc66;">&#40;</span>engine<span style="color: #66cc66;">&#41;</span> <span style="color: #6699cc;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #990000;">'it works'</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span>
&nbsp;
======= Main.<span style="color: #b1b100; font-weight: bold;">as</span> ========
<span style="color: #b1b100; font-weight: bold;">import</span> <span style="color: #6699cc;">flash.display</span>.Sprite;
<span style="color: #b1b100; font-weight: bold;">import</span> org.swiftsuspenders.Injector;
&nbsp;
<span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">class</span> Main extends <span style="color: #6699cc;">Sprite</span><span style="color: #66cc66;">&#123;</span>
	<span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">function</span> Main<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span>
		<span style="color: #b1b100; font-weight: bold;">var</span> car:Car = <span style="color: #b1b100; font-weight: bold;">new</span> Car<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #b1b100; font-weight: bold;">var</span> injector:Injector = <span style="color: #b1b100; font-weight: bold;">new</span> Injector<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		injector.<span style="color: #6699cc;">map</span><span style="color: #66cc66;">&#40;</span>IEngine<span style="color: #66cc66;">&#41;</span>.toType<span style="color: #66cc66;">&#40;</span>Engine<span style="color: #66cc66;">&#41;</span>;
		injector.injectInto<span style="color: #66cc66;">&#40;</span>car<span style="color: #66cc66;">&#41;</span>;  <span style="color: #FF00FF;">// engine constructed</span>
		car.<span style="color: #6699cc;">start</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;  <span style="color: #FF00FF;">//it works</span>
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></pre>
</div>
<!-- END TEMPLATE: bbcode_as3code --><br />
Полезная ссылка:<br />
перевод статьи Мартина Фаулера <a href="http://yugeon-dev.blogspot.com/2010/07/inversion-of-control-containers-and_21.html" target="_blank">&quot;Inversion of Control Containers and the Dependency Injection pattern&quot;</a></div>


<!-- END TEMPLATE: blog_entry_external -->]]></content:encoded>
			<dc:creator>artcraft</dc:creator>
			<guid isPermaLink="true">http://www.flasher.ru/forum/blog.php?b=555</guid>
		</item>
		<item>
			<title>MXML, Биндинг и другие страшные для ТРУЪ аскриптера вещи. Вводная часть..</title>
			<link>http://www.flasher.ru/forum/blog.php?b=554</link>
			<pubDate>Thu, 12 Apr 2012 22:21:39 GMT</pubDate>
			<description>Для начала вводная: 
 
---Цитата--- 
1)Flex/FlashBuilder - это не флекс 
2)flexSDK - это не флекс 
и даже: 
3)mxml - это не флекс 
4)binding - это не флекс. 
 
флекс - это некая библиотека-фреймворк + прекомпилятор</description>
			<content:encoded><![CDATA[<!-- BEGIN TEMPLATE: blog_entry_external -->
<div>Для начала вводная:<br />
<!-- BEGIN TEMPLATE: bbcode_quote -->
<div style="margin:20px; margin-top:5px; ">
	<div class="smallfont" style="margin-bottom:2px">Цитата:</div>
	<table cellpadding="6" cellspacing="0" border="0" width="100%">
	<tr>
		<td class="alt2" style="border:1px inset">
			
				1)Flex/FlashBuilder - это не флекс<br />
2)flexSDK - это не флекс<br />
и даже:<br />
3)mxml - это не флекс<br />
4)binding - это не флекс.<br />
<br />
флекс - это некая библиотека-фреймворк + прекомпилятор<br />
расширяющая AS3 (впрочем как любая библиотека)<br />
расширяет она многое, от гуи до сервисов работы с LiveCycle итп.<br />
<br />
Если какие то другие библиотеки используют флекс, то для того чтобы использовать эти библиотеки нужно делать flex проект.
			
		</td>
	</tr>
	</table>
</div>
<!-- END TEMPLATE: bbcode_quote -->Вот по поводу 3 и 4 пункта у многих возникают вопросы.<br />
Темой нашего сегодняшнего сабантуйчика и будет - как же мне использовать офигенские штуки в виде mxml и биндинга в труъас проекте.<br />
<br />
<font size="1">сноска: труъас  - это только что придуманый мною мем для транслитерации pure as (чисто экшинскрипт, без всяких ваших там флексов)</font><br />
<br />
Итак.<br />
Моя идея - нарисовать небольшой проект основанный на MVC парадигме средствами чисто-чистого as3<br />
и средствами чистого ас, но с использованием mxml и биндинга.<br />
Также мы затронем парадигму PM (MVVM) и как она обычно реализуется на данный момент в нашем экгибиционистстком мире.<br />
<br />
Для затравки просто куча ссылок <br />
<br />
про паттерны:<br />
<a href="http://outcoldman.ru/ru/blog/show/184" target="_blank">http://outcoldman.ru/ru/blog/show/184</a><br />
<a href="http://rsdn.ru/article/patterns/ModelViewPresenter.xml" target="_blank">http://rsdn.ru/article/patterns/ModelViewPresenter.xml</a><br />
<a href="http://msdn.microsoft.com/ru-ru/magazine/dd419663.aspx" target="_blank">http://msdn.microsoft.com/ru-ru/magazine/dd419663.aspx</a><br />
<a href="http://www.martinfowler.com/eaaDev/P...tionModel.html" target="_blank">http://www.martinfowler.com/eaaDev/P...tionModel.html</a><br />
<a href="http://blogs.adobe.com/paulw/archive...tion_pa_3.html" target="_blank">http://blogs.adobe.com/paulw/archive...tion_pa_3.html</a><br />
<a href="http://examples.pmwilliams.co.uk/ado...tionModel.html" target="_blank">http://examples.pmwilliams.co.uk/ado...tionModel.html</a> (сырцы по правой кнопке)<br />
<br />
про биндинг:<br />
<a href="http://blog.diestro.ru/binding-v-actionscript-1/" target="_blank">http://blog.diestro.ru/binding-v-actionscript-1/</a><br />
<a href="http://blog.diestro.ru/binding-v-actionscript-2/" target="_blank">http://blog.diestro.ru/binding-v-actionscript-2/</a><br />
<a href="http://blog.diestro.ru/binding-v-actionscript-3/" target="_blank">http://blog.diestro.ru/binding-v-actionscript-3/</a><br />
<a href="http://compile4fun.wordpress.com/2010/10/28/binding/" target="_blank">http://compile4fun.wordpress.com/2010/10/28/binding/</a><br />
<a href="http://habrahabr.ru/post/43599/" target="_blank">http://habrahabr.ru/post/43599/</a><br />
<br />
Чего жду в комментах: проявление интерса к этой теме.</div>


<!-- END TEMPLATE: blog_entry_external -->]]></content:encoded>
			<dc:creator>Котяра</dc:creator>
			<guid isPermaLink="true">http://www.flasher.ru/forum/blog.php?b=554</guid>
		</item>
		<item>
			<title>Что такое tarball и чем его пакуют</title>
			<link>http://www.flasher.ru/forum/blog.php?b=553</link>
			<pubDate>Tue, 10 Apr 2012 21:21:15 GMT</pubDate>
			<description>Эта тема для меня стала откровением, при чем совсем недавно, и при интересных обстоятельствах, о которых я сейчас же вам расскажу. 
 
Началось все с того, что в этом семестре я решил записаться на курс программирования на Java. Мне этот курс необходим для того, чтобы я мог записаться на теорию...</description>
			<content:encoded><![CDATA[<!-- BEGIN TEMPLATE: blog_entry_external -->
<div>Эта тема для меня стала откровением, при чем совсем недавно, и при интересных обстоятельствах, о которых я сейчас же вам расскажу.<br />
<br />
Началось все с того, что в этом семестре я решил записаться на курс программирования на Java. Мне этот курс необходим для того, чтобы я мог записаться на теорию вычислений и еще несколько других математических курсов косвенно связанных с программированием. Да и вообще, я думал немного средний балл повысить, тема как-никак знакомая.<br />
<br />
Неделю назад сдал я первый экзамен. Вернее, думал, что сдал. Экзамены мы отправляем по почте преподавателям, в лучшем случае по электронной... Но преподаватель молодой, с интернетом &quot;на ты&quot;. Пару дней после отправки экзамена, получаю письмо от преподавателя, где он настоятельно требует, чтобы файлы были упакованы в ZIP архив. Файлы были упакованы в TAR.GZ (он же известен как TGZ). И тут я понял, что make файл я зря в архив положил...<br />
<br />
Я заинтересовался, почему же так часто линуксовые архивы используют TAR.GZ, а виндовские - ZIP. Вернее, не так, заинтересовался я разницей между форматами, т.как никогда не придавал особого значения: как-то всегда думалось, что ну да не может быть большой разницы, ничего же сверхестесственного не придумали. А если бы придумали, то тут же бы другие спионерили.<br />
Подчитав немного литературы обнаружилась интересная вещь. Алгоритм сжатия у обоих - практически один и тот же, реализации разные, но принцип один. А вот алгоритм архивации (сейчас объясню) - разный.<br />
<br />
<b>Сжатие</b> - это, в моем антинаучном пересказе, автоматический поиск излишеств. Т.е. представьте себе, что у вас есть группа: {a,b,bc,bd,d} - вы в ней можете найти повторяющийся элемент и переписать группу таким образом, чтобы на запись повторяющегося элемента тратилось минимум места; предполагая, что на каждый знак отводится по 3 бита (всего шесть знаков), можно потратить всего 1 бит (0) на &quot;b&quot;, а остальные знаки начинать с бита 1. Т.о на запись &quot;d&quot; (второй по популярности символ) понадобилось бы 10 и т.д.<br />
<br />
<i>Для (по)читателей википедии: <a href="http://en.wikipedia.org/wiki/Redundancy_%28information_theory%29" target="_blank">http://en.wikipedia.org/wiki/Redunda...tion_theory%29</a><br />
<a href="http://en.wikipedia.org/wiki/Prefix_code" target="_blank">http://en.wikipedia.org/wiki/Prefix_code</a> (пример выше)</i><br />
<br />
<b>Архивация</b> - это совсем другой процесс. Опять же, в моем антинаучном пересказе - это процесс склейки множества файлов в один, для того, чтобы их куда-нибудь всех вместе отправить.<br />
<br />
Как вы видите из примера выше, для того, чтобы исходное значение можно было восстановить из архива - нужно где-то хранить таблицу &quot;перевода&quot; сокращенных символов в исходные. Так же не сложно заметить, что чем дольше текст, тем выше вероятность того, что повторений, в среднем, будет больше.<br />
<br />
И вот он момент истины! Типичные для Линукса архивы создаются двумя утилитами - архиватором (tar) и упаковщиком (gzip, bzip, bzip2 и т.д.). Т.е. сначала создается один большой файл, а потом пакуется. ZIP - это одновременно и упаковщик и архиватор, но действует он по-другому: сначала сжимает каждый файл, а потом - &quot;склеивает&quot;.<br />
Так как у меня выдался повод поэксперементировать - попробовал на нескольких проектах. Группы текстовых файлов в пределах 100-1000 строк каждый с большой вероятностю повторения тех же слов во всех из них (так это же исходний код!) при упаковке в tar.gz получается примерно в два раза меньше, чем в zip, с завидным постоянством!<br />
<br />
<i><font color="Silver">Подведя итоги:<br />
<br />
Получил 0 баллов из 100,<br />
Узнал что-то новое.</font></i><br />
<br />
Заинтересовавшимся: <a href="http://gnuwin32.sourceforge.net/packages/gtar.htm" target="_blank">tar для Windows</a>, у остальных он уже есть ;)</div>


<!-- END TEMPLATE: blog_entry_external -->]]></content:encoded>
			<dc:creator>wvxvw</dc:creator>
			<guid isPermaLink="true">http://www.flasher.ru/forum/blog.php?b=553</guid>
		</item>
		<item>
			<title>Пакет для растрирования анимаций</title>
			<link>http://www.flasher.ru/forum/blog.php?b=552</link>
			<pubDate>Sat, 07 Apr 2012 10:00:57 GMT</pubDate>
			<description>Когда писал про текстуропакер в комментариях кто-то просил выложить. Ну я его вот немного подправил, и выкладываю. 
 
UPD: Обнаружился первоисточник, имя которого я уже давно потерял, так как от него по большому счету осталась только идея. Но всё же отдам дань, первоначально(почти год назад) это...</description>
			<content:encoded><![CDATA[<!-- BEGIN TEMPLATE: blog_entry_external -->
<div>Когда писал про текстуропакер в комментариях кто-то просил выложить. Ну я его вот немного подправил, и выкладываю.<br />
<br />
UPD: Обнаружился первоисточник, имя которого я уже давно потерял, так как от него по большому счету осталась только идея. Но всё же отдам дань, первоначально(почти год назад) это был пакет от <a href="http://blog.touchmypixel.com/2008/04/as3-bitmap-cached-animations/" target="_blank">touchmypixel</a>. Потом раза четыре переписывался. Так-то.<br />
<br />
1. Рисуем анимацию.<br />
2. Скармливаем имя класса анимации этому фреймворчику<br />
3. получаем анимацию построенную на битмапах.<br />
<br />
Бонусы:<br />
+ производительность по сравнению с проигрыванием обычных анимаций раза этак в три выше. (Тесты делал давно, повторять неохота, кто не верит пусть сам проверяет:) )<br />
+ пакетное кеширование из XML списка.<br />
+ при кешировании сразу указывается скейл с которым нужно закешировать. Бонус при работе с вектором очевиден - можно не таскать за собой анимацию партикля размером 100х100 если нам нужен 20х20. В библиотеке он будет сразу 20х20. Но и минус в том что анимации идентифицируются только по имени, так что если вам одна и та же анимация нужна с разными скейлами - можете приложить усилия и прикрутить что-то свое для этого дела.<br />
<br />
Минусы:<br />
- реализован свой класс Animation() - Т.е. вместо мувиклипа придется юзать его. Все необходимые функции мувиклипа передраны так что неудобств возникнуть не должно, но всё-таки хотелось бы общаться с чем-то более стандартным. Оч долго собирался сделать что-то типа extend MovieClip со всеми вытекающими, но руки так и не дошли. На текущий момент меня устраивает Animation<br />
<br />
Пример использования:<br />
<!-- BEGIN TEMPLATE: bbcode_as3code -->
<div style="margin:20px; margin-top:5px">
	<div style="margin-bottom: 3px; width: 800px;" class="smallfont"><a href="#" onclick="collapseCode(this); return false;"><img style="margin-bottom: -3px;" border="0" src="images/russian/style3/buttons/collapse_thead_collapsed.gif" alt=""></a> Код AS3:</div>
	<pre dir="ltr" class="alt2" style="
		width: 800px;
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		height: 146px;
		text-align: left;
		overflow: auto;"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #b1b100; font-weight: bold;">var</span> animationCache:AnimationCache = AnimationCache.getInstance<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
animationCache.addToBulkCache<span style="color: #66cc66;">&#40;</span><span style="color: #6699cc;">XML</span><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100; font-weight: bold;">new</span> animationList<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #FF00FF;">//*****************************************</span>
<span style="color: #b1b100; font-weight: bold;">var</span> anim:Animation = animationCache.getAnimation<span style="color: #66cc66;">&#40;</span>&quot;animName&quot;<span style="color: #66cc66;">&#41;</span>;
anim.<span style="color: #6699cc;">addEventListener</span><span style="color: #66cc66;">&#40;</span><span style="color: #6699cc;">Event</span>.<span style="color: #6699cc;">COMPLETE</span>, onDied<span style="color: #66cc66;">&#41;</span>;
<span style="color: #b1b100; font-weight: bold;">this</span>.<span style="color: #6699cc;">addChild</span><span style="color: #66cc66;">&#40;</span>anim<span style="color: #66cc66;">&#41;</span>;
anim.gotoAndPlayRandomFrame<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;</pre></pre>
</div>
<!-- END TEMPLATE: bbcode_as3code -->Ниже собственно классы<br />
<br />
Сама фабрика:<br />
<!-- BEGIN TEMPLATE: bbcode_as3code -->
<div style="margin:20px; margin-top:5px">
	<div style="margin-bottom: 3px; width: 800px;" class="smallfont"><a href="#" onclick="collapseCode(this); return false;"><img style="margin-bottom: -3px;" border="0" src="images/russian/style3/buttons/collapse_thead_collapsed.gif" alt=""></a> Код AS3:</div>
	<pre dir="ltr" class="alt2" style="
		width: 800px;
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		height: 498px;
		text-align: left;
		overflow: auto;"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #6699cc; font-weight: bold;">package</span> com.earwig.animationcache
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #b1b100; font-weight: bold;">import</span> <span style="color: #6699cc;">flash.events</span>.EventDispatcher;
	<span style="color: #b1b100; font-weight: bold;">import</span> <span style="color: #6699cc;">flash.utils</span>.setTimeout;
&nbsp;
	<span style="color: #FF00FF;">/**
	 * Класс кеширует векторные анимации в растр.
	 */</span>
	<span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">class</span> AnimationCache extends <span style="color: #6699cc;">EventDispatcher</span>
	<span style="color: #66cc66;">&#123;</span>
		<span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #b1b100; font-weight: bold;">var</span> replaceExisting:<span style="color: #6699cc;">Boolean</span> = false;
&nbsp;
		<span style="color: #b1b100; font-weight: bold;">private</span> <span style="color: #b1b100; font-weight: bold;">var</span> animations:<span style="color: #6699cc;">Object</span> = <span style="color: #66cc66;">&#123;</span><span style="color: #66cc66;">&#125;</span>;
&nbsp;
		<span style="color: #b1b100; font-weight: bold;">private</span> static <span style="color: #b1b100; font-weight: bold;">var</span> instance:AnimationCache;
&nbsp;
		<span style="color: #FF00FF;">//=====================================================================</span>
		<span style="color: #FF00FF;">// CONSTRUCTOR</span>
		<span style="color: #FF00FF;">//=====================================================================</span>
		<span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">function</span> AnimationCache<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> 
		<span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100; font-weight: bold;">if</span><span style="color: #66cc66;">&#40;</span>instance<span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100; font-weight: bold;">throw</span><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100; font-weight: bold;">new</span> <span style="color: #6699cc;">Error</span><span style="color: #66cc66;">&#40;</span>&quot;AnimationCache <span style="color: #b1b100; font-weight: bold;">is</span> a Singleton. Dont Instantiate<span style="color: #66cc66; font-weight: bold;">!</span>&quot;<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
			instance = this;
		<span style="color: #66cc66;">&#125;</span>	
&nbsp;
		<span style="color: #FF00FF;">//=====================================================================</span>
		<span style="color: #FF00FF;">// PUBLIC</span>
		<span style="color: #FF00FF;">//=====================================================================</span>
		<span style="color: #FF00FF;">/**
		 * Выдает инстанс библиотеки
		 * @return
		 */</span>
		<span style="color: #b1b100; font-weight: bold;">public</span> static <span style="color: #6699cc; font-weight: bold;">function</span> getInstance<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:AnimationCache
		<span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100; font-weight: bold;">return</span> instance <span style="color: #66cc66; font-weight: bold;">?</span> instance : <span style="color: #b1b100; font-weight: bold;">new</span> AnimationCache<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #FF00FF;">/**
		 * Кеширует анимацию с заданным именем класса мувика и скейлом
		 * (растровые тайлы будут уже указанного размера)
		 * @param	id
		 * @param	scaleX
		 * @param	scaleY
		 * @return
		 */</span>
		<span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">function</span> cacheAnimation<span style="color: #66cc66;">&#40;</span>id:<span style="color: #6699cc;">String</span>, <span style="color: #6699cc;">scaleX</span>:<span style="color: #6699cc;">Number</span>, <span style="color: #6699cc;">scaleY</span>:<span style="color: #6699cc;">Number</span><span style="color: #66cc66;">&#41;</span>:Animation
		<span style="color: #66cc66;">&#123;</span>
			<span style="color: #FF00FF;">// TODO придумать что-то чтобы можно было кешировать одну и ту же анимацию с разными скейлами</span>
			<span style="color: #b1b100; font-weight: bold;">var</span> animation:Animation
			<span style="color: #b1b100; font-weight: bold;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66; font-weight: bold;">!</span>animations<span style="color: #66cc66;">&#91;</span>id<span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66; font-weight: bold;">||</span> replaceExisting<span style="color: #66cc66;">&#41;</span>
			<span style="color: #66cc66;">&#123;</span>
				animation = <span style="color: #b1b100; font-weight: bold;">new</span> Animation<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
				animation.buildCacheFromLibrary<span style="color: #66cc66;">&#40;</span>id, <span style="color: #6699cc;">scaleX</span>, <span style="color: #6699cc;">scaleY</span><span style="color: #66cc66;">&#41;</span>;
				animations<span style="color: #66cc66;">&#91;</span>id<span style="color: #66cc66;">&#93;</span> = animation;
			<span style="color: #66cc66;">&#125;</span> 
			<span style="color: #b1b100; font-weight: bold;">else</span> 
			<span style="color: #66cc66;">&#123;</span>
				animation = animations<span style="color: #66cc66;">&#91;</span>id<span style="color: #66cc66;">&#93;</span>
			<span style="color: #66cc66;">&#125;</span>
&nbsp;
			<span style="color: #b1b100; font-weight: bold;">return</span> animation;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #FF00FF;">/**
		 * Выдает копию анимации из библиотеки с указанным именем
		 * @param	id
		 * @return
		 */</span>
		<span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">function</span> getAnimation<span style="color: #66cc66;">&#40;</span>id:<span style="color: #6699cc;">String</span><span style="color: #66cc66;">&#41;</span>:Animation
		<span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100; font-weight: bold;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66; font-weight: bold;">!</span>animations<span style="color: #66cc66;">&#91;</span>id<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span> 
			<span style="color: #66cc66;">&#123;</span>
				<span style="color: #6699cc;">trace</span><span style="color: #66cc66;">&#40;</span>&quot;MISSING ANIMATION :&quot;+ id<span style="color: #66cc66;">&#41;</span>;
				<span style="color: #b1b100; font-weight: bold;">return</span> null;
			<span style="color: #66cc66;">&#125;</span>
&nbsp;
			<span style="color: #b1b100; font-weight: bold;">var</span> animation:Animation = <span style="color: #b1b100; font-weight: bold;">new</span> Animation<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
			animation.frames = animations<span style="color: #66cc66;">&#91;</span>id<span style="color: #66cc66;">&#93;</span>.frames;
			animation.clip = animations<span style="color: #66cc66;">&#91;</span>id<span style="color: #66cc66;">&#93;</span>.clip;
			animation.<span style="color: #6699cc;">gotoAndPlay</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc; font-weight:bold;">1</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
			<span style="color: #b1b100; font-weight: bold;">return</span> animation;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #FF00FF;">/**
		 * Кеширует список анимаций пакетом
		 * @param	list список анимаций в формате XML. 
		 * 	&lt;data&gt;
		 * 		&lt;anim name=&quot;className&quot; scaleX=&quot;0.5&quot; scaleY=&quot;0.5&quot; /&gt;
		 * 	&lt;/data&gt;
		 */</span>
		<span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">function</span> addToBulkCache<span style="color: #66cc66;">&#40;</span>list:<span style="color: #6699cc;">XML</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #b1b100; font-weight: bold;">void</span>
		<span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100; font-weight: bold;">for</span> <span style="color: #b1b100; font-weight: bold;">each</span><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100; font-weight: bold;">var</span> anim:<span style="color: #6699cc;">XML</span> <span style="color: #b1b100; font-weight: bold;">in</span> list.anim<span style="color: #66cc66;">&#41;</span>
			<span style="color: #66cc66;">&#123;</span>
				cacheAnimation<span style="color: #66cc66;">&#40;</span>anim.@<span style="color: #6699cc;">name</span>, <span style="color: #6699cc;">parseFloat</span><span style="color: #66cc66;">&#40;</span>anim.@<span style="color: #6699cc;">scaleX</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66; font-weight: bold;">||</span> <span style="color: #cc66cc; font-weight:bold;">1</span>, <span style="color: #6699cc;">parseFloat</span><span style="color: #66cc66;">&#40;</span>anim.@<span style="color: #6699cc;">scaleY</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66; font-weight: bold;">||</span> <span style="color: #cc66cc; font-weight:bold;">1</span><span style="color: #66cc66;">&#41;</span>;
				<span style="color: #FF00FF;">//TODO добавить диспатчи событий о прогрессе при групповой загрузке</span>
			<span style="color: #66cc66;">&#125;</span>
		<span style="color: #66cc66;">&#125;</span>
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></pre>
</div>
<!-- END TEMPLATE: bbcode_as3code -->Класс анимации:<br />
<!-- BEGIN TEMPLATE: bbcode_as3code -->
<div style="margin:20px; margin-top:5px">
	<div style="margin-bottom: 3px; width: 800px;" class="smallfont"><a href="#" onclick="collapseCode(this); return false;"><img style="margin-bottom: -3px;" border="0" src="images/russian/style3/buttons/collapse_thead_collapsed.gif" alt=""></a> Код AS3:</div>
	<pre dir="ltr" class="alt2" style="
		width: 800px;
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		height: 498px;
		text-align: left;
		overflow: auto;"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #6699cc; font-weight: bold;">package</span> com.earwig.animationcache 
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #b1b100; font-weight: bold;">import</span> <span style="color: #6699cc;">flash.display</span>.Bitmap;
	<span style="color: #b1b100; font-weight: bold;">import</span> <span style="color: #6699cc;">flash.display</span>.BitmapData;
	<span style="color: #b1b100; font-weight: bold;">import</span> <span style="color: #6699cc;">flash.display</span>.MovieClip;
	<span style="color: #b1b100; font-weight: bold;">import</span> <span style="color: #6699cc;">flash.display</span>.Sprite;
	<span style="color: #b1b100; font-weight: bold;">import</span> <span style="color: #6699cc;">flash.events</span>.Event;
	<span style="color: #b1b100; font-weight: bold;">import</span> <span style="color: #6699cc;">flash.geom</span>.Matrix;
	<span style="color: #b1b100; font-weight: bold;">import</span> <span style="color: #6699cc;">flash.geom</span>.Rectangle;
	<span style="color: #b1b100; font-weight: bold;">import</span> <span style="color: #6699cc;">flash.utils</span>.getDefinitionByName;
&nbsp;
	<span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">class</span> Animation extends <span style="color: #6699cc;">Sprite</span>
	<span style="color: #66cc66;">&#123;</span>
		<span style="color: #b1b100; font-weight: bold;">private</span> <span style="color: #b1b100; font-weight: bold;">var</span> _bitmap:Bitmap;
		<span style="color: #b1b100; font-weight: bold;">private</span> <span style="color: #b1b100; font-weight: bold;">var</span> _clip:MovieClip;
		<span style="color: #b1b100; font-weight: bold;">private</span> <span style="color: #b1b100; font-weight: bold;">var</span> _frames:Vector.&lt;AnimationFrame&gt;;
		<span style="color: #b1b100; font-weight: bold;">private</span> <span style="color: #b1b100; font-weight: bold;">var</span> _currentFrame:<span style="color: #6699cc;">Number</span> = <span style="color: #cc66cc; font-weight:bold;">1</span>;
		<span style="color: #b1b100; font-weight: bold;">private</span> <span style="color: #b1b100; font-weight: bold;">var</span> _playing:<span style="color: #6699cc;">Boolean</span> = false;
&nbsp;
		<span style="color: #b1b100; font-weight: bold;">private</span> <span style="color: #b1b100; font-weight: bold;">var</span> _id:String;
		<span style="color: #b1b100; font-weight: bold;">private</span> <span style="color: #b1b100; font-weight: bold;">var</span> _scaleX:Number;
		<span style="color: #b1b100; font-weight: bold;">private</span> <span style="color: #b1b100; font-weight: bold;">var</span> _scaleY:Number;
&nbsp;
		<span style="color: #FF00FF;">//=====================================================================</span>
		<span style="color: #FF00FF;">// CONSTRUCTOR</span>
		<span style="color: #FF00FF;">//=====================================================================</span>
		<span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">function</span> Animation<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> 
		<span style="color: #66cc66;">&#123;</span>
			_bitmap = <span style="color: #b1b100; font-weight: bold;">new</span> <span style="color: #6699cc;">Bitmap</span><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100; font-weight: bold;">null</span>, &quot;auto&quot;, <span style="color: #b1b100; font-weight: bold;">true</span><span style="color: #66cc66;">&#41;</span>;
			_bitmap.<span style="color: #6699cc;">smoothing</span> = true;
			<span style="color: #6699cc;">addChild</span><span style="color: #66cc66;">&#40;</span>_bitmap<span style="color: #66cc66;">&#41;</span>;
			_frames = <span style="color: #b1b100; font-weight: bold;">new</span> Vector.&lt;AnimationFrame&gt;<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #FF00FF;">//=====================================================================</span>
		<span style="color: #FF00FF;">// CONSTRUCTOR</span>
		<span style="color: #FF00FF;">//=====================================================================</span>
		<span style="color: #FF00FF;">/**
		 * Делает анимаци из класса загруженной флешки
		 * @param	params
		 */</span>
		<span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">function</span> buildCacheFromLibrary<span style="color: #66cc66;">&#40;</span><span style="color: #6699cc;">name</span>:<span style="color: #6699cc;">String</span> = &quot;&quot;, <span style="color: #6699cc;">scaleX</span>:<span style="color: #6699cc;">Number</span> = <span style="color: #cc66cc; font-weight:bold;">1</span>, <span style="color: #6699cc;">scaleY</span>:<span style="color: #6699cc;">Number</span> = <span style="color: #cc66cc; font-weight:bold;">1</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #b1b100; font-weight: bold;">void</span>
		<span style="color: #66cc66;">&#123;</span>
			_id = name;
			_scaleX = scaleX;
			_scaleY = scaleY;
&nbsp;
			_clip = <span style="color: #b1b100; font-weight: bold;">new</span> <span style="color: #66cc66;">&#40;</span><span style="color: #6699cc;">getDefinitionByName</span><span style="color: #66cc66;">&#40;</span>_id<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
			_clip.<span style="color: #6699cc;">gotoAndStop</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc; font-weight:bold;">1</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
			<span style="color: #b1b100; font-weight: bold;">var</span> r:Rectangle;
&nbsp;
			<span style="color: #b1b100; font-weight: bold;">for</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100; font-weight: bold;">var</span> i:<span style="color: #6699cc;">int</span> = <span style="color: #cc66cc; font-weight:bold;">0</span>; i &lt; _clip.totalFrames; i++<span style="color: #66cc66;">&#41;</span>
			<span style="color: #66cc66;">&#123;</span>
				r = _clip.<span style="color: #6699cc;">getBounds</span><span style="color: #66cc66;">&#40;</span>_clip<span style="color: #66cc66;">&#41;</span>;
&nbsp;
				<span style="color: #b1b100; font-weight: bold;">var</span> <span style="color: #6699cc;">bitmapData</span>:<span style="color: #6699cc;">BitmapData</span> = <span style="color: #b1b100; font-weight: bold;">new</span> <span style="color: #6699cc;">BitmapData</span><span style="color: #66cc66;">&#40;</span>r.<span style="color: #6699cc;">width</span>, r.<span style="color: #6699cc;">height</span>, <span style="color: #b1b100; font-weight: bold;">true</span>, 0x000000<span style="color: #66cc66;">&#41;</span>;
				<span style="color: #b1b100; font-weight: bold;">var</span> m:<span style="color: #6699cc;">Matrix</span> = <span style="color: #b1b100; font-weight: bold;">new</span> <span style="color: #6699cc;">Matrix</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
				m.<span style="color: #6699cc;">scale</span><span style="color: #66cc66;">&#40;</span>_scaleX, _scaleY<span style="color: #66cc66;">&#41;</span>;
				m.<span style="color: #6699cc;">translate</span><span style="color: #66cc66;">&#40;</span>-r.<span style="color: #6699cc;">x</span>, -r.<span style="color: #6699cc;">y</span><span style="color: #66cc66;">&#41;</span>;
				<span style="color: #6699cc;">bitmapData</span>.<span style="color: #6699cc;">draw</span><span style="color: #66cc66;">&#40;</span>_clip, m, <span style="color: #b1b100; font-weight: bold;">null</span>, <span style="color: #b1b100; font-weight: bold;">null</span>, <span style="color: #b1b100; font-weight: bold;">null</span>, <span style="color: #b1b100; font-weight: bold;">true</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
				_frames.<span style="color: #6699cc;">push</span><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100; font-weight: bold;">new</span> AnimationFrame<span style="color: #66cc66;">&#40;</span><span style="color: #6699cc;">bitmapData</span>, r.<span style="color: #6699cc;">x</span>, r.<span style="color: #6699cc;">y</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
				_clip.<span style="color: #6699cc;">nextFrame</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
				makeAllChildrenNextFrame<span style="color: #66cc66;">&#40;</span>_clip<span style="color: #66cc66;">&#41;</span>;
			<span style="color: #66cc66;">&#125;</span>
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #FF00FF;">/**
		 * Проигрывает анимацию циклически
		 */</span>
		<span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">function</span> <span style="color: #6699cc;">play</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #b1b100; font-weight: bold;">void</span>
		<span style="color: #66cc66;">&#123;</span>
			_playing = true;
			<span style="color: #6699cc;">addEventListener</span><span style="color: #66cc66;">&#40;</span><span style="color: #6699cc;">Event</span>.<span style="color: #6699cc;">ENTER_FRAME</span>, <span style="color: #6699cc;">enterFrame</span>, <span style="color: #b1b100; font-weight: bold;">false</span>, <span style="color: #cc66cc; font-weight:bold;">0</span>, <span style="color: #b1b100; font-weight: bold;">true</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #FF00FF;">/**
		 * Стоп анимации 
		 */</span>
		<span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">function</span> <span style="color: #6699cc;">stop</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #b1b100; font-weight: bold;">void</span>
		<span style="color: #66cc66;">&#123;</span>
			_playing = false;
			<span style="color: #6699cc;">removeEventListener</span><span style="color: #66cc66;">&#40;</span><span style="color: #6699cc;">Event</span>.<span style="color: #6699cc;">ENTER_FRAME</span>, <span style="color: #6699cc;">enterFrame</span><span style="color: #66cc66;">&#41;</span>
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #FF00FF;">/**
		 * Переход к кадру и остановка
		 * @param	frame
		 */</span>
		<span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">function</span> <span style="color: #6699cc;">gotoAndStop</span><span style="color: #66cc66;">&#40;</span><span style="color: #6699cc;">frame</span>:<span style="color: #6699cc;">int</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #b1b100; font-weight: bold;">void</span>
		<span style="color: #66cc66;">&#123;</span>
			goto<span style="color: #66cc66;">&#40;</span><span style="color: #6699cc;">frame</span><span style="color: #66cc66;">&#41;</span>;
			<span style="color: #6699cc;">stop</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #FF00FF;">/**
		 * Переход к кадру и проигрывание
		 * @param	frame
		 */</span>
		<span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">function</span> <span style="color: #6699cc;">gotoAndPlay</span><span style="color: #66cc66;">&#40;</span><span style="color: #6699cc;">frame</span>:<span style="color: #6699cc;">int</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #b1b100; font-weight: bold;">void</span>
		<span style="color: #66cc66;">&#123;</span>
			goto<span style="color: #66cc66;">&#40;</span><span style="color: #6699cc;">frame</span><span style="color: #66cc66;">&#41;</span>;
			<span style="color: #6699cc;">play</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #FF00FF;">/**
		 * Переход к случайному кадру и проигрывание
		 */</span>
		<span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">function</span> gotoAndPlayRandomFrame<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #b1b100; font-weight: bold;">void</span>
		<span style="color: #66cc66;">&#123;</span>
			<span style="color: #6699cc;">gotoAndPlay</span><span style="color: #66cc66;">&#40;</span><span style="color: #6699cc;">int</span><span style="color: #66cc66;">&#40;</span><span style="color: #6699cc;">Math</span>.<span style="color: #6699cc;">random</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66; font-weight: bold;">*</span> <span style="color: #6699cc;">totalFrames</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #FF00FF;">/**
		 * Переход на след кадр
		 * @param	useSpeed
		 */</span>
		<span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">function</span> <span style="color: #6699cc;">nextFrame</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #b1b100; font-weight: bold;">void</span>
		<span style="color: #66cc66;">&#123;</span>
			goto<span style="color: #66cc66;">&#40;</span>_currentFrame + <span style="color: #cc66cc; font-weight:bold;">1</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #FF00FF;">/**
		 * Переход на предыдущий кадр
		 */</span>
		<span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">function</span> <span style="color: #6699cc;">prevFrame</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #b1b100; font-weight: bold;">void</span>
		<span style="color: #66cc66;">&#123;</span>
			goto<span style="color: #66cc66;">&#40;</span>_currentFrame - <span style="color: #cc66cc; font-weight:bold;">1</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #FF00FF;">/**
		 * Перезаполняет содержимое кеша заново.
		 */</span>
		<span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">function</span> update<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #b1b100; font-weight: bold;">void</span>
		<span style="color: #66cc66;">&#123;</span>
			<span style="color: #6699cc;">stop</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
			_frames = <span style="color: #b1b100; font-weight: bold;">new</span> Vector.&lt;AnimationFrame&gt;<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
			buildCacheFromLibrary<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #FF00FF;">//=====================================================================</span>
		<span style="color: #FF00FF;">// PRIVATE</span>
		<span style="color: #FF00FF;">//=====================================================================</span>
		<span style="color: #FF00FF;">/**
		 * Переход к кадру
		 * @param	frame
		 */</span>
		<span style="color: #b1b100; font-weight: bold;">private</span> <span style="color: #6699cc; font-weight: bold;">function</span> goto<span style="color: #66cc66;">&#40;</span>num:<span style="color: #6699cc;">int</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #b1b100; font-weight: bold;">void</span>
		<span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100; font-weight: bold;">if</span> <span style="color: #66cc66;">&#40;</span>num &gt; <span style="color: #6699cc;">totalFrames</span><span style="color: #66cc66;">&#41;</span> num = num <span style="color: #66cc66; font-weight: bold;">%</span> totalFrames; <span style="color: #FF00FF;">//num - (totalFrames * int(num / totalFrames));</span>
			<span style="color: #b1b100; font-weight: bold;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66; font-weight: bold;">!</span>num<span style="color: #66cc66;">&#41;</span> num = totalFrames;
&nbsp;
			_currentFrame = num;
&nbsp;
			<span style="color: #b1b100; font-weight: bold;">var</span> <span style="color: #6699cc;">frame</span>:AnimationFrame = _frames<span style="color: #66cc66;">&#91;</span>_currentFrame - <span style="color: #cc66cc; font-weight:bold;">1</span><span style="color: #66cc66;">&#93;</span>;
			_bitmap.<span style="color: #6699cc;">bitmapData</span> = <span style="color: #6699cc;">frame</span>.bitmapData;
			_bitmap.<span style="color: #6699cc;">smoothing</span> = true;
&nbsp;
			_bitmap.<span style="color: #6699cc;">x</span> = <span style="color: #6699cc;">frame</span>.x;
			_bitmap.<span style="color: #6699cc;">y</span> = <span style="color: #6699cc;">frame</span>.y;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #FF00FF;">/**
		 * Проходит по всем детям и прокручивает на кадр с указанным номером, 
		 * нужно в процессе кеширования. Утилитная функция.
		 * @param	m
		 * @param	f
		 */</span>
		<span style="color: #b1b100; font-weight: bold;">private</span> <span style="color: #6699cc; font-weight: bold;">function</span> makeAllChildrenNextFrame<span style="color: #66cc66;">&#40;</span>m:<span style="color: #6699cc;">MovieClip</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #b1b100; font-weight: bold;">void</span>
		<span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100; font-weight: bold;">for</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100; font-weight: bold;">var</span> i:<span style="color: #6699cc;">int</span> = <span style="color: #cc66cc; font-weight:bold;">0</span>; i &lt; m.numChildren; i++<span style="color: #66cc66;">&#41;</span> 
			<span style="color: #66cc66;">&#123;</span>
				<span style="color: #b1b100; font-weight: bold;">var</span> <span style="color: #6699cc;">c</span>:<span style="color: #66cc66; font-weight: bold;">*</span> = m.<span style="color: #6699cc;">getChildAt</span><span style="color: #66cc66;">&#40;</span>i<span style="color: #66cc66;">&#41;</span>;
				<span style="color: #b1b100; font-weight: bold;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #6699cc;">c</span> <span style="color: #b1b100; font-weight: bold;">is</span> <span style="color: #6699cc;">MovieClip</span><span style="color: #66cc66;">&#41;</span> 
				<span style="color: #66cc66;">&#123;</span>
					makeAllChildrenNextFrame<span style="color: #66cc66;">&#40;</span><span style="color: #6699cc;">c</span><span style="color: #66cc66;">&#41;</span>;
					<span style="color: #6699cc;">c</span>.<span style="color: #6699cc;">nextFrame</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
				<span style="color: #66cc66;">&#125;</span>
			<span style="color: #66cc66;">&#125;</span>
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #FF00FF;">//=====================================================================</span>
		<span style="color: #FF00FF;">// HANDLERS</span>
		<span style="color: #FF00FF;">//=====================================================================</span>
		<span style="color: #FF00FF;">/**
		 * Без комментариев (;
		 * @param	e
		 */</span>
		<span style="color: #b1b100; font-weight: bold;">private</span> <span style="color: #6699cc; font-weight: bold;">function</span> <span style="color: #6699cc;">enterFrame</span><span style="color: #66cc66;">&#40;</span>e:<span style="color: #6699cc;">Event</span> = <span style="color: #b1b100; font-weight: bold;">null</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #b1b100; font-weight: bold;">void</span>
		<span style="color: #66cc66;">&#123;</span>
			<span style="color: #6699cc;">nextFrame</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
			<span style="color: #b1b100; font-weight: bold;">if</span> <span style="color: #66cc66;">&#40;</span>_currentFrame &gt;= <span style="color: #6699cc;">totalFrames</span><span style="color: #66cc66;">&#41;</span> 
				<span style="color: #6699cc;">dispatchEvent</span><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100; font-weight: bold;">new</span> <span style="color: #6699cc;">Event</span><span style="color: #66cc66;">&#40;</span><span style="color: #6699cc;">Event</span>.<span style="color: #6699cc;">COMPLETE</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
		<span style="color: #66cc66;">&#125;</span>
		<span style="color: #FF00FF;">//=====================================================================</span>
		<span style="color: #FF00FF;">// ACCESSORS</span>
		<span style="color: #FF00FF;">//=====================================================================</span>
		<span style="color: #FF00FF;">/** Проигрывается ли флешка в данный момент */</span>
		<span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">function</span> <span style="color: #b1b100; font-weight: bold;">get</span> playing<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #6699cc;">Boolean</span> <span style="color: #66cc66;">&#123;</span> <span style="color: #b1b100; font-weight: bold;">return</span> _playing; <span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #FF00FF;">/** Полное кол-во кадров */</span>
		<span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">function</span> <span style="color: #b1b100; font-weight: bold;">get</span> <span style="color: #6699cc;">totalFrames</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #6699cc;">int</span> <span style="color: #66cc66;">&#123;</span> <span style="color: #b1b100; font-weight: bold;">return</span> _frames.length; <span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #FF00FF;">/** Текущий кадр */</span>
		<span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">function</span> <span style="color: #b1b100; font-weight: bold;">get</span> <span style="color: #6699cc;">currentFrame</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #6699cc;">int</span> <span style="color: #66cc66;">&#123;</span>	<span style="color: #b1b100; font-weight: bold;">return</span> _currentFrame; <span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #FF00FF;">/** Масив(вектор) фреймов, нужен для клонирования */</span>
		<span style="color: #b1b100; font-weight: bold;">internal</span> <span style="color: #6699cc; font-weight: bold;">function</span> <span style="color: #b1b100; font-weight: bold;">get</span> frames<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:Vector.&lt;AnimationFrame&gt; <span style="color: #66cc66;">&#123;</span> <span style="color: #b1b100; font-weight: bold;">return</span> _frames; <span style="color: #66cc66;">&#125;</span>
		<span style="color: #b1b100; font-weight: bold;">internal</span> <span style="color: #6699cc; font-weight: bold;">function</span> <span style="color: #b1b100; font-weight: bold;">set</span> frames<span style="color: #66cc66;">&#40;</span><span style="color: #6699cc;">value</span>:Vector.&lt;AnimationFrame&gt;<span style="color: #66cc66;">&#41;</span>:<span style="color: #b1b100; font-weight: bold;">void</span> <span style="color: #66cc66;">&#123;</span> _frames = value; <span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #FF00FF;">/** исходный мувиклип, нужен для клонирования */</span>
		<span style="color: #b1b100; font-weight: bold;">internal</span> <span style="color: #6699cc; font-weight: bold;">function</span> <span style="color: #b1b100; font-weight: bold;">get</span> clip<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #6699cc;">MovieClip</span> <span style="color: #66cc66;">&#123;</span> <span style="color: #b1b100; font-weight: bold;">return</span> _clip; <span style="color: #66cc66;">&#125;</span>
		<span style="color: #b1b100; font-weight: bold;">internal</span> <span style="color: #6699cc; font-weight: bold;">function</span> <span style="color: #b1b100; font-weight: bold;">set</span> clip<span style="color: #66cc66;">&#40;</span><span style="color: #6699cc;">value</span>:<span style="color: #6699cc;">MovieClip</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #b1b100; font-weight: bold;">void</span> <span style="color: #66cc66;">&#123;</span> _clip = value; <span style="color: #66cc66;">&#125;</span>
&nbsp;
&nbsp;
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></pre>
</div>
<!-- END TEMPLATE: bbcode_as3code -->Утилитный классец одного фрейма:<br />
<!-- BEGIN TEMPLATE: bbcode_as3code -->
<div style="margin:20px; margin-top:5px">
	<div style="margin-bottom: 3px; width: 800px;" class="smallfont"><a href="#" onclick="collapseCode(this); return false;"><img style="margin-bottom: -3px;" border="0" src="images/russian/style3/buttons/collapse_thead_collapsed.gif" alt=""></a> Код AS3:</div>
	<pre dir="ltr" class="alt2" style="
		width: 800px;
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		height: 498px;
		text-align: left;
		overflow: auto;"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #6699cc; font-weight: bold;">package</span> com.earwig.animationcache 
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #b1b100; font-weight: bold;">import</span> <span style="color: #6699cc;">flash.display</span>.BitmapData;
	<span style="color: #FF00FF;">/**
	 * ...
	 * @author Dukobpa3
	 */</span>
	<span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">class</span> AnimationFrame 
	<span style="color: #66cc66;">&#123;</span>
&nbsp;
		<span style="color: #b1b100; font-weight: bold;">private</span> <span style="color: #b1b100; font-weight: bold;">var</span> _bitmapData:BitmapData;
		<span style="color: #b1b100; font-weight: bold;">private</span> <span style="color: #b1b100; font-weight: bold;">var</span> _x:int;
		<span style="color: #b1b100; font-weight: bold;">private</span> <span style="color: #b1b100; font-weight: bold;">var</span> _y:int;
&nbsp;
		<span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">function</span> AnimationFrame<span style="color: #66cc66;">&#40;</span>bmpd:<span style="color: #6699cc;">BitmapData</span>, <span style="color: #6699cc;">x</span>:<span style="color: #6699cc;">int</span>,<span style="color: #6699cc;">y</span>:<span style="color: #6699cc;">int</span><span style="color: #66cc66;">&#41;</span> 
		<span style="color: #66cc66;">&#123;</span>
			_bitmapData = bmpd;
			_x = x;
			_y = y;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #b1b100; font-weight: bold;">internal</span> <span style="color: #6699cc; font-weight: bold;">function</span> <span style="color: #b1b100; font-weight: bold;">get</span> <span style="color: #6699cc;">bitmapData</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #6699cc;">BitmapData</span> 
		<span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100; font-weight: bold;">return</span> _bitmapData;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #b1b100; font-weight: bold;">internal</span> <span style="color: #6699cc; font-weight: bold;">function</span> <span style="color: #b1b100; font-weight: bold;">get</span> <span style="color: #6699cc;">x</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #6699cc;">int</span> 
		<span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100; font-weight: bold;">return</span> _x;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #b1b100; font-weight: bold;">internal</span> <span style="color: #6699cc; font-weight: bold;">function</span> <span style="color: #b1b100; font-weight: bold;">get</span> <span style="color: #6699cc;">y</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #6699cc;">int</span> 
		<span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100; font-weight: bold;">return</span> _y;
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span></pre></pre>
</div>
<!-- END TEMPLATE: bbcode_as3code -->Собственно всё.</div>


<!-- END TEMPLATE: blog_entry_external -->]]></content:encoded>
			<dc:creator>Dukobpa3</dc:creator>
			<guid isPermaLink="true">http://www.flasher.ru/forum/blog.php?b=552</guid>
		</item>
		<item>
			<title>Stage3D заметки</title>
			<link>http://www.flasher.ru/forum/blog.php?b=551</link>
			<pubDate>Fri, 06 Apr 2012 08:07:29 GMT</pubDate>
			<description>Привет. Сегодняшняя заметка будет особенно интересна математикам. И я надеюсь получить от тех, кто в теме, т.к. некоторые вещи я так и не смог понять. 
После выхода 11-го плеера в сети появились несколько однотипных примеров использования stage3D, которые показывают базовые возможности...</description>
			<content:encoded><![CDATA[<!-- BEGIN TEMPLATE: blog_entry_external -->
<div>Привет. Сегодняшняя заметка будет особенно интересна математикам. И я надеюсь получить от тех, кто в теме, т.к. некоторые вещи я так и не смог понять.<br />
После выхода 11-го плеера в сети появились несколько однотипных примеров использования stage3D, которые показывают базовые возможности использования нового API. К сожалению, комьюнити мало пишет о секретных фишках, поэтому интересную инфу приходится собирать по крупицам. Так, например, примеры отрисовки треугольника или куба сводятся к следующему:<br />
<!-- BEGIN TEMPLATE: bbcode_as3code -->
<div style="margin:20px; margin-top:5px">
	<div style="margin-bottom: 3px; width: 800px;" class="smallfont"><a href="#" onclick="collapseCode(this); return false;"><img style="margin-bottom: -3px;" border="0" src="images/russian/style3/buttons/collapse_thead_collapsed.gif" alt=""></a> Код AS3:</div>
	<pre dir="ltr" class="alt2" style="
		width: 800px;
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		height: 226px;
		text-align: left;
		overflow: auto;"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #FF00FF;">//задаем координаты и цвет вершин</span>
<span style="color: #b1b100; font-weight: bold;">var</span> vertices:Vector.&lt;Number&gt; = Vector.&lt;Number&gt;<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#91;</span>
				<span style="color: #FF00FF;">//x    y	z	r	g	b</span>
				<span style="color: #cc66cc; font-weight:bold;">0</span>, 	<span style="color: #cc66cc; font-weight:bold;">0</span>, 	<span style="color: #cc66cc; font-weight:bold;">1</span>, 	<span style="color: #cc66cc; font-weight:bold;">1</span>,	<span style="color: #cc66cc; font-weight:bold;">0</span>, 	<span style="color: #cc66cc; font-weight:bold;">0</span>,
				<span style="color: #cc66cc; font-weight:bold;">1</span>, 	<span style="color: #cc66cc; font-weight:bold;">0</span>, 	<span style="color: #cc66cc; font-weight:bold;">1</span>, 	<span style="color: #cc66cc; font-weight:bold;">0</span>,	<span style="color: #cc66cc; font-weight:bold;">1</span>, 	<span style="color: #cc66cc; font-weight:bold;">0</span>,
				<span style="color: #cc66cc; font-weight:bold;">0</span>, 	<span style="color: #cc66cc; font-weight:bold;">1</span>, 	<span style="color: #cc66cc; font-weight:bold;">1</span>, 	<span style="color: #cc66cc; font-weight:bold;">0</span>,	<span style="color: #cc66cc; font-weight:bold;">0</span>, 	<span style="color: #cc66cc; font-weight:bold;">1</span>
			<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #FF00FF;">//пишем шейдеры</span>
<span style="color: #b1b100; font-weight: bold;">var</span> vertexShader:<span style="color: #6699cc;">String</span> = 
			<span style="color: #990000;">'mov op va0<span style="">\n</span>'</span> +
			<span style="color: #990000;">'mov v0 vt0'</span>;
<span style="color: #b1b100; font-weight: bold;">var</span> fragmentShader:<span style="color: #6699cc;">String</span> = 
			<span style="color: #990000;">'mov oc, v0'</span>;</pre></pre>
</div>
<!-- END TEMPLATE: bbcode_as3code -->Меня сразу смутили вот эти вот нолики и единички в координатах. Мой мозг привык думать в пикселах и привычных размерах дисплей обжектов, например, 200 на 200 пикселов в ширину и высоту и 153 пиксела в глубину. Но для правильного отображения нам необходимо привести реальные размеры к нормализованным координатам (NDC - Normalized Device Coordinates), т.е. к интервалу [-1, +1]  для x и y и [0, +1] для z. (можно конечно выйти за этот интервал - но отрисовываться ничего не будет - лишнее просто обрежется). Для конвертации в эти самые NDC служат матрицы. Адоб предоставляет класс PerspectiveMatrix3D, с помощью которого можно соорудить различные матрицы - ортогональные и перспективные с различными параметрами и различным расположением осей (я про леворучные и праворучные координатные системы). Такую матрицу передаем в шейдер, где инструкция<br />
<!-- BEGIN TEMPLATE: bbcode_as3code -->
<div style="margin:20px; margin-top:5px">
	<div style="margin-bottom: 3px; width: 800px;" class="smallfont"><a href="#" onclick="collapseCode(this); return false;"><img style="margin-bottom: -3px;" border="0" src="images/russian/style3/buttons/collapse_thead_collapsed.gif" alt=""></a> Код AS3:</div>
	<pre dir="ltr" class="alt2" style="
		width: 800px;
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		height: 34px;
		text-align: left;
		overflow: auto;"><pre class="actionscript3" style="font-family:monospace;">m44 op va0 vc0</pre></pre>
</div>
<!-- END TEMPLATE: bbcode_as3code -->преобразовывает координаты вершины.<br />
Рассмотрим матрицу PerspectiveMatrix3D.perspectiveOffCenterLH. Начнем с того, что в приведенной выше инструкции вектор (координаты вершины), расположен справа, т.е. это так называемый строчный вектор (row vector), а значит матрица тоже должна быть строчной (тот кто в теме - тот поймет). Однако PerspectiveMatrix3D.perspectiveOffCenterLH создает перевернутую (transposed) матрицу и для правильного отображения нужно передавать true 4-м параметром в context3D.setProgramConstantsFromMatrix(). Теперь проведем такой тест:<br />
<!-- BEGIN TEMPLATE: bbcode_as3code -->
<div style="margin:20px; margin-top:5px">
	<div style="margin-bottom: 3px; width: 800px;" class="smallfont"><a href="#" onclick="collapseCode(this); return false;"><img style="margin-bottom: -3px;" border="0" src="images/russian/style3/buttons/collapse_thead_collapsed.gif" alt=""></a> Код AS3:</div>
	<pre dir="ltr" class="alt2" style="
		width: 800px;
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		height: 258px;
		text-align: left;
		overflow: auto;"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #FF00FF;">//координаты</span>
<span style="color: #b1b100; font-weight: bold;">var</span> vertices:Vector.&lt;Number&gt; = Vector.&lt;Number&gt;<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#91;</span>
				<span style="color: #FF00FF;">//x	y	z	w</span>
				<span style="color: #cc66cc; font-weight:bold;">0</span>, 	<span style="color: #cc66cc; font-weight:bold;">0</span>, 	<span style="color: #cc66cc; font-weight:bold;">600</span>, 	<span style="color: #cc66cc; font-weight:bold;">1</span>,
				<span style="color: #cc66cc; font-weight:bold;">200</span>, 	<span style="color: #cc66cc; font-weight:bold;">0</span>, 	<span style="color: #cc66cc; font-weight:bold;">600</span>, 	<span style="color: #cc66cc; font-weight:bold;">1</span>,
				<span style="color: #cc66cc; font-weight:bold;">200</span>, 	<span style="color: #cc66cc; font-weight:bold;">200</span>, 	<span style="color: #cc66cc; font-weight:bold;">600</span>, 	<span style="color: #cc66cc; font-weight:bold;">1</span>,
				<span style="color: #cc66cc; font-weight:bold;">0</span>, 	<span style="color: #cc66cc; font-weight:bold;">200</span>,	<span style="color: #cc66cc; font-weight:bold;">600</span>, 	<span style="color: #cc66cc; font-weight:bold;">1</span>
			<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #FF00FF;">//вершинный шейдер</span>
<span style="color: #b1b100; font-weight: bold;">var</span> vertexShader:<span style="color: #6699cc;">String</span> = 
			<span style="color: #990000;">'m44 op va0 vc0'</span>;
&nbsp;
<span style="color: #FF00FF;">//проекционная матрица</span>
perspectiveMatrix.perspectiveOffCenterLH<span style="color: #66cc66;">&#40;</span>-<span style="color: #cc66cc; font-weight:bold;">400</span>, <span style="color: #cc66cc; font-weight:bold;">400</span>, <span style="color: #cc66cc; font-weight:bold;">300</span>, -<span style="color: #cc66cc; font-weight:bold;">300</span>, <span style="color: #cc66cc; font-weight:bold;">400</span>, <span style="color: #cc66cc; font-weight:bold;">1000</span><span style="color: #66cc66;">&#41;</span>;</pre></pre>
</div>
<!-- END TEMPLATE: bbcode_as3code -->Ура, все работает.<br />
Однако, сделаем вот так:<br />
<!-- BEGIN TEMPLATE: bbcode_as3code -->
<div style="margin:20px; margin-top:5px">
	<div style="margin-bottom: 3px; width: 800px;" class="smallfont"><a href="#" onclick="collapseCode(this); return false;"><img style="margin-bottom: -3px;" border="0" src="images/russian/style3/buttons/collapse_thead_collapsed.gif" alt=""></a> Код AS3:</div>
	<pre dir="ltr" class="alt2" style="
		width: 800px;
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		height: 82px;
		text-align: left;
		overflow: auto;"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #b1b100; font-weight: bold;">var</span> v:Vector3D = <span style="color: #b1b100; font-weight: bold;">new</span> Vector3D<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc; font-weight:bold;">200</span>, <span style="color: #cc66cc; font-weight:bold;">200</span>, <span style="color: #cc66cc; font-weight:bold;">600</span>, <span style="color: #cc66cc; font-weight:bold;">1</span><span style="color: #66cc66;">&#41;</span>;
v = _perspectiveMatrix.transformVector<span style="color: #66cc66;">&#40;</span>v<span style="color: #66cc66;">&#41;</span>; <span style="color: #FF00FF;">//вот тут кстати мы матрицу умножаем на вектор, а не наоборот - как в шейдере, поэтому трансопзить матрицу не нужно</span>
<span style="color: #6699cc;">trace</span><span style="color: #66cc66;">&#40;</span>v<span style="color: #66cc66;">&#41;</span>; <span style="color: #FF00FF;">//Vector3D(200, -266.66668701171875, 333.3332824707031)</span>
<span style="color: #6699cc;">trace</span><span style="color: #66cc66;">&#40;</span>v.w<span style="color: #66cc66;">&#41;</span>; <span style="color: #FF00FF;">//600</span></pre></pre>
</div>
<!-- END TEMPLATE: bbcode_as3code -->OMG! Но ведь эти координаты НЕ нормализованы, как тогда, черт возьми это работает?????????<br />
По правде говоря, получившийся вектор - ммм, как бы сказать, - не обычный - он в другой кординатной системе... Его четвертая координата w не равна 1, а равна 600. И чтобы перевести вектор из гомогенных координат (в которых он сейчас находится) в обычные, надо все величины разделить на 600, чтобы w была 1. Разделим:<br />
<!-- BEGIN TEMPLATE: bbcode_as3code -->
<div style="margin:20px; margin-top:5px">
	<div style="margin-bottom: 3px; width: 800px;" class="smallfont"><a href="#" onclick="collapseCode(this); return false;"><img style="margin-bottom: -3px;" border="0" src="images/russian/style3/buttons/collapse_thead_collapsed.gif" alt=""></a> Код AS3:</div>
	<pre dir="ltr" class="alt2" style="
		width: 800px;
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		height: 82px;
		text-align: left;
		overflow: auto;"><pre class="actionscript3" style="font-family:monospace;">v.scaleBy<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc; font-weight:bold;">1</span> / v.w<span style="color: #66cc66;">&#41;</span>;
v.w /= v.w
<span style="color: #6699cc;">trace</span><span style="color: #66cc66;">&#40;</span>v<span style="color: #66cc66;">&#41;</span>; <span style="color: #FF00FF;">//Vector3D(0.33333333333333337, -0.4444444783528646, 0.5555554707845053)</span>
<span style="color: #6699cc;">trace</span><span style="color: #66cc66;">&#40;</span>v.w<span style="color: #66cc66;">&#41;</span>; <span style="color: #FF00FF;">//1</span></pre></pre>
</div>
<!-- END TEMPLATE: bbcode_as3code -->Гуд, это уже похоже на правду.<br />
И вот тут у меня главная непонятка - в шейдере мы НЕ делим кординаты вектора на гомогенную координату, однако все работает как надо. Почему??? Основная догадка - где-то там в недрах карты это деление все таки происходит. Однако происходит это поздно - позже, чем данные передаются во фрагментный шейдер. Т.е. если мы будем делать так:<br />
<!-- BEGIN TEMPLATE: bbcode_as3code -->
<div style="margin:20px; margin-top:5px">
	<div style="margin-bottom: 3px; width: 800px;" class="smallfont"><a href="#" onclick="collapseCode(this); return false;"><img style="margin-bottom: -3px;" border="0" src="images/russian/style3/buttons/collapse_thead_collapsed.gif" alt=""></a> Код AS3:</div>
	<pre dir="ltr" class="alt2" style="
		width: 800px;
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		height: 82px;
		text-align: left;
		overflow: auto;"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #b1b100; font-weight: bold;">var</span> _vertexShader:<span style="color: #6699cc;">String</span> = 
			<span style="color: #990000;">'m44 vt0 va0 vc0<span style="">\n</span>'</span> +
			<span style="color: #990000;">'mov op vt0<span style="">\n</span>'</span> +
			<span style="color: #990000;">'mov v0 vt0'</span>;</pre></pre>
</div>
<!-- END TEMPLATE: bbcode_as3code -->То во фрагментном шейдере v0 будет не нормализован. Какая разница, спросите вы? Ну, в некоторых случаях это критично. Я столкнулся с этой проблемой, когда пытался выводить на экран буфер глубины (depth bufer) - в качестве цвета мне нужна была координата z. Однако, т.к. значение было не нормализовано и намного больше 1, то весь буфер был белый.<br />
Статья немного сумбурна, потому что тема довольно-таки сложная для понимания. Не стесняйтесь - по любым вопросам пишите в комменты. Сейчас я приведу получившийся результат, чтобы было понятно что же я все-таки хотел:<br />
<!-- BEGIN TEMPLATE: bbcode_as3code -->
<div style="margin:20px; margin-top:5px">
	<div style="margin-bottom: 3px; width: 800px;" class="smallfont"><a href="#" onclick="collapseCode(this); return false;"><img style="margin-bottom: -3px;" border="0" src="images/russian/style3/buttons/collapse_thead_collapsed.gif" alt=""></a> Код AS3:</div>
	<pre dir="ltr" class="alt2" style="
		width: 800px;
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		height: 498px;
		text-align: left;
		overflow: auto;"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #FF00FF;">//вершины</span>
<span style="color: #b1b100; font-weight: bold;">var</span> vertices:Vector.&lt;Number&gt; = Vector.&lt;Number&gt;<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#91;</span>
				<span style="color: #FF00FF;">//x	y	z	w</span>
				<span style="color: #cc66cc; font-weight:bold;">0</span>, 	<span style="color: #cc66cc; font-weight:bold;">0</span>, 	<span style="color: #cc66cc; font-weight:bold;">600</span>, 	<span style="color: #cc66cc; font-weight:bold;">1</span>,
				<span style="color: #cc66cc; font-weight:bold;">200</span>, 	<span style="color: #cc66cc; font-weight:bold;">0</span>, 	<span style="color: #cc66cc; font-weight:bold;">600</span>, 	<span style="color: #cc66cc; font-weight:bold;">1</span>,
				<span style="color: #cc66cc; font-weight:bold;">200</span>, 	<span style="color: #cc66cc; font-weight:bold;">200</span>, 	<span style="color: #cc66cc; font-weight:bold;">600</span>, 	<span style="color: #cc66cc; font-weight:bold;">1</span>,
				<span style="color: #cc66cc; font-weight:bold;">0</span>, 	<span style="color: #cc66cc; font-weight:bold;">200</span>,	<span style="color: #cc66cc; font-weight:bold;">600</span>, 	<span style="color: #cc66cc; font-weight:bold;">1</span>
			<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #FF00FF;">//индексы</span>
<span style="color: #b1b100; font-weight: bold;">var</span> indices:Vector.&lt;uint&gt; = Vector.&lt;uint&gt;<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#91;</span>
				<span style="color: #cc66cc; font-weight:bold;">0</span>, <span style="color: #cc66cc; font-weight:bold;">1</span>, <span style="color: #cc66cc; font-weight:bold;">3</span>,
				<span style="color: #cc66cc; font-weight:bold;">1</span>, <span style="color: #cc66cc; font-weight:bold;">2</span>, <span style="color: #cc66cc; font-weight:bold;">3</span>
&nbsp;
<span style="color: #FF00FF;">//проекционная матрица</span>
perspectiveMatrix.perspectiveOffCenterLH<span style="color: #66cc66;">&#40;</span>-<span style="color: #cc66cc; font-weight:bold;">400</span>, <span style="color: #cc66cc; font-weight:bold;">400</span>, <span style="color: #cc66cc; font-weight:bold;">300</span>, -<span style="color: #cc66cc; font-weight:bold;">300</span>, <span style="color: #cc66cc; font-weight:bold;">400</span>, <span style="color: #cc66cc; font-weight:bold;">1000</span><span style="color: #66cc66;">&#41;</span>;
			<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #FF00FF;">//пускай обратная сторона тоже отрисовывается</span>
context3D.setCulling<span style="color: #66cc66;">&#40;</span>Context3DTriangleFace.<span style="color: #6699cc;">NONE</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #FF00FF;">//шейдеры</span>
<span style="color: #b1b100; font-weight: bold;">private</span> <span style="color: #b1b100; font-weight: bold;">var</span> _vertexShader:<span style="color: #6699cc;">String</span> = 
			<span style="color: #990000;">'m44 vt0 va0 vc0<span style="">\n</span>'</span> +
			<span style="color: #990000;">'div vt0 vt0 vt0.wwww<span style="">\n</span>'</span> +
			<span style="color: #990000;">'mov op vt0<span style="">\n</span>'</span> +
			<span style="color: #990000;">'mov v0 vt0'</span>;
&nbsp;
<span style="color: #b1b100; font-weight: bold;">private</span> <span style="color: #b1b100; font-weight: bold;">var</span> _fragmentShader:<span style="color: #6699cc;">String</span> = 
			<span style="color: #990000;">'sub oc, fc0 v0.zzzz'</span>;
&nbsp;
<span style="color: #FF00FF;">//отрисовка</span>
<span style="color: #6699cc; font-weight: bold;">function</span> <span style="color: #6699cc;">draw</span><span style="color: #66cc66;">&#40;</span>event:<span style="color: #6699cc;">Event</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #b1b100; font-weight: bold;">void</span> <span style="color: #66cc66;">&#123;</span>
&nbsp;
			<span style="color: #6699cc;">matrix</span>.<span style="color: #6699cc;">identity</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
			_matrix.appendTranslation<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc; font-weight:bold;">0</span>, <span style="color: #cc66cc; font-weight:bold;">0</span>, -<span style="color: #cc66cc; font-weight:bold;">600</span><span style="color: #66cc66;">&#41;</span>;
			_matrix.appendRotation<span style="color: #66cc66;">&#40;</span><span style="color: #6699cc;">getTimer</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66; font-weight: bold;">*</span> <span style="color: #cc66cc; font-weight:bold;">0.05</span>, Vector3D.Y_AXIS<span style="color: #66cc66;">&#41;</span>;
			_matrix.appendTranslation<span style="color: #66cc66;">&#40;</span><span style="color: #6699cc;">stage</span>.<span style="color: #6699cc;">mouseX</span> - <span style="color: #cc66cc; font-weight:bold;">400</span>, <span style="color: #6699cc;">stage</span>.<span style="color: #6699cc;">mouseY</span> - <span style="color: #cc66cc; font-weight:bold;">300</span>, <span style="color: #cc66cc; font-weight:bold;">600</span><span style="color: #66cc66;">&#41;</span>;
			_matrix.append<span style="color: #66cc66;">&#40;</span>_perspectiveMatrix<span style="color: #66cc66;">&#41;</span>;
&nbsp;
			_context3D.setProgramConstantsFromMatrix<span style="color: #66cc66;">&#40;</span>Context3DProgramType.VERTEX, <span style="color: #cc66cc; font-weight:bold;">0</span>, _matrix, <span style="color: #b1b100; font-weight: bold;">true</span><span style="color: #66cc66;">&#41;</span>;
			_context3D.setProgramConstantsFromVector<span style="color: #66cc66;">&#40;</span>Context3DProgramType.FRAGMENT, <span style="color: #cc66cc; font-weight:bold;">0</span>, Vector.&lt;Number&gt;<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc; font-weight:bold;">1</span>, <span style="color: #cc66cc; font-weight:bold;">1</span>, <span style="color: #cc66cc; font-weight:bold;">1</span>, <span style="color: #cc66cc; font-weight:bold;">1</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
			_context3D.<span style="color: #6699cc;">clear</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc; font-weight:bold;">0</span>, <span style="color: #cc66cc; font-weight:bold;">0</span>, <span style="color: #cc66cc; font-weight:bold;">0</span>, <span style="color: #cc66cc; font-weight:bold;">1</span><span style="color: #66cc66;">&#41;</span>;
			_context3D.drawTriangles<span style="color: #66cc66;">&#40;</span>_indexBuffer, <span style="color: #cc66cc; font-weight:bold;">0</span>, <span style="color: #cc66cc; font-weight:bold;">2</span><span style="color: #66cc66;">&#41;</span>;
			_context3D.present<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span></pre></pre>
</div>
<!-- END TEMPLATE: bbcode_as3code -->Результат:<br />
<a href="http://www.flasher.ru/forum/blog_attachment.php?attachmentid=262&amp;d=1333698993" >depthTest.zip</a><br />
Здесь видно, что чем ближе пикселы к камере, тем они светлее.</div>


<!-- END TEMPLATE: blog_entry_external -->]]></content:encoded>
			<dc:creator>Волгоградец</dc:creator>
			<guid isPermaLink="true">http://www.flasher.ru/forum/blog.php?b=551</guid>
		</item>
		<item>
			<title><![CDATA["Мы стали более лучше тач-скроллить"]]></title>
			<link>http://www.flasher.ru/forum/blog.php?b=550</link>
			<pubDate>Fri, 30 Mar 2012 17:22:56 GMT</pubDate>
			<description>Перевод моей небольшой вводной заметки (https://plus.google.com/100135097085517504778/posts/Kzs4YTfPWiP) c google+. 
 
Ссылки для торопливых: 
github: https://github.com/fljot/TouchScrolling 
скомпилированные приложения-демки: https://github.com/fljot/TouchScrolling/downloads 
Как пользоваться...</description>
			<content:encoded><![CDATA[<!-- BEGIN TEMPLATE: blog_entry_external -->
<div>Перевод моей <a href="https://plus.google.com/100135097085517504778/posts/Kzs4YTfPWiP" target="_blank">небольшой вводной заметки</a> c google+.<br />
<br />
Ссылки для торопливых:<br />
github: <a href="https://github.com/fljot/TouchScrolling" target="_blank">https://github.com/fljot/TouchScrolling</a><br />
скомпилированные приложения-демки: <a href="https://github.com/fljot/TouchScrolling/downloads" target="_blank">https://github.com/fljot/TouchScrolling/downloads</a><br />
Как пользоваться приложением: выбрать пример, двойной тап или хардварная кнопка меню (Android) для показа настроек, кнопка назад (Android) для возврата в главное меню выбора примеров, кнопка &quot;back to demos&quot; для возврата к текущему выбранному примеру. Примечание: приложение убивается при выходе-сворачивании.<br />
<br />
Итак, наконец нашёл время и силы, подчистил код и выложил в опен-сорс. Тач (или назвать это кинетический?) скроллинг — неотъемлемая часть любой тачскриновой разработки будь то разработка под мобильные платформы, или под мультитач панели, или мультитач столы и стены. И, IMHO и к сожалению, я не нашёл никаких достойных решений под Flash платформу...<br />
<br />
----------------------------------------<br />
<br />
<b># Анализ</b><br />
<br />
Так что же не так с теми решениями, которые вы можете загуглить по запросам &quot;touch scrolling&quot; или &quot;kinetic scrolling&quot; (+ &quot;as3&quot; или &quot;flash&quot;)?<br />
<br />
1. Ну во-первых, не особо получится их повторно использовать (всмысле в ситуации, отличающейся от найденного примера). Флексовый Spark Scroller смотрится (в техническом смысле) лучше остальных, но будучи частью Flex framework, он может быть использован только в купе со всей этой флексовой архитектурой, а значит вам придётся принять все их правила этой самой архитектуры. Другие люди же просто создают какой-то класс Scroller, который расширяет Sprite, куда и закидывают и скролл-логику, и контент.<br />
<br />
2. Второй момент — это недостаток функционала (фич). Недостаточно просто поставить свой палец/курсор на экран и двигать вертикальный контент. Серьёзная разработка может потребовать такие вещи как мультитач, пагинацию контента и кастомные привязки(как это по-русски?? content paging and/or custom snapping), блокировку по направлению (directional locking), настройку физики/механики оттягивания, отскока и торможения (трения) (pull, bounce and throw deceleration) и т.д.<br />
<br />
3. Третий момент самый важный для конечного пользователя — это ощущение от работы, что и формирует UX (user experience). Всё дело в правильной физике/механики, отзывчивости интерфейса (ну и производительности как части отзывчивости).<br />
<br />
Важно отметить, что флексовый Spark Scroller выглядит (с технической точки зрения) и ощущается гораздо лучше прочих разработок. И не удивительно, ведь флекс-команде разработчиков нужно было сделать что-то приличное, раз уж они вступили в поле мобильной разработки.<br />
<br />
----------------------------------------<br />
<br />
<b># Моё решение</b><br />
<br />
Короткий обзор того, как я решаю эти проблемы.<br />
<br />
1. Очевидно, логику тач-скроллинга необходимо вынести за непосредственные пределы UI-компонент. Для этого я выбрал самый простой способ и работаю с интерфейсом IViewport (<a href="https://github.com/fljot/TouchScrolling/blob/master/src/com/inreflected/core/IViewport.as" target="_blank">https://github.com/fljot/TouchScroll...e/IViewport.as</a>) который имеет такие API как например horizontal/verticalScrollPosition и contentWidth/Height. Интерфейс почти такой же как и флексовый Spark IViewport, но я не хочу тащить кучу лишних зависимостей, так что приходится иметь свой, а не использовать флексовый. Сам класс, отвечающий за логику скроллинга это (невизуальный) класс-менеджер TouchScrollManager (<a href="https://github.com/fljot/TouchScrolling/blob/master/src/com/inreflected/ui/managers/TouchScrollManager.as" target="_blank">https://github.com/fljot/TouchScroll...rollManager.as</a>) и работает от с viewport'ом. Так что использовать его можно с компонентами любых UI-фреймворков (будь то флекс или minimalcomps или ваши личные UI-компоненты, ведь вы же, скорее всего, не будете использовать Flex framework для какой-нибудь мобильной игрули).<br />
<br />
2. Я реализовал почти все фичи флексового скроллера + добавил новые.<br />
У меня нету флексового snappingMode (LEADING_EDGE, CENTER, TRAILING_EDGE) т.к. это исходит из тесной флексовой архитектуры компонентов. Вместо этого у меня есть более гибкое, но и немного более сложное в использовании решение (snappingDelegate), которое позволяет сделать любую привязку (snapping).<br />
Extra features: paging in BOTH directions, directionalLock (locks the scrolling to vertical or horizontal direction once you begin to move your finger - helps to avoid unnecessary movements in some cases), multitouch support (as it's based on PanGesture from my gesture recognition library Gestouch <a href="https://github.com/fljot/Gestouch" target="_blank">https://github.com/fljot/Gestouch</a>), advanced control over bounce and pull effects and deceleration (friction).<br />
<br />
3. Гладкий (мягкий?) UX более-менее достигнут (всё ещё хочу поиграться с throw effect easing using cubic Bezier curve) через грамотное использование п.2. /Говоря о флексе — у них были некоторые проблемы, на которые я указывал в давнишней 4.5 пре-релизной программе, но, видимо, у них не хватило ресурсов на исправления и доработки. к сожалению./<br />
<br />
----------------------------------------<br />
<br />
Итак, код открыт и доступен. Надеюсь на ваше участие в дальнейшей дискуссии и разработке.</div>


<!-- END TEMPLATE: blog_entry_external -->]]></content:encoded>
			<dc:creator>fljot</dc:creator>
			<guid isPermaLink="true">http://www.flasher.ru/forum/blog.php?b=550</guid>
		</item>
		<item>
			<title>Меняем константы где захотим.</title>
			<link>http://www.flasher.ru/forum/blog.php?b=549</link>
			<pubDate>Tue, 20 Mar 2012 23:05:55 GMT</pubDate>
			<description>Немного магии рантайма. 
Иллюстрация того что можно менять константы объекта. Их менять можно только в конструкторе. Но вот ссылку на конструктор можно сохранить. И получить немного магии. 
Ловкость рук и никакого мошенничества. Код валиден и не генерирует варнингов в строгом режиме компиляци....</description>
			<content:encoded><![CDATA[<!-- BEGIN TEMPLATE: blog_entry_external -->
<div>Немного магии рантайма.<br />
Иллюстрация того что можно менять константы объекта. Их менять можно только в конструкторе. Но вот ссылку на конструктор можно сохранить. И получить немного магии.<br />
Ловкость рук и никакого мошенничества. Код валиден и не генерирует варнингов в строгом режиме компиляци.<br />
<!-- BEGIN TEMPLATE: bbcode_as3code -->
<div style="margin:20px; margin-top:5px">
	<div style="margin-bottom: 3px; width: 800px;" class="smallfont"><a href="#" onclick="collapseCode(this); return false;"><img style="margin-bottom: -3px;" border="0" src="images/russian/style3/buttons/collapse_thead_collapsed.gif" alt=""></a> Код AS3:</div>
	<pre dir="ltr" class="alt2" style="
		width: 800px;
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		height: 242px;
		text-align: left;
		overflow: auto;"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #6699cc; font-weight: bold;">package</span> <span style="color: #66cc66;">&#123;</span>
	<span style="color: #b1b100; font-weight: bold;">import</span> <span style="color: #6699cc;">flash.display</span>.Sprite;
&nbsp;
	<span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">class</span> Main extends <span style="color: #6699cc;">Sprite</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">function</span> Main<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #b1b100; font-weight: bold;">void</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100; font-weight: bold;">var</span> <span style="color: #6699cc;">test</span>:ConstTest = <span style="color: #b1b100; font-weight: bold;">new</span> ConstTest<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc; font-weight:bold;">15</span><span style="color: #66cc66;">&#41;</span>; 
			<span style="color: #6699cc;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #6699cc;">test</span>.constValue<span style="color: #66cc66;">&#41;</span>;
			<span style="color: #6699cc;">test</span>.setConstValue<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc; font-weight:bold;">10</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #FF00FF;">// some magic :)</span>
			<span style="color: #6699cc;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #6699cc;">test</span>.constValue<span style="color: #66cc66;">&#41;</span>;
			<span style="color: #6699cc;">test</span>.setConstValue<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc; font-weight:bold;">20</span><span style="color: #66cc66;">&#41;</span>;
			<span style="color: #6699cc;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #6699cc;">test</span>.constValue<span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></pre>
</div>
<!-- END TEMPLATE: bbcode_as3code --><!-- BEGIN TEMPLATE: bbcode_as3code -->
<div style="margin:20px; margin-top:5px">
	<div style="margin-bottom: 3px; width: 800px;" class="smallfont"><a href="#" onclick="collapseCode(this); return false;"><img style="margin-bottom: -3px;" border="0" src="images/russian/style3/buttons/collapse_thead_collapsed.gif" alt=""></a> Код AS3:</div>
	<pre dir="ltr" class="alt2" style="
		width: 800px;
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		height: 434px;
		text-align: left;
		overflow: auto;"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #6699cc; font-weight: bold;">package</span> <span style="color: #66cc66;">&#123;</span>
	<span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">class</span> ConstTest extends ConstTestBase <span style="color: #66cc66;">&#123;</span>
		<span style="color: #b1b100; font-weight: bold;">private</span> <span style="color: #b1b100; font-weight: bold;">var</span> _construcorMethod:Function;
		<span style="color: #b1b100; font-weight: bold;">private</span> <span style="color: #b1b100; font-weight: bold;">var</span> _inited:<span style="color: #6699cc;">Boolean</span> = false;
		<span style="color: #b1b100; font-weight: bold;">private</span> <span style="color: #b1b100; font-weight: bold;">var</span> _tempValue:<span style="color: #6699cc;">int</span> = <span style="color: #cc66cc; font-weight:bold;">0</span>;
		<span style="color: #b1b100; font-weight: bold;">public</span> const constValue:<span style="color: #6699cc;">int</span> = <span style="color: #cc66cc; font-weight:bold;">0</span>;
&nbsp;
		<span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">function</span> ConstTest<span style="color: #66cc66;">&#40;</span>someParam:<span style="color: #6699cc;">int</span> = <span style="color: #cc66cc; font-weight:bold;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span> <span style="color: #FF00FF;">// Можем юзать любые параметры. Но обязательно задать значение по умолчанию</span>
			<span style="color: #b1b100; font-weight: bold;">if</span> <span style="color: #66cc66;">&#40;</span>!<span style="color: #b1b100; font-weight: bold;">this</span>._inited<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
				<span style="color: #b1b100; font-weight: bold;">super</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #FF00FF;">//NOTE: ОБЯЗАТЕЛЬНО. иначе компилятор сам добавить вызов конструктора предка выше и он будет вызываться много раз.</span>
				<span style="color: #b1b100; font-weight: bold;">this</span>._construcorMethod = <span style="color: #6699cc;">arguments</span>.callee;
				<span style="color: #b1b100; font-weight: bold;">this</span>._inited = true;
				<span style="color: #FF00FF;">// обычный код коструктора который нам нужен</span>
				<span style="color: #6699cc;">trace</span><span style="color: #66cc66;">&#40;</span>&quot;ConstTest constructed, param:&quot;,someParam<span style="color: #66cc66;">&#41;</span>;
			<span style="color: #66cc66;">&#125;</span>
			<span style="color: #b1b100; font-weight: bold;">else</span> <span style="color: #66cc66;">&#123;</span>
				<span style="color: #b1b100; font-weight: bold;">this</span><span style="color: #66cc66;">&#91;</span>&quot;constValue&quot;<span style="color: #66cc66;">&#93;</span> = <span style="color: #b1b100; font-weight: bold;">this</span>._tempValue; <span style="color: #FF00FF;">//NOTE: в строгом режиме компиляци явно менять константы нельзя вообще, поэтому перенесём резолвинг в рантайм.</span>
			<span style="color: #66cc66;">&#125;</span>
		<span style="color: #66cc66;">&#125;</span>
&nbsp;
		<span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">function</span> setConstValue<span style="color: #66cc66;">&#40;</span><span style="color: #6699cc;">value</span>:<span style="color: #6699cc;">int</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #b1b100; font-weight: bold;">void</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #b1b100; font-weight: bold;">this</span>._tempValue = value;
			<span style="color: #b1b100; font-weight: bold;">this</span>._construcorMethod<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		<span style="color: #66cc66;">&#125;</span>
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></pre>
</div>
<!-- END TEMPLATE: bbcode_as3code --><!-- BEGIN TEMPLATE: bbcode_as3code -->
<div style="margin:20px; margin-top:5px">
	<div style="margin-bottom: 3px; width: 800px;" class="smallfont"><a href="#" onclick="collapseCode(this); return false;"><img style="margin-bottom: -3px;" border="0" src="images/russian/style3/buttons/collapse_thead_collapsed.gif" alt=""></a> Код AS3:</div>
	<pre dir="ltr" class="alt2" style="
		width: 800px;
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		height: 130px;
		text-align: left;
		overflow: auto;"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #6699cc; font-weight: bold;">package</span> <span style="color: #66cc66;">&#123;</span>
	<span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">class</span> ConstTestBase <span style="color: #66cc66;">&#123;</span>
		<span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">function</span> ConstTestBase<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			<span style="color: #6699cc;">trace</span><span style="color: #66cc66;">&#40;</span>&quot;ConstTestBase constructed&quot;<span style="color: #66cc66;">&#41;</span>; <span style="color: #FF00FF;">// Это чтоб показать что конструктор предка вызывается корректно</span>
		<span style="color: #66cc66;">&#125;</span>
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></pre>
</div>
<!-- END TEMPLATE: bbcode_as3code -->На выводе имем<br />
<!-- BEGIN TEMPLATE: bbcode_code -->
<div style="margin:20px; margin-top:5px">
	<div style="margin-bottom: 3px; width: 800px;" class="smallfont"><a href="#" onclick="collapseCode(this); return false;"><img style="margin-bottom: -3px;" border="0" src="images/russian/style3/buttons/collapse_thead_collapsed.gif" alt=""></a> Код:</div>
	<pre class="alt2" dir="ltr" style="
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		width: 800px;
		height: 98px;
		text-align: left;
		overflow: auto">ConstTestBase constructed
ConstTest constructed, param: 15
0
10
20</pre>
</div>
<!-- END TEMPLATE: bbcode_code --><a href="http://dl.************/u/12212546/test_ru.zip" target="_blank">Проект FD</a></div>


<!-- END TEMPLATE: blog_entry_external -->]]></content:encoded>
			<dc:creator>Aquahawk</dc:creator>
			<guid isPermaLink="true">http://www.flasher.ru/forum/blog.php?b=549</guid>
		</item>
		<item>
			<title>Выравнивание окна ФП для дебага во ФД.</title>
			<link>http://www.flasher.ru/forum/blog.php?b=547</link>
			<pubDate>Sun, 11 Mar 2012 22:33:16 GMT</pubDate>
			<description>Иногда складывается такая ситуация, что работать приходится на ноутбуке. Ряд тем на форуме показали, что не я один такой, кто-то даже предпочитает такой подход. По своему опыту скажу, что дебажить порой в таких условиях не совсем удобно (по крайней мере во FlashDevelop (ФД), на пользователей...</description>
			<content:encoded><![CDATA[<!-- BEGIN TEMPLATE: blog_entry_external -->
<div>Иногда складывается такая ситуация, что работать приходится на ноутбуке. Ряд тем на форуме показали, что не я один такой, кто-то даже предпочитает такой подход. По своему опыту скажу, что дебажить порой в таких условиях не совсем удобно (по крайней мере во FlashDevelop (ФД), на пользователей которого и рассчитана статья): при установке точки останова, особенно если она срабатывает в самом начале работы программы, на передний план выходит окно ФД, и при этом не видно что же отображается в плеере. Если таких точек много и/или они срабатывают в цикле, то проблема становится более ощутимой. Приходится предварительно ровнять окна ФП и ФД, возможно, придумывать какие-то временные решения.<br />
Не скажу что подобные ситуации бывают происходят часто, даже наоборот, но все же.<br />
<br />
Если это кому-то интересно и проблема актуальна... Суть в том, что перед запуском ФП запускается некое приложение, которое позиционирует ФД и ФП наиболее выгодным (по крайней мере так рассчитываю) способом.<br />
<br />
Сразу предложу на суд публики саму программу <a href="http://www.flasher.ru/forum/blog_attachment.php?attachmentid=257" target="_blank">Вложение 257</a> (вложение куда-то пропало, ознакомиться с ним можно в выложенном проекте, там ссылка валидная)<br />
<br />
Теперь немного по настройкам, особенностям и благодарности.<br />
<br />
Как уже обсуждалось в одной <a href="http://www.flasher.ru/forum/showthread.php?t=175932" target="_blank">теме</a> FD запускает только *.bat-файлы, при чем делает их &quot;зависимыми&quot; от своей работы. Для этого создаем vbs-файл, который позволяет обойти (за это отдельное спасибо <a href="http://www.flasher.ru/forum/member.php?u=37156" target="_blank"><b>alexcon314</b></a>-у) такое ограничение, главное немного уделить внимания путям.<br />
Пример почти пустого приложения: <a href="http://www.flasher.ru/forum/blog_attachment.php?attachmentid=259&amp;d=1331504897" >NewProject.rar</a><br />
<br />
ФД довольно странно иногда работает. К примеру, если в пустом проекте поставить точку останова (entry point), то сначала сработает точка, а сам ФП появится только после того, как мы пройдем дальше или попытка повлиять на ФП обернется неудачей ввиду того, что приложение &quot;Не отвечает&quot;. Поэтому для таких случаев данное приложение скорее всего не подойдет и необходимо изобретать что-то еще. В прикрепленном примере специально грузится картинка в надежде на то, что она не успеет загрузиться до появления окна ФП. Думаю, что это самое узкое место программы.<br />
Если у вас одновременно запущено несколько версий ФД, то все они будут позиционироваться согласно условиям (проверка на активное приложение в момент начала компиляции отсутствует). А условия такие, что окно ФД занимает всю возможную высоту экрана, а по ширине становится 850 пикселей. Опытным путем вычислено, что столько необходимо для корректного отображения всех кнопок, используемых при дебаге (если при этом не установлены плагины, меняющие их положение). По ширине все оставшееся пространство занимает окно ФП, по высоте происходит подстановка соответственно исходным пропорциям. При этом скорее всего произойдет уменьшение размера, поэтому необходимо изначально продумать способ отображения всего контента, не зависимо от размера браузера, наиболее простым способом считаю<br />
<!-- BEGIN TEMPLATE: bbcode_as3code -->
<div style="margin:20px; margin-top:5px">
	<div style="margin-bottom: 3px; width: 800px;" class="smallfont"><a href="#" onclick="collapseCode(this); return false;"><img style="margin-bottom: -3px;" border="0" src="images/russian/style3/buttons/collapse_thead_collapsed.gif" alt=""></a> Код AS3:</div>
	<pre dir="ltr" class="alt2" style="
		width: 800px;
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		height: 34px;
		text-align: left;
		overflow: auto;"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #6699cc;">stage</span>.<span style="color: #6699cc;">scaleMode</span> = <span style="color: #6699cc;">StageScaleMode</span>.EXACT_FIT;</pre></pre>
</div>
<!-- END TEMPLATE: bbcode_as3code -->Для удобства такое масштабирование можно использовать только для дебаг-версии.<br />
Выборка процессов осуществляется по их имени (есть еще парочка проверок), поэтому теоретически возможны связанные с этим проблемы, но если специально не пытаться подловить приложение на таких ошибках, то вероятность такого развития событий стремиться к 0.<br />
<br />
Что меня интересует. Действительно ли востребовано? Есть ли баги, особенно вне описанных выше ситуаций (тестировал только на своей машине, а опыт программирования подобных приложений минимальный)? Пожелания?</div>


<!-- END TEMPLATE: blog_entry_external -->]]></content:encoded>
			<dc:creator>TanaTiX</dc:creator>
			<guid isPermaLink="true">http://www.flasher.ru/forum/blog.php?b=547</guid>
		</item>
		<item>
			<title>Работа с математикой Number при твининге DisplayObject</title>
			<link>http://www.flasher.ru/forum/blog.php?b=546</link>
			<pubDate>Tue, 06 Mar 2012 03:57:51 GMT</pubDate>
			<description>Казалось бы, какие тут могут быть сложности? В конструктор собственного твинера передаём ссылку на объект, параметр, который надо бы менять, конечное значение и время/кадры, за которое этот параметр должен плавно принять конечный вид. Для простоты возьмём случай покадрового изменения значения:...</description>
			<content:encoded><![CDATA[<!-- BEGIN TEMPLATE: blog_entry_external -->
<div>Казалось бы, какие тут могут быть сложности? В конструктор собственного твинера передаём ссылку на объект, параметр, который надо бы менять, конечное значение и время/кадры, за которое этот параметр должен плавно принять конечный вид. Для простоты возьмём случай покадрового изменения значения:<br />
<!-- BEGIN TEMPLATE: bbcode_as3code -->
<div style="margin:20px; margin-top:5px">
	<div style="margin-bottom: 3px; width: 800px;" class="smallfont"><a href="#" onclick="collapseCode(this); return false;"><img style="margin-bottom: -3px;" border="0" src="images/russian/style3/buttons/collapse_thead_collapsed.gif" alt=""></a> Код AS3:</div>
	<pre dir="ltr" class="alt2" style="
		width: 800px;
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		height: 226px;
		text-align: left;
		overflow: auto;"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">class</span> SomeTweener <span style="color: #66cc66;">&#123;</span>
	<span style="color: #b1b100; font-weight: bold;">private</span> <span style="color: #b1b100; font-weight: bold;">var</span> _obj:Object;
	<span style="color: #b1b100; font-weight: bold;">private</span> <span style="color: #b1b100; font-weight: bold;">var</span> _paramName:String;
	<span style="color: #b1b100; font-weight: bold;">private</span> <span style="color: #b1b100; font-weight: bold;">var</span> _endValue:Number;
	<span style="color: #b1b100; font-weight: bold;">private</span> <span style="color: #b1b100; font-weight: bold;">var</span> _frames:Number;
&nbsp;
	<span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">function</span> SomeTweener<span style="color: #66cc66;">&#40;</span>obj:<span style="color: #6699cc;">Object</span>, paramName:<span style="color: #6699cc;">String</span>, endValue:<span style="color: #6699cc;">Number</span>, frames:<span style="color: #6699cc;">Number</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		_obj = obj;
		_paramName = paramName;
		_endValue = endValue;
		_frames = frames;
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></pre>
</div>
<!-- END TEMPLATE: bbcode_as3code -->Да, самым простым способом определить, когда настало время обновить значение, будет подписка на событие <i>Event.ENTER_FRAME</i> у передаваемого в конструктор <i>DisplayObject</i>. Однако мы не ищем лёгких путей и делаем твинер универсальным. То есть таким, который меняет параметры не только <i>DisplayObject</i>'а. Поэтому придётся использовать ещё одну <s>недокументированную</s> малоизвестную особенность as3: <!-- BEGIN TEMPLATE: bbcode_quote -->
<div style="margin:20px; margin-top:5px; ">
	<div class="smallfont" style="margin-bottom:2px">Цитата:</div>
	<table cellpadding="6" cellspacing="0" border="0" width="100%">
	<tr>
		<td class="alt2" style="border:1px inset">
			
				Любой DisplayObject, даже не добавленный в DisplayList исправно получает событие входа на кадр.
			
		</td>
	</tr>
	</table>
</div>
<!-- END TEMPLATE: bbcode_quote -->Меняем конструктор:<br />
<!-- BEGIN TEMPLATE: bbcode_as3code -->
<div style="margin:20px; margin-top:5px">
	<div style="margin-bottom: 3px; width: 800px;" class="smallfont"><a href="#" onclick="collapseCode(this); return false;"><img style="margin-bottom: -3px;" border="0" src="images/russian/style3/buttons/collapse_thead_collapsed.gif" alt=""></a> Код AS3:</div>
	<pre dir="ltr" class="alt2" style="
		width: 800px;
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		height: 386px;
		text-align: left;
		overflow: auto;"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #b1b100; font-weight: bold;">import</span> <span style="color: #6699cc;">flash.display</span>.Shape;
<span style="color: #b1b100; font-weight: bold;">import</span> <span style="color: #6699cc;">flash.events</span>.Event;
<span style="color: #b1b100; font-weight: bold;">import</span> <span style="color: #6699cc;">flash.events</span>.IEventDispatcher;
&nbsp;
<span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">class</span> SomeTweener <span style="color: #66cc66;">&#123;</span>
	<span style="color: #b1b100; font-weight: bold;">private</span> <span style="color: #b1b100; font-weight: bold;">var</span> _obj:Object;
	<span style="color: #b1b100; font-weight: bold;">private</span> <span style="color: #b1b100; font-weight: bold;">var</span> _paramName:String;
	<span style="color: #b1b100; font-weight: bold;">private</span> <span style="color: #b1b100; font-weight: bold;">var</span> _endValue:Number;
	<span style="color: #b1b100; font-weight: bold;">private</span> <span style="color: #b1b100; font-weight: bold;">var</span> _frames:Number;
	<span style="color: #b1b100; font-weight: bold;">private</span> <span style="color: #b1b100; font-weight: bold;">var</span> eventDispatcher:IEventDispatcher;
&nbsp;
	<span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">function</span> SomeTweener<span style="color: #66cc66;">&#40;</span>obj:<span style="color: #6699cc;">Object</span>, paramName:<span style="color: #6699cc;">String</span>, endValue:<span style="color: #6699cc;">Number</span>, frames:<span style="color: #6699cc;">Number</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		_obj = obj;
		_paramName = paramName;
		_endValue = endValue;
		_frames = frames;
		eventDispatcher = <span style="color: #b1b100; font-weight: bold;">new</span> <span style="color: #6699cc;">Shape</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		eventDispatcher.<span style="color: #6699cc;">addEventListener</span><span style="color: #66cc66;">&#40;</span><span style="color: #6699cc;">Event</span>.<span style="color: #6699cc;">ENTER_FRAME</span>, tween<span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #b1b100; font-weight: bold;">private</span> <span style="color: #6699cc; font-weight: bold;">function</span> tween<span style="color: #66cc66;">&#40;</span>e:<span style="color: #6699cc;">Event</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #b1b100; font-weight: bold;">void</span> <span style="color: #66cc66;">&#123;</span>
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></pre>
</div>
<!-- END TEMPLATE: bbcode_as3code -->Можете проверить сами. Метод <i>tween</i> будет исправно вызываться с частотой fps. <br />
<br />
Идём дальше. Опять же по наипростейшему пути - каждый вызов <i>tween</i> мы меняем переданное значение на одну и ту же величину (твининг типа easeNone - то есть равномерный). Для этого лучше ещё в конструкторе рассчитать покадровый инкремент, исходя из разницы между конечным и стартовым значениями и продолжительностью твина, и записать инкремент в поле класса. В самом методе <i>tween</i> мы будем проверять, сколько кадров твининг уже длится и по достижении заданного значения - прерывать твининг:<br />
<br />
<!-- BEGIN TEMPLATE: bbcode_as3code -->
<div style="margin:20px; margin-top:5px">
	<div style="margin-bottom: 3px; width: 800px;" class="smallfont"><a href="#" onclick="collapseCode(this); return false;"><img style="margin-bottom: -3px;" border="0" src="images/russian/style3/buttons/collapse_thead_collapsed.gif" alt=""></a> Код AS3:</div>
	<pre dir="ltr" class="alt2" style="
		width: 800px;
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		height: 498px;
		text-align: left;
		overflow: auto;"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #b1b100; font-weight: bold;">import</span> <span style="color: #6699cc;">flash.display</span>.Shape;
<span style="color: #b1b100; font-weight: bold;">import</span> <span style="color: #6699cc;">flash.events</span>.Event;
<span style="color: #b1b100; font-weight: bold;">import</span> <span style="color: #6699cc;">flash.events</span>.IEventDispatcher;
&nbsp;
<span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">class</span> SomeTweener <span style="color: #66cc66;">&#123;</span>
	<span style="color: #b1b100; font-weight: bold;">private</span> <span style="color: #b1b100; font-weight: bold;">var</span> _obj:Object;
	<span style="color: #b1b100; font-weight: bold;">private</span> <span style="color: #b1b100; font-weight: bold;">var</span> _paramName:String;
	<span style="color: #b1b100; font-weight: bold;">private</span> <span style="color: #b1b100; font-weight: bold;">var</span> _endValue:Number;
	<span style="color: #b1b100; font-weight: bold;">private</span> <span style="color: #b1b100; font-weight: bold;">var</span> _frames:Number;
	<span style="color: #b1b100; font-weight: bold;">private</span> <span style="color: #b1b100; font-weight: bold;">var</span> eventDispatcher:IEventDispatcher;
	<span style="color: #b1b100; font-weight: bold;">private</span> <span style="color: #b1b100; font-weight: bold;">var</span> increment:Number;
&nbsp;
	<span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">function</span> SomeTweener<span style="color: #66cc66;">&#40;</span>obj:<span style="color: #6699cc;">Object</span>, paramName:<span style="color: #6699cc;">String</span>, endValue:<span style="color: #6699cc;">Number</span>, frames:<span style="color: #6699cc;">Number</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		_obj = obj;
		_paramName = paramName;
		_endValue = endValue;
		_frames = frames;
		increment = <span style="color: #66cc66;">&#40;</span>endValue - <span style="color: #6699cc;">Number</span><span style="color: #66cc66;">&#40;</span>obj<span style="color: #66cc66;">&#91;</span>paramName<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>/frames;
		eventDispatcher = <span style="color: #b1b100; font-weight: bold;">new</span> <span style="color: #6699cc;">Shape</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		eventDispatcher.<span style="color: #6699cc;">addEventListener</span><span style="color: #66cc66;">&#40;</span><span style="color: #6699cc;">Event</span>.<span style="color: #6699cc;">ENTER_FRAME</span>, tween<span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #b1b100; font-weight: bold;">private</span> <span style="color: #6699cc; font-weight: bold;">function</span> tween<span style="color: #66cc66;">&#40;</span>e:<span style="color: #6699cc;">Event</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #b1b100; font-weight: bold;">void</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #b1b100; font-weight: bold;">if</span> <span style="color: #66cc66;">&#40;</span>_frames == <span style="color: #cc66cc; font-weight:bold;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			e.<span style="color: #6699cc;">currentTarget</span>.<span style="color: #6699cc;">removeEventListener</span><span style="color: #66cc66;">&#40;</span>e.<span style="color: #6699cc;">type</span>, tween<span style="color: #66cc66;">&#41;</span>;
			return;
		<span style="color: #66cc66;">&#125;</span>
		obj<span style="color: #66cc66;">&#91;</span>paramName<span style="color: #66cc66;">&#93;</span> += increment;
		_frames--;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span></pre></pre>
</div>
<!-- END TEMPLATE: bbcode_as3code -->Нет ничего страшного в том, чтобы использовать <i>frames</i> как счётчик оставшихся &quot;тиков&quot; твининга: мы договорились не использовать секунды в качестве времени твина. Более того, кроме как в конструкторе параметр <i>frames</i> нигде не используется и никто (даже мы) не станет нас обвинять в том, что мы меняем переданную по значению переменную в своих целях.<br />
<br />
Казалось бы - всё, твинер готов. И он даже будет работать, а в большинстве случаев - ещё и правильно. Но есть один случай, когда он ни в коем случае не выдаст нормального результата. Приведу небольшой пример:<br />
<!-- BEGIN TEMPLATE: bbcode_as3code -->
<div style="margin:20px; margin-top:5px">
	<div style="margin-bottom: 3px; width: 800px;" class="smallfont"><a href="#" onclick="collapseCode(this); return false;"><img style="margin-bottom: -3px;" border="0" src="images/russian/style3/buttons/collapse_thead_collapsed.gif" alt=""></a> Код AS3:</div>
	<pre dir="ltr" class="alt2" style="
		width: 800px;
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		height: 258px;
		text-align: left;
		overflow: auto;"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #b1b100; font-weight: bold;">import</span> <span style="color: #6699cc;">flash.display</span>.Sprite;
<span style="color: #b1b100; font-weight: bold;">import</span> <span style="color: #6699cc;">flash.events</span>.Event;
&nbsp;
<span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">class</span> SomeClass extends <span style="color: #6699cc;">Sprite</span> <span style="color: #66cc66;">&#123;</span>
	<span style="color: #b1b100; font-weight: bold;">private</span> <span style="color: #b1b100; font-weight: bold;">var</span> sprite:Sprite;
	<span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">function</span> SomeClass<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		sprite = <span style="color: #b1b100; font-weight: bold;">new</span> <span style="color: #6699cc;">Sprite</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		sprite.<span style="color: #6699cc;">x</span> = <span style="color: #cc66cc; font-weight:bold;">1</span>;
		sprite.<span style="color: #6699cc;">addEventListener</span><span style="color: #66cc66;">&#40;</span><span style="color: #6699cc;">Event</span>.<span style="color: #6699cc;">ENTER_FRAME</span>, traceSome<span style="color: #66cc66;">&#41;</span>;
		<span style="color: #b1b100; font-weight: bold;">var</span> tween:SomeTweener = <span style="color: #b1b100; font-weight: bold;">new</span> SomeTweener<span style="color: #66cc66;">&#40;</span>sprite, <span style="color: #990000;">'x'</span>, -<span style="color: #cc66cc; font-weight:bold;">1</span>, <span style="color: #cc66cc; font-weight:bold;">40</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
	<span style="color: #b1b100; font-weight: bold;">private</span> <span style="color: #6699cc; font-weight: bold;">function</span> traceSome<span style="color: #66cc66;">&#40;</span>e:<span style="color: #6699cc;">Event</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #b1b100; font-weight: bold;">void</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #6699cc;">trace</span><span style="color: #66cc66;">&#40;</span>sprite.<span style="color: #6699cc;">x</span><span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></pre>
</div>
<!-- END TEMPLATE: bbcode_as3code -->Что нам даст трейс в результате вызова этого кода? По логике вещей - столбец из сорока чисел уменьшающихся с шагом в 0.05. На практике же у любого <i>DisplayObject</i> есть ещё как минимум одна недокументированная особенность: его координаты (а возможно и некоторые другие свойства) всегда кратны 0.05. Попытка присвоить им некратное значение провалится: при следующей отрисовке оно будет округлено  до ближайшего к нулю кратного. В данном конкретном примере этот эффект не должен нам угрожать (на самом деле - он проявляется во всей красе), но, к примеру, увеличив значение кадров, в течение которых должен проявиться твининг, до 80, мы получим инкремент равный 0.025 и трейс &quot;зависнет&quot; на нуле, так никогда и не достигнув -1.<br />
<br />
Есть и другая особенность. В среде исполнения <i>FlashPlayer</i> тип <i>Number</i> является &quot;64х битным числом с плавающей запятой&quot; <a href="http://flasher.ru/forum/showpost.php?p=973928&amp;postcount=4" target="_blank">©</a> i.o. Из-за этого достаточно часто случаются накладки. Проще всего объяснить на примере:<br />
<!-- BEGIN TEMPLATE: bbcode_as3code -->
<div style="margin:20px; margin-top:5px">
	<div style="margin-bottom: 3px; width: 800px;" class="smallfont"><a href="#" onclick="collapseCode(this); return false;"><img style="margin-bottom: -3px;" border="0" src="images/russian/style3/buttons/collapse_thead_collapsed.gif" alt=""></a> Код AS3:</div>
	<pre dir="ltr" class="alt2" style="
		width: 800px;
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		height: 34px;
		text-align: left;
		overflow: auto;"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #6699cc;">trace</span><span style="color: #66cc66;">&#40;</span><span style="color: #6699cc;">String</span><span style="color: #66cc66;">&#40;</span>-.35 - .05<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #FF00FF;">// 0.39(9)97</span></pre></pre>
</div>
<!-- END TEMPLATE: bbcode_as3code -->Так ведёт себя флеш со всеми значениями типа <i>Number</i> (к коим относятся и поля координат <i>DisplayObject</i>), тут уж ничего не поделаешь. Вполне естественно, что пример работы метода traceSome нашего класса <i>SomeClass</i> будет сбоить даже при твининге на 40 кадров. Практика показала, что <i>sprite.x</i> не сможет сдвинуться именно со значения -0.35 будучи каждый кадр до него округлённым. Цикл таков: <br />
<!-- BEGIN TEMPLATE: bbcode_quote -->
<div style="margin:20px; margin-top:5px; ">
	<div class="smallfont" style="margin-bottom:2px">Цитата:</div>
	<table cellpadding="6" cellspacing="0" border="0" width="100%">
	<tr>
		<td class="alt2" style="border:1px inset">
			
				1) Берём значение поля объекта (-0.35)<br />
2) Наращиваем его на значение инкремента (-0.35 + (-0.05) = -0.39(9)97)<br />
3) Записываем его в поле объекта (-0.39(9)97)<br />
4) (Скрытый обязательный пункт) Значение поля координаты экземпляра DisplayObject округляется (-0.35)<br />
5) Входим на следующий кадр и берём значение поля объекта (-0.35)<br />
6) GOTO 2)
			
		</td>
	</tr>
	</table>
</div>
<!-- END TEMPLATE: bbcode_quote -->Избавиться от скрытого четвёртого пункта невозможно. Однако ошибка, вызванная симбиозом математики <i>Number</i> и ограничениями значений координат <i>DisplayObject</i> обходится нами ровно тремя лишними строками. Для этого необходимо изменить первый и пятый пункт цикла и вместо перманентно &quot;портящегося&quot; хранилища значения, завести своё:<br />
<!-- BEGIN TEMPLATE: bbcode_as3code -->
<div style="margin:20px; margin-top:5px">
	<div style="margin-bottom: 3px; width: 800px;" class="smallfont"><a href="#" onclick="collapseCode(this); return false;"><img style="margin-bottom: -3px;" border="0" src="images/russian/style3/buttons/collapse_thead_collapsed.gif" alt=""></a> Код AS3:</div>
	<pre dir="ltr" class="alt2" style="
		width: 800px;
		margin: 0px;
		padding: 6px;
		border: 1px inset;
		height: 498px;
		text-align: left;
		overflow: auto;"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #b1b100; font-weight: bold;">import</span> <span style="color: #6699cc;">flash.display</span>.Shape;
<span style="color: #b1b100; font-weight: bold;">import</span> <span style="color: #6699cc;">flash.events</span>.Event;
<span style="color: #b1b100; font-weight: bold;">import</span> <span style="color: #6699cc;">flash.events</span>.IEventDispatcher;
&nbsp;
<span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">class</span> SomeTweener <span style="color: #66cc66;">&#123;</span>
	<span style="color: #b1b100; font-weight: bold;">private</span> <span style="color: #b1b100; font-weight: bold;">var</span> _obj:Object;
	<span style="color: #b1b100; font-weight: bold;">private</span> <span style="color: #b1b100; font-weight: bold;">var</span> _paramName:String;
	<span style="color: #b1b100; font-weight: bold;">private</span> <span style="color: #b1b100; font-weight: bold;">var</span> _endValue:Number;
	<span style="color: #b1b100; font-weight: bold;">private</span> <span style="color: #b1b100; font-weight: bold;">var</span> _frames:Number;
	<span style="color: #b1b100; font-weight: bold;">private</span> <span style="color: #b1b100; font-weight: bold;">var</span> eventDispatcher:IEventDispatcher;
	<span style="color: #b1b100; font-weight: bold;">private</span> <span style="color: #b1b100; font-weight: bold;">var</span> increment:Number;
	<span style="color: #b1b100; font-weight: bold;">private</span> <span style="color: #b1b100; font-weight: bold;">var</span> currentValue:Number;
&nbsp;
	<span style="color: #b1b100; font-weight: bold;">public</span> <span style="color: #6699cc; font-weight: bold;">function</span> SomeTweener<span style="color: #66cc66;">&#40;</span>obj:<span style="color: #6699cc;">Object</span>, paramName:<span style="color: #6699cc;">String</span>, endValue:<span style="color: #6699cc;">Number</span>, frames:<span style="color: #6699cc;">Number</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
		_obj = obj;
		_paramName = paramName;
		_endValue = endValue;
		_frames = frames;
		currentValue = <span style="color: #6699cc;">Number</span><span style="color: #66cc66;">&#40;</span>obj<span style="color: #66cc66;">&#91;</span>paramName<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>;
		increment = <span style="color: #66cc66;">&#40;</span>endValue - <span style="color: #6699cc;">Number</span><span style="color: #66cc66;">&#40;</span>obj<span style="color: #66cc66;">&#91;</span>paramName<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>/frames;
		eventDispatcher = <span style="color: #b1b100; font-weight: bold;">new</span> <span style="color: #6699cc;">Shape</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
		eventDispatcher.<span style="color: #6699cc;">addEventListener</span><span style="color: #66cc66;">&#40;</span><span style="color: #6699cc;">Event</span>.<span style="color: #6699cc;">ENTER_FRAME</span>, tween<span style="color: #66cc66;">&#41;</span>;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
	<span style="color: #b1b100; font-weight: bold;">private</span> <span style="color: #6699cc; font-weight: bold;">function</span> tween<span style="color: #66cc66;">&#40;</span>e:<span style="color: #6699cc;">Event</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #b1b100; font-weight: bold;">void</span> <span style="color: #66cc66;">&#123;</span>
		<span style="color: #b1b100; font-weight: bold;">if</span> <span style="color: #66cc66;">&#40;</span>_frames == <span style="color: #cc66cc; font-weight:bold;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
			e.<span style="color: #6699cc;">currentTarget</span>.<span style="color: #6699cc;">removeEventListener</span><span style="color: #66cc66;">&#40;</span>e.<span style="color: #6699cc;">type</span>, tween<span style="color: #66cc66;">&#41;</span>;
			return;
		<span style="color: #66cc66;">&#125;</span>
		currentValue += increment;
		obj<span style="color: #66cc66;">&#91;</span>paramName<span style="color: #66cc66;">&#93;</span> = currentValue;
		_frames--;
	<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #66cc66;">&#125;</span></pre></pre>
</div>
<!-- END TEMPLATE: bbcode_as3code -->Казалось бы, при чём тут MVC? :-)<br />
<br />
P.S.: Да, существующий код твинера можно и нужно улучшать. Добавить отложенный запуск, рассылку сообщений. Можно добавить easing и прочий мультифилд-твин. И да, весьма полезным, хоть и расходующим память, будет подход с предварительным предрассчётом массива всех позиций параметра, подвергаемого твинингу. Но к данной задаче это не относится, а потому оставим в качестве домашнего задания.</div>


<!-- END TEMPLATE: blog_entry_external -->]]></content:encoded>
			<dc:creator>BuKT</dc:creator>
			<guid isPermaLink="true">http://www.flasher.ru/forum/blog.php?b=546</guid>
		</item>
		<item>
			<title>Основы создания 2д анимации на примере</title>
			<link>http://www.flasher.ru/forum/blog.php?b=541</link>
			<pubDate>Sat, 25 Feb 2012 11:38:18 GMT</pubDate>
			<description><![CDATA[*По кадровая, ручная рисовка + возможности "высоких технологий".* 
 
Здесь я расскажу именно об принципе создания анимации в 2д, о том как совмещать ручную по кадровую рисовку с программным движением. Я не буду рассказывать об интерфейсе какой-либо программы, куда нужно тыкать/нажимать или т.п. 
...]]></description>
			<content:encoded><![CDATA[<!-- BEGIN TEMPLATE: blog_entry_external -->
<div><b>По кадровая, ручная рисовка + возможности &quot;высоких технологий&quot;.</b><br />
<br />
<i>Здесь я расскажу именно об принципе создания анимации в 2д, о том как совмещать ручную по кадровую рисовку с программным движением. Я не буду рассказывать об интерфейсе какой-либо программы, куда нужно тыкать/нажимать или т.п.</i><br />
<br />
Погнали:<br />
В основе любой 2д анимации есть 2 типа движения, а из них уже создается все остальное:<ol style="list-style-type: decimal"><li><b>Программное движение объекта: когда вы задаете начальную и конечную точки, а промежуточные кадры высчитываются автоматически</b> (собсно это и есть High tech)</li>
<li><b>По кадровая рисовка вручную</b></li>
</ol><br />
<b>Программное движение объекта:</b><br />
Чтобы хорошо понять суть современной 2д анимации, представьте себе слои на которых вы рисуете - как прозрачные листы:<br />
<img src="http://s1.hostingkartinok.com/uploads/images/2012/02/ca4677e7f96e124702f1dfe43ca911ab.gif" border="0" alt="" /><br />
<br />
Допустим мы хотим нарисовать машинку едущую по дороге (вид сверху). В таком случае, на первом листе мы рисуем дорогу, на втором машинку:<br />
<img src="http://s1.hostingkartinok.com/uploads/images/2012/02/d0a128c9603e5c823d12a8229b69b763.gif" border="0" alt="" /><br />
<br />
Наложив их друг на друга, получаем общую картину - машинка на дороге. Далее нужно сымитировать движение. Для этого, мы сделаем так, чтобы лист с дорогой постепенно уходил вниз, имитируя тем самым &quot;езду&quot; машинки. Мы зададим для слоя с дорогой - начальное и конечное положение, а также время за которое он должен переместиться. Все остальное за нас посчитают:<br />
<img src="http://s1.hostingkartinok.com/uploads/images/2012/02/17688b52473f2f7d236b13e3e172b6de.gif" border="0" alt="" /><br />
<br />
Нечто похожее на езду у нас уже есть. Доработаем анимацию, добавим к дороге ещё один лист, теперь у нас всего будет - 3 листа:<br />
<img src="http://s1.hostingkartinok.com/uploads/images/2012/02/3f73032184acdc82c1165fa912c82624.gif" border="0" alt="" /><br />
<br />
Анимация дороги готова, но не забываем, что мы можем также двигать и слой с машинкой! Давайте сделаем её немного более живой. И ещё один момент: движение для слоев можно задавать не только по горизонтали или вертикали, их можно двигать, крутить, масштабировать, сплющивать, добавлять фильтры, маски и ещё много чего.<br />
<img src="http://s1.hostingkartinok.com/uploads/images/2012/02/6980cb21a20416b59e5b4717ebcbf935.gif" border="0" alt="" /><br />
<br />
Такой способ анимации довольно простой и самое главное - быстрый, в плане создания. Так как от аниматора требуется всего лишь задавать начальные и конечные параметры для слоев. (Ну разве не высокие технологий?)<br />
<br />
<b>По кадровая рисовка вручную:</b><br />
Этот же способ применяется там, где средствами программного движения добиться нужного эффекта - невозможно. Например: взгляд на объект под разным углом.<br />
<br />
Итак, допустим мы хотим сделать, чтобы наша машинка &quot;раскачивалась&quot; при езде. Для этого, мы вручную рисуем каждый кадр:<br />
<img src="http://s1.hostingkartinok.com/uploads/images/2012/02/b45377d42f27a8b4c9871cc240bfc354.gif" border="0" alt="" /><img src="http://s1.hostingkartinok.com/uploads/images/2012/02/d3b22d6eb653224366f39b8f9afd025b.gif" border="0" alt="" /><br />
<br />
Помещаем раскачивающуюся машинку в <b><u>двигающийся</u></b> лист 1:<br />
<img src="http://s1.hostingkartinok.com/uploads/images/2012/02/8bb70c3c5ef366acee8dc9a59a12b189.gif" border="0" alt="" /><br />
Мы только-что объединили оба способа анимации!<br />
<br />
Но на этом дело не ограничивается, сейчас у нас есть 3 листа, которые двигаются сами по себе. Эти три листа можно поместить &quot;внутрь&quot; другого - четвёртого листа. Он может быть чем угодно, от заднего фона до человеческого зрачка. В нашем случае это - телевизор с захватывающим блок бастером в эфире:<br />
<img src="http://s1.hostingkartinok.com/uploads/images/2012/02/7f9c9dfa6927a74afea46f143ab87b2a.gif" border="0" alt="" /><br />
<br />
Вот и вся магия 2д. Такой принцип &quot;по кадровой + программной&quot; анимации используется везде, от игр до аниме.</div>


<!-- END TEMPLATE: blog_entry_external -->]]></content:encoded>
			<dc:creator>Tails</dc:creator>
			<guid isPermaLink="true">http://www.flasher.ru/forum/blog.php?b=541</guid>
		</item>
		<item>
			<title>Критика Presentation Model</title>
			<link>http://www.flasher.ru/forum/blog.php?b=537</link>
			<pubDate>Sat, 18 Feb 2012 13:18:22 GMT</pubDate>
			<description>Эта статья была написана по мотивам недавнего собеседования по приему на работу, где меня попоросили высказаться о presentation model и Parsley. 
 
 
Если вы помните, год или два назад было очень модно писать архитектурные фреймворки. В то же время наметилось несколько различных направлений в этом...</description>
			<content:encoded><![CDATA[<!-- BEGIN TEMPLATE: blog_entry_external -->
<div><i><blockquote>Эта статья была написана по мотивам недавнего собеседования по приему на работу, где меня попоросили высказаться о presentation model и Parsley.</blockquote></i><br />
<br />
Если вы помните, год или два назад было очень модно писать архитектурные фреймворки. В то же время наметилось несколько различных направлений в этом неблагородном занятии. Неблагородном потому, что, переведя с заумного на обычный, цель написания и использования фреймворка такого рода в том, чтобы объяснить каждому конкретному программисту, что он бездарь, и не умеет строить приложение даже на минимально доступном ему уровне ответсвенности, не смотря на то, что на &quot;вступительных&quot; экзаменах его только и спрашивали что про архитекруру и использование шаблонов программирования.<br />
<br />
Но цель этой статьи не в критике всех существующих фреймворков, а конкретного направления, с которым мне пришлось работать. Речь пойдет о Parsley и о presentation model, но этот фреймворк будет использован только как иллюстрация. Я надеюсь, что существующие недостатки и проблемы были логическим следствием проблем в теории, и никакая улучшенная реализация не спасет ситуацию, т.как теория в корне плохая.<br />
<br />
В первую очередь, первоисточник: <a href="http://martinfowler.com/eaaDev/PresentationModel.html" target="_blank">http://martinfowler.com/eaaDev/PresentationModel.html</a> Martin Fowler - человек, с легкой руки которого мы сегодня используем термин presentation model, описал основные принципы работы в этой статье. К сожалению из документации к Parsley не понятно как именно нужно использовать <a href="http://www.spicefactory.org/parsley/docs/2.2/manual/" target="_blank">эту библиотеку</a> и большинство примеров в ней находятся на за гранью здравого смысла, но лучшего источника нет. Это так, отчасти, еще и потому, что Parsley одновременно еще и делает <a href="http://en.wikipedia.org/wiki/Dependency_injection" target="_blank">dependency injection</a> - абсолютно лишнюю в AS3 вещь, и это во многом затрудняет понимание происходящего.<br />
<br />
Для начала, если вам лень читать Мартина Фаулера, в двух словах о том, что из себя представляет presentation model. Это одновременно две разные вещи: название механизма взаимодействия между элементами интерфейса пользователя и логикой программы вцелом, и конкретной части механизма, отвественной за сохранение состояния элементов интерфейса пользователя. В дальнейшем я буду использовать presentation model (pm), понимая под этим конкретный класс, реализующий взаимодействие.<br />
Концепция взаимодействия заключается в том, что компонент интерфейса централизовано сохраняет свое состояние в pm, и так же централизовано его оттуда восстанавливает. Это можно представить на примере чекбокса: когда вы над ним нажимаете клавишу мышки, чекбокс вызывает метод у pm, передавая ему сообщение о нажатии и ожидает от pm, что тот обработает нажатие и задаст новое значение.<br />
<br />
<b><blockquote>Проблемы, которые возникают при детальном рассмотрении нашего примера:</blockquote></b><br />
<br />
<i><blockquote>Что случится, когда кроме одной возможной операции (нажатия мыши) компонент будет реагировать на другие события?</blockquote></i> <br />
Следуя статье Фаулера - нам нужна одна функция для обновления всех значений во всех изменяемых частях компонента. Это значит, что если в нашем компоненте есть два чекбокса, при нажатии на один из них, значение для второго будет обновлятся точно так же, как и для первого, хотя это абсолютно не требовалось. Фаулер говорит в статье о разных уровнях детализации (или специфичности) обновления (coarse granularity vs fine granularity), понимая, что проблема существует, но не предлагая никакого решения. Не понятно зачем создавать проблему на пустом месте.<br />
<br />
<i><blockquote>Кто должен зависеть от кого, или, перефразируя, кто должен знать о ком - pm о компоненте, или компонента о pm?</blockquote></i> <br />
Следуя Фаулеру, опять же, нет универсального хорошего решения, решая в пользу одной из сторон, мы тем самым затрудняем себе тестирование другой стороны. Опять же - искусственно созданная проблема, которой могло бы не быть, если бы в принципе такой подход не использовался.<br />
<br />
<i><blockquote>Что делать, когда компоненты не тривиальны, и состоят из других компонент, в которых тоже нужен свой pm?</blockquote></i><br />
Описание концепции не дает никакого ответа. Parsley предлагает для этого использовать dependency injection - т.е. неявным образом создавать глобальные переменные, и так же неявно передавать их дочерним компонентам. Естественно, такой подход превращает проект в монолитный блок кода не поддающегося тестированию, который нет возможности использовать повторно или обновлять по частям. Что еще хуже, найти то место где же действительно создаются те самые глобальные переменные, задаются очень важные настройки становится очень тяжело. Ситуация более типичная для монументальных продуктов написаных на Яве, с изобретенными по ходу написания настройками, распихаными по разным XML файлам в произвольных частях программы.<br />
Если не использовать DI, то возможны два варианта: можно передать ссылку на дочерний pm дочерней компоненте в родительской компоненте, или спроектировать родительский pm так, чтобы он передал ссылку на дочерний компонент дочернему pm'у. Ни первый ни второй варианты не достаточно гибкие для того, чтобы позволить независимое тестирование родительской и дочерней компонент. В первом случае тестирование родительской компоненты, при наличие дочерней компоненты, не возможно без дочернего pm. Аналогично, во втором случае, нет возможности тестировать pm'ы без компонент.<br />
На практике это выливается в то, что код просто никогда не тестируется. Вернее, он доводится до состояния, когда &quot;вроде&quot; работает и в этом состоянии доживает до момента, когда его полностью, со всеми потрохами, выбрасывают и пишут заново.<br />
<br />
Реализация связывания между pm и компонентой - однообразный, механический труд. Человеку не хочется заниматься такими вещами, соответсвенно, напрашивается автоматизация. Автоматизация, очень часто, дело очень полезное, но не тогда, когда возможны исключения, и не тогда, когда автоматически сгенерированный код создает новые зависимости. На практике же, связывание (binding) создает зависимость к Flex Framework. Да и Parsley - это не генератор вашего кода, это библиотека (набор библиотек), которые вы подключаете к своему проекту, увеличивая общий размер, потребление памяти, количество окольных путей от одной точки интереса к другой (indirection layers); уменьшая при этом скорость работы.<br />
<blockquote>Я думаю, что это очевидно, что альтернатива использованию presentation model и Parsley, или похожих библиотек, заключается в осознании того, что архитектурных фреймворков не бывает. Архитектура, это то, как вы строите вашу программу, и это не возможно импортировать в виде готового кода написаного другими людьми. Верить в то, что использовав архитектурный фреймворк ваш код вензапно превратится в логически правильно выстроенную, модульную, удобную в поддержке программу так же наивно, как и надеятся на то, что использовав те же краски, которыми пользовался ван Гог, ваши картины отправятся прямиком в известнейшие музеи мира :)</blockquote></div>


<!-- END TEMPLATE: blog_entry_external -->]]></content:encoded>
			<dc:creator>wvxvw</dc:creator>
			<guid isPermaLink="true">http://www.flasher.ru/forum/blog.php?b=537</guid>
		</item>
	</channel>
</rss>

