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

<channel>
	<title>a_[w] блог</title>
	<atom:link href="http://actualwave.com/blog/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://actualwave.com/blog</link>
	<description>Велосипеды ручной сборки.</description>
	<lastBuildDate>Fri, 28 May 2010 14:43:37 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Доступна альфа версия UML редактора UML4AS</title>
		<link>http://actualwave.com/blog/?p=537</link>
		<comments>http://actualwave.com/blog/?p=537#comments</comments>
		<pubDate>Sat, 22 May 2010 22:23:04 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[ActionScript 3]]></category>
		<category><![CDATA[Новости]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[UML]]></category>
		<category><![CDATA[UML4AS]]></category>

		<guid isPermaLink="false">http://actualwave.com/blog/?p=537</guid>
		<description><![CDATA[Сегодня разработчики UML редактора UML4AS выложили альфа версию в публичный доступ для скачивания. 
Разработчики выделяют как основные особенности редактора:

дружественный интерфейс разработчика/процесс разработки
технология CodeSync для генерации кода, реверс-инжиниринг и устранение конфликтов
поддержка ActionScript и MXML файлов
поддержка рефакторинга
поддержка командной работы

и много чего ещё...
Видео, фото редактора. 
После закачки можно подсмотреть как правильно установить, а после установки -- как использовать.
Свои [...]]]></description>
			<content:encoded><![CDATA[<p>Сегодня разработчики UML редактора <a href="http://www.uml4as.com/">UML4AS</a> выложили альфа версию в <a href="http://www.uml4as.com/flower-platform/download.html">публичный доступ для скачивания</a>. </p>
<p>Разработчики выделяют как основные особенности редактора:</p>
<ul>
<li>дружественный интерфейс разработчика/процесс разработки</li>
<li>технология CodeSync для генерации кода, реверс-инжиниринг и устранение конфликтов</li>
<li>поддержка ActionScript и MXML файлов</li>
<li>поддержка рефакторинга</li>
<li>поддержка командной работы</li>
</ul>
<p>и <a href="http://www.uml4as.com/flower-platform/features-overview.html">много чего ещё...</a><br />
<a href="http://www.uml4as.com/flower-platform/sneak-peek-screencasts.html">Видео</a>, <a href="http://www.uml4as.com/flower-platform/screenshots.html">фото</a> редактора. </p>
<p>После закачки можно подсмотреть <a href="http://www.uml4as.com/flower-platform/documentation/16-requirements-install-uninstall.html">как правильно установить</a>, а после установки -- <a href="http://www.uml4as.com/flower-platform/documentation/17-getting-started-tutorial.html">как использовать</a>.</p>
<p>Свои пожелания и предложения можете выказывать на <a href="http://www.uml4as.com/forum/index.php?board=6.0">этом форуме</a>, а рассказать о найденых ошибках, <a href="http://www.uml4as.com/forum/index.php?board=2.0">на этом</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://actualwave.com/blog/?feed=rss2&amp;p=537</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Realaxy ActionScript Editor beta</title>
		<link>http://actualwave.com/blog/?p=512</link>
		<comments>http://actualwave.com/blog/?p=512#comments</comments>
		<pubDate>Fri, 09 Apr 2010 18:48:26 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Новости]]></category>
		<category><![CDATA[beta]]></category>
		<category><![CDATA[Editor]]></category>
		<category><![CDATA[Realaxy]]></category>

		<guid isPermaLink="false">http://actualwave.com/blog/?p=512</guid>
		<description><![CDATA[Евгений Потапенко и Иван Дембицкий дружно сообщают о выходе бета-версии их заведомо замечательного редактора (по слухам, без магии не обошлось  ). Презентация редактора пройдёт в рамках конференции Creative Future в Москве, 23 апреля. Обещают выдать всем присутствующим по бете, в качестве закрытого бета-теста, если будет в чём унести(флешку с собой возьмите). Ребятам желаю удачи!
Регистрируйтесь!
А [...]]]></description>
			<content:encoded><![CDATA[<p>Евгений Потапенко и Иван Дембицкий дружно <a href="http://www.flasher.ru/forum/showthread.php?t=138534">сообщают</a> о выходе бета-версии их заведомо замечательного <a href="http://realaxy.com/">редактора</a> (по слухам, без магии не обошлось <img src='http://actualwave.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ). Презентация редактора пройдёт в рамках конференции <a href="http://creativefuture.ru/about">Creative Future</a> в Москве, 23 апреля. Обещают выдать всем присутствующим по бете, в качестве закрытого бета-теста, если будет в чём унести(флешку с собой возьмите). Ребятам желаю удачи!</p>
<p><a href="http://reg.creativefuture.ru/">Регистрируйтесь!</a></p>
<p>А ещё пообещали каждому выдать бету за пост на эту тему с вот таким линком: <a href="http://realaxy.com/">Realaxy ActionScript Editor</a>. Как оформите пост, отправляйте письмо на <a href="mailto:ivan.dembicki@gmail.com?subject=[betatest]">ivan.dembicki@gmail.com</a> с сабжем [betatest] и ссылкой на новость.</p>
]]></content:encoded>
			<wfw:commentRss>http://actualwave.com/blog/?feed=rss2&amp;p=512</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Issue FP-4293: flash.utils.Proxy nextName return type</title>
		<link>http://actualwave.com/blog/?p=509</link>
		<comments>http://actualwave.com/blog/?p=509#comments</comments>
		<pubDate>Wed, 07 Apr 2010 17:07:34 +0000</pubDate>
		<dc:creator>actual_wave</dc:creator>
				<category><![CDATA[ActionScript 3]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[flash.utils.Proxy]]></category>
		<category><![CDATA[issue]]></category>
		<category><![CDATA[JIRA]]></category>

		<guid isPermaLink="false">http://actualwave.com/blog/?p=509</guid>
		<description><![CDATA[Проблема в том, что в интерфейсе класса есть очень важный метод nextName():String, который должен возвращать имена свойств. Проблема в том, что этот метод возвращает строку и вызывает проблемы в случае, если имя свойства находится в пользовательском пространстве имён. Надо вернуть QName, а можно только строку. Будет хорошо, если кто проголосует и/или проследит за выполнением:
Issue FP-4293: [...]]]></description>
			<content:encoded><![CDATA[<p>Проблема в том, что в интерфейсе класса есть очень важный метод nextName():String, который должен возвращать имена свойств. Проблема в том, что этот метод возвращает строку и вызывает проблемы в случае, если имя свойства находится в пользовательском пространстве имён. Надо вернуть QName, а можно только строку. Будет хорошо, если кто проголосует и/или проследит за выполнением:<br />
<a href="http://bugs.adobe.com/jira/browse/FP-4293">Issue FP-4293: flash.utils.Proxy nextName return type</a><br />
Заодно можете глянуть и этот:<br />
<a href="http://bugs.adobe.com/jira/browse/ASC-4046">Issue ASC-4046: for..in cycle can not accept property names with QName or other type</a></p>
]]></content:encoded>
			<wfw:commentRss>http://actualwave.com/blog/?feed=rss2&amp;p=509</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Объекты с поддержкой динамических имён свойств с использованием пользовательских пространств имён</title>
		<link>http://actualwave.com/blog/?p=498</link>
		<comments>http://actualwave.com/blog/?p=498#comments</comments>
		<pubDate>Mon, 05 Apr 2010 23:27:48 +0000</pubDate>
		<dc:creator>actual_wave</dc:creator>
				<category><![CDATA[ActionScript 3]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[dynamic]]></category>
		<category><![CDATA[flash.utils.Proxy]]></category>
		<category><![CDATA[name]]></category>
		<category><![CDATA[property]]></category>
		<category><![CDATA[QName]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://actualwave.com/blog/?p=498</guid>
		<description><![CDATA[Flex cookbook entry: How to and where store dynamic properties in custom namespaces.
Мне очень нравится в ActionScript 3 тесная интеграция с XML и популяризация пространств имён. Для поддержки свойств в различных пространствах имён даже создан отдельный класс – QName, объединяющий в себе указатель пространства имён и локальное имя. Но, получается что, для использования пространств имён [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://cookbooks.adobe.com/post_How_to_and_where_store_dynamic_properties_in_custo-17296.html">Flex cookbook entry: How to and where store dynamic properties in custom namespaces</a>.</p>
<p>Мне очень нравится в ActionScript 3 тесная интеграция с XML и популяризация пространств имён. Для поддержки свойств в различных пространствах имён даже создан отдельный класс – QName, объединяющий в себе указатель пространства имён и локальное имя. Но, получается что, для использования пространств имён отличных от базовых(AS3 и с пустым указателем) разработчик должен сам реализовать поддержку этих пространств имён, заранее объявив члены класса.</p>
<p>Динамические члены класса в пользовательских пространствах имён не поддерживаются, кроме XML объектов. Чтоб включить такую поддержку необходимо расширить класс flash.utils.Proxy и самому её реализовать. Это и было сделано в классах описываемых в этом посте – они разрешают добавлять в себя динамические члены класса в любых пространствах имён(кроме flash_proxy, в сочетании с зарезервированными локальными именами, методы которых уже реализованы).</p>
<p><span id="more-498"></span></p>
<p>Итак, есть 2 коллекции и 2 обёртки для них в виде классов расширяющих flash.utils.Proxy. Первый класс QNameCollection поддерживает пространства имён в именах динамических свойств, а XMLNameCollection дополнительно поддерживает атрибуты. Следует заметить, что QNameCollection игнорирует <a href="http://actualwave.com/blog/?p=309">указатель атрибута</a> в QName и если попробовать добавить атрибут, он просто добавит свойство под этим именем, при этом значение указателя теряется.</p>
<p>Коллекции используют методы аналогичные методам flash.utils.Proxy для доступа к элементам</p>
<ul>
<li><code>callProperty</code> – вызвать метод с указанным именем</li>
<li><code>getProperty</code> – получить значение свойства по имени</li>
<li><code>hasProperty</code> – проверить наличие свойства по имени</li>
<li><code>deleteProperty</code> – удалить свойство по имени</li>
<li><code>setProperty</code> – установить свойство по имени</li>
</ul>
<p>Все эти методы принимают выборки с не указанными(NULL в QName.uri означает любое пространство имён, а "*" – любое локальное имя) пространством имён или локальным именем.</p>
<p>И дополнительно методы:</p>
<ul>
<li><code>getPropertyList</code> – список имён доступных свойств</li>
<li><code>getPropertyNamespaceList</code> – список использованных пространств имён</li>
<li><code>forEach</code> – перебор всех свойств объекта. Используется функция обратного вызова, принимает в качестве аргументов значение свойства и имя свойства</li>
</ul>
<p>В конструкторе обе коллекции принимают атрибут "liveNameList", указывающий на необходимость содержать постоянно обновляемый список имён свойств, который используется для перебора свойств. Если эта опция выключена, то список имён создаётся по необходимости, к примеру, непосредственно перед перебором в цыкле.</p>
<p>А обё обёртки просто позволяют использовать привычный синтаксис</p>
<div class="more_syntax">
<pre class="actionscript3"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #006699; font-weight: bold;">var</span> ns1:<span style="color: #006699; font-weight: bold;">Namespace</span> = <span style="color: #0000cc; font-weight: bold;">new</span> <span style="color: #006699; font-weight: bold;">Namespace</span><span style="color: #663366;">&#40;</span><span style="color: #ff33cc; font-style: italic;">'urn:some-uri-1'</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #006699; font-weight: bold;">var</span> ns2:<span style="color: #006699; font-weight: bold;">Namespace</span> = <span style="color: #0000cc; font-weight: bold;">new</span> <span style="color: #006699; font-weight: bold;">Namespace</span><span style="color: #663366;">&#40;</span><span style="color: #ff33cc; font-style: italic;">'urn:some-uri-2'</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #006699; font-weight: bold;">var</span> ns3:<span style="color: #006699; font-weight: bold;">Namespace</span> = <span style="color: #0000cc; font-weight: bold;">new</span> <span style="color: #006699; font-weight: bold;">Namespace</span><span style="color: #663366;">&#40;</span><span style="color: #ff33cc; font-style: italic;">'urn:some-uri-3'</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #006699; font-weight: bold;">var</span> qNames:QNameDynamicCollection = <span style="color: #0000cc; font-weight: bold;">new</span> QNameDynamicCollection<span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">qNames.<span style="color: #006600;">ns1</span>::property1 = <span style="color: #ff33cc; font-style: italic;">'property1'</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">qNames.<span style="color: #006600;">ns1</span>::property2 = <span style="color: #ff33cc; font-style: italic;">'property2'</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">qNames.<span style="color: #006600;">ns2</span>::property1 = <span style="color: #ff33cc; font-style: italic;">'property3'</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">qNames.<span style="color: #006600;">ns2</span>::property2 = <span style="color: #ff33cc; font-style: italic;">'property4'</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">qNames.<span style="color: #006600;">ns3</span>::property1 = <span style="color: #ff33cc; font-style: italic;">'property5'</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">qNames.<span style="color: #006600;">ns3</span>::property2 = <span style="color: #ff33cc; font-style: italic;">'property6'</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000cc; font-weight: bold;">trace</span><span style="color: #663366;">&#40;</span>qNames.<span style="color: #006600;">*</span>::*<span style="color: #663366;">&#41;</span>; <span style="color: #808080; font-style: italic;">// property1,property2,property3,property4,property5,property6</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000cc; font-weight: bold;">trace</span><span style="color: #663366;">&#40;</span>qNames.<span style="color: #006600;">ns2</span>::*<span style="color: #663366;">&#41;</span>; <span style="color: #808080; font-style: italic;">// property3,property4</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000cc; font-weight: bold;">delete</span> qNames.<span style="color: #006600;">ns2</span>::*;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000cc; font-weight: bold;">trace</span><span style="color: #663366;">&#40;</span>qNames.<span style="color: #006600;">ns2</span>::*.<span style="color: #006600;">length</span><span style="color: #663366;">&#41;</span>; <span style="color: #808080; font-style: italic;">// 0</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #006699; font-weight: bold;">var</span> xmlNames:XMLNameDynamicCollection = <span style="color: #0000cc; font-weight: bold;">new</span> XMLNameDynamicCollection<span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">xmlNames.@ns1::attribute1 = <span style="color: #ff33cc; font-style: italic;">'attribute1'</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">xmlNames.@ns1::attribute2 = <span style="color: #ff33cc; font-style: italic;">'attribute2'</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">xmlNames.@ns2::attribute1 = <span style="color: #ff33cc; font-style: italic;">'attribute3'</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">xmlNames.@ns2::attribute2 = <span style="color: #ff33cc; font-style: italic;">'attribute4'</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">xmlNames.@ns3::attribute1 = <span style="color: #ff33cc; font-style: italic;">'attribute5'</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">xmlNames.@ns3::attribute2 = <span style="color: #ff33cc; font-style: italic;">'attribute6'</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">xmlNames.<span style="color: #006600;">ns1</span>::property1 = <span style="color: #ff33cc; font-style: italic;">'property1'</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">xmlNames.<span style="color: #006600;">ns1</span>::property2 = <span style="color: #ff33cc; font-style: italic;">'property2'</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">xmlNames.<span style="color: #006600;">ns2</span>::property1 = <span style="color: #ff33cc; font-style: italic;">'property3'</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">xmlNames.<span style="color: #006600;">ns2</span>::property2 = <span style="color: #ff33cc; font-style: italic;">'property4'</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">xmlNames.<span style="color: #006600;">ns3</span>::property1 = <span style="color: #ff33cc; font-style: italic;">'property5'</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">xmlNames.<span style="color: #006600;">ns3</span>::property2 = <span style="color: #ff33cc; font-style: italic;">'property6'</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000cc; font-weight: bold;">trace</span><span style="color: #663366;">&#40;</span>xmlNames.<span style="color: #006600;">*</span>::*<span style="color: #663366;">&#41;</span>; <span style="color: #808080; font-style: italic;">// property1,property2,property3,property4,property5,property6</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000cc; font-weight: bold;">trace</span><span style="color: #663366;">&#40;</span>xmlNames.@*::*<span style="color: #663366;">&#41;</span>; <span style="color: #808080; font-style: italic;">// attribute1,attribute2,attribute3,attribute4,attribute5,attribute6</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000cc; font-weight: bold;">trace</span><span style="color: #663366;">&#40;</span>xmlNames.@ns2::*.<span style="color: #006600;">length</span><span style="color: #663366;">&#41;</span>; <span style="color: #808080; font-style: italic;">// 2</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000cc; font-weight: bold;">delete</span> xmlNames.@*::*;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000cc; font-weight: bold;">trace</span><span style="color: #663366;">&#40;</span>xmlNames.@*::*.<span style="color: #006600;">length</span><span style="color: #663366;">&#41;</span>; <span style="color: #808080; font-style: italic;">// 0</span></div></li></ol></pre>
</div>
<p>Особенности работы с этими объектами</p>
<ul>
<li><code>сollection.*</code> – любой запрос по выборке возвращает массив, поэтому чтоб узнать наличие свойств в пространстве имён надо использовать свойство Array.length, как и в случае XML узлов – XMLList.length().</li>
<li><code>var value:Array = сollection.*</code> – вернёт только свойства находящиеся в базовом пространстве имён, чтоб получить все свойства во всех пространствах имён используйте collection.*::*, collection.@*::* для атрибутов.</li>
<li><code>сollection.ns::* = value</code> – не создаст новых свойств, но существующим свойствам присвоит новое значение.</li>
<li>Второй аргумент в конструкторе обёртки "autoParseStringNames", указывает на возможность автоматической конвертации строк с "::" в экземпляры QName. Я добавил эту опцию из-за глюка в интерфейсе flash.utils.Proxy – если использовать цыкл for..in, то для получения имени свойства используется метод Proxy.nextName, который может вернуть только строку.</li>
</ul>
<p>Скачать весь пакет одним файлом: <a class="downloadlink" href="http://actualwave.com/blog/wp-content/plugins/download-monitor/download.php?id=23" title=" downloaded 41 times" >QName & XMLName collections (41)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://actualwave.com/blog/?feed=rss2&amp;p=498</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Таймер с автоматической поправкой погрешности</title>
		<link>http://actualwave.com/blog/?p=484</link>
		<comments>http://actualwave.com/blog/?p=484#comments</comments>
		<pubDate>Mon, 05 Apr 2010 19:29:08 +0000</pubDate>
		<dc:creator>actual_wave</dc:creator>
				<category><![CDATA[ActionScript 3]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[flash.utils.Timer]]></category>
		<category><![CDATA[Timer]]></category>

		<guid isPermaLink="false">http://actualwave.com/blog/?p=484</guid>
		<description><![CDATA[Upd: На Adobe Сookbooks появился пример более аккуратного таймера, использующего другой подход для пресечения задержек. Я собираюсь им воспользоваться и всем рекомендую(хотя бы ознакомиться стоит). На данный момент там нет скачиваемого класса, но автор обещал выложить нормально написанный пример.
Flex cookbook entry: Accurate Timer class.
Во Flash player’е работа встроенного таймера зависит от проигрывания flash ролика. Такая [...]]]></description>
			<content:encoded><![CDATA[<p>Upd: На Adobe Сookbooks появился <a href="http://cookbooks.adobe.com/post_Accurate_timer-17332.html">пример более аккуратного таймера</a>, использующего другой подход для пресечения задержек. Я собираюсь им воспользоваться и всем рекомендую(хотя бы ознакомиться стоит). На данный момент там нет скачиваемого класса, но автор обещал выложить нормально написанный пример.</p>
<p><a href="http://cookbooks.adobe.com/post_Accurate_Timer_class-17294.html">Flex cookbook entry: Accurate Timer class</a>.</p>
<p>Во Flash player’е работа встроенного таймера зависит от проигрывания flash ролика. Такая зависимость приводит к большим погрешностям и не делает поправку при дальнейшем выполнении. Это достаточно известная тема и уже много раз об этом писали. </p>
<p><span id="more-484"></span></p>
<p>К примеру, класс приложения для подсчёта погрешностей в ролике с частотой в 24 кадра:</p>
<div class="more_syntax">
<pre class="actionscript3"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #006699; font-weight: bold;">package</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	<span style="color: #006600; font-weight: bold;">import</span> <span style="color: #660099 !important; font-weight: bold;">flash.<span style="color: #006600;">display</span></span>.<span style="color: #0000cc; font-weight: bold;">Sprite</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	<span style="color: #006600; font-weight: bold;">import</span> <span style="color: #660099 !important; font-weight: bold;">flash.<span style="color: #006600;">events</span></span>.<span style="color: #0000cc; font-weight: bold;">TimerEvent</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	<span style="color: #006600; font-weight: bold;">import</span> <span style="color: #660099 !important; font-weight: bold;">flash.<span style="color: #006600;">utils</span></span>.<span style="color: #0000cc; font-weight: bold;">Timer</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	<span style="color: #006600; font-weight: bold;">import</span> <span style="color: #660099 !important; font-weight: bold;">flash.<span style="color: #006600;">utils</span></span>.<span style="color: #006600;">getTimer</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	<span style="color: #663366;">&#91;</span>SWF<span style="color: #663366;">&#40;</span>frameRate=<span style="color: #ff33cc; font-style: italic;">&quot;24&quot;</span><span style="color: #663366;">&#41;</span><span style="color: #663366;">&#93;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	<span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">class</span> TestTimer <span style="color: #006699; font-weight: bold;">extends</span> <span style="color: #0000cc; font-weight: bold;">Sprite</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">		<span style="color: #66cccc; font-weight: bold;">protected</span> <span style="color: #006699; font-weight: bold;">var</span> _started:<span style="color: #0000cc; font-weight: bold;">int</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">		<span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">function</span> TestTimer<span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>:<span style="color: #669933; font-weight: bold;">void</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">			<span style="color: #669933; font-weight: bold;">super</span><span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">			<span style="color: #006699; font-weight: bold;">const</span> <span style="color: #0000cc; font-weight: bold;">timer</span>:<span style="color: #0000cc; font-weight: bold;">Timer</span> = <span style="color: #0000cc; font-weight: bold;">new</span> <span style="color: #0000cc; font-weight: bold;">Timer</span><span style="color: #663366;">&#40;</span><span style="color: #ff6600; font-weight: bold;">1000</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">			<span style="color: #0000cc; font-weight: bold;">timer</span>.<span style="color: #006600;">addEventListener</span><span style="color: #663366;">&#40;</span><span style="color: #0000cc; font-weight: bold;">TimerEvent</span>.<span style="color: #0000cc; font-weight: bold;">TIMER</span>, timerHandler<span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">			_started = getTimer<span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">			<span style="color: #0000cc; font-weight: bold;">timer</span>.<span style="color: #006600;">start</span><span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">		<span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">		<span style="color: #66cccc; font-weight: bold;">protected</span> <span style="color: #006699; font-weight: bold;">function</span> timerHandler<span style="color: #663366;">&#40;</span><span style="color: #0000cc; font-weight: bold;">event</span>:<span style="color: #0000cc; font-weight: bold;">TimerEvent</span><span style="color: #663366;">&#41;</span>:<span style="color: #669933; font-weight: bold;">void</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">			<span style="color: #006699; font-weight: bold;">const</span> count:<span style="color: #0000cc; font-weight: bold;">int</span> = <span style="color: #663366;">&#40;</span><span style="color: #0000cc; font-weight: bold;">event</span>.<span style="color: #006600;">target</span> <span style="color: #0000cc; font-weight: bold;">as</span> <span style="color: #0000cc; font-weight: bold;">Timer</span><span style="color: #663366;">&#41;</span>.<span style="color: #006600;">currentCount</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">			<span style="color: #0000cc; font-weight: bold;">trace</span><span style="color: #663366;">&#40;</span>count, <span style="color: #663366;">&#40;</span>getTimer<span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>-_started<span style="color: #ff6600; font-weight: bold;">-1000</span>*count<span style="color: #663366;">&#41;</span>*<span style="color: #ff6600; font-weight: bold;">0.001</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">		<span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	<span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #663366;">&#125;</span></div></li></ol></pre>
</div>
<p>При выполнении, покажет, что уже до конца минуты таймер пропустит одну итерацию.</p>
<p><code>27 0.79<br />
28 0.79<br />
29 0.791<br />
30 0.833<br />
31 0.835<br />
32 0.875<br />
33 0.918<br />
34 0.9580000000000001<br />
35 0.966<br />
36 1<br />
37 1.002<br />
38 1.042<br />
39 1.083</code></p>
<p>Я немного расширил класс и добавил автоматическую поправку, а так же подсчёт пропущенных итераций. Если изменить код, чтоб опробовать новый класс</p>
<div class="more_syntax">
<pre class="actionscript3"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #006699; font-weight: bold;">package</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	<span style="color: #006600; font-weight: bold;">import</span> aw.<span style="color: #006600;">events</span>.<span style="color: #006600;">AccurateTimerEvent</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	<span style="color: #006600; font-weight: bold;">import</span> aw.<span style="color: #006600;">utils</span>.<span style="color: #006600;">AccurateTimer</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	<span style="color: #006600; font-weight: bold;">import</span> <span style="color: #660099 !important; font-weight: bold;">flash.<span style="color: #006600;">display</span></span>.<span style="color: #0000cc; font-weight: bold;">Sprite</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	<span style="color: #006600; font-weight: bold;">import</span> <span style="color: #660099 !important; font-weight: bold;">flash.<span style="color: #006600;">events</span></span>.<span style="color: #0000cc; font-weight: bold;">TimerEvent</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	<span style="color: #006600; font-weight: bold;">import</span> <span style="color: #660099 !important; font-weight: bold;">flash.<span style="color: #006600;">utils</span></span>.<span style="color: #0000cc; font-weight: bold;">Timer</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	<span style="color: #006600; font-weight: bold;">import</span> <span style="color: #660099 !important; font-weight: bold;">flash.<span style="color: #006600;">utils</span></span>.<span style="color: #006600;">getTimer</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	<span style="color: #663366;">&#91;</span>SWF<span style="color: #663366;">&#40;</span>frameRate=<span style="color: #ff33cc; font-style: italic;">&quot;24&quot;</span><span style="color: #663366;">&#41;</span><span style="color: #663366;">&#93;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	<span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">class</span> TestTimer <span style="color: #006699; font-weight: bold;">extends</span> <span style="color: #0000cc; font-weight: bold;">Sprite</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">		<span style="color: #66cccc; font-weight: bold;">protected</span> <span style="color: #006699; font-weight: bold;">var</span> _started:<span style="color: #0000cc; font-weight: bold;">int</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">		<span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">function</span> TestTimer<span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>:<span style="color: #669933; font-weight: bold;">void</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">			<span style="color: #669933; font-weight: bold;">super</span><span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">			<span style="color: #006699; font-weight: bold;">const</span> <span style="color: #0000cc; font-weight: bold;">timer</span>:<span style="color: #0000cc; font-weight: bold;">Timer</span> = <span style="color: #0000cc; font-weight: bold;">new</span> AccurateTimer<span style="color: #663366;">&#40;</span><span style="color: #ff6600; font-weight: bold;">1000</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">			<span style="color: #0000cc; font-weight: bold;">timer</span>.<span style="color: #006600;">addEventListener</span><span style="color: #663366;">&#40;</span><span style="color: #0000cc; font-weight: bold;">TimerEvent</span>.<span style="color: #0000cc; font-weight: bold;">TIMER</span>, timerHandler<span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">			_started = getTimer<span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">			<span style="color: #0000cc; font-weight: bold;">timer</span>.<span style="color: #006600;">start</span><span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">		<span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">		<span style="color: #66cccc; font-weight: bold;">protected</span> <span style="color: #006699; font-weight: bold;">function</span> timerHandler<span style="color: #663366;">&#40;</span><span style="color: #0000cc; font-weight: bold;">event</span>:AccurateTimerEvent<span style="color: #663366;">&#41;</span>:<span style="color: #669933; font-weight: bold;">void</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">			<span style="color: #006699; font-weight: bold;">const</span> count:<span style="color: #0000cc; font-weight: bold;">int</span> = <span style="color: #663366;">&#40;</span><span style="color: #0000cc; font-weight: bold;">event</span>.<span style="color: #006600;">target</span> <span style="color: #0000cc; font-weight: bold;">as</span> <span style="color: #0000cc; font-weight: bold;">Timer</span><span style="color: #663366;">&#41;</span>.<span style="color: #006600;">currentCount</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">			<span style="color: #0000cc; font-weight: bold;">trace</span><span style="color: #663366;">&#40;</span>count, <span style="color: #663366;">&#40;</span>getTimer<span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>-_started<span style="color: #ff6600; font-weight: bold;">-1000</span>*count<span style="color: #663366;">&#41;</span>*<span style="color: #ff6600; font-weight: bold;">0.001</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">		<span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	<span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #663366;">&#125;</span></div></li></ol></pre>
</div>
<p>То можно убедиться, что такого нарастающего отставания больше нет. Оно, конечно, осталось, но в самой минимальной величине.</p>
<p><code>27 0.027<br />
28 0.025<br />
29 0.026000000000000002<br />
30 0.025<br />
31 0.027<br />
32 0.027<br />
33 0.025<br />
34 0.025<br />
35 0.025<br />
36 0.027<br />
37 0.026000000000000002<br />
38 0.025<br />
39 0.027</code></p>
<p>Класс <a href="http://actualwave.com/lab/as3/aw/utils/AccurateTimer.as">AccurateTimer</a> расширяет flash.utils.Timer и добавляет в него методы pause()/resume() для останова текущей итерации(я понимаю,что это сомнительный функционал, но надо было идти до конца <img src='http://actualwave.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> ) и свойство missedIterations, которое содержит общее количество пропущенных итераций. Так же, с этим классом идёт своё событие <a href="http://actualwave.com/lab/as3/aw/events/AccurateTimerEvent.as">AccurateTimerEvent</a>, которое расширяет событие оригинального таймера и добавляет свойство missedIterations, которое содержит количество пропущенных итераций за время завершённой итерации(если она выполнялась в два раза дольше и более).</p>
<p>Скачать <a class="downloadlink" href="http://actualwave.com/blog/wp-content/plugins/download-monitor/download.php?id=22" title=" downloaded 42 times" >aw.utils.AccurateTimer (42)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://actualwave.com/blog/?feed=rss2&amp;p=484</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Обёртка NetConnection для RPC</title>
		<link>http://actualwave.com/blog/?p=461</link>
		<comments>http://actualwave.com/blog/?p=461#comments</comments>
		<pubDate>Thu, 01 Apr 2010 22:48:49 +0000</pubDate>
		<dc:creator>actual_wave</dc:creator>
				<category><![CDATA[ActionScript 3]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[AMF]]></category>
		<category><![CDATA[NetConnection]]></category>
		<category><![CDATA[RPC]]></category>

		<guid isPermaLink="false">http://actualwave.com/blog/?p=461</guid>
		<description><![CDATA[Недавно замиксовал очередной видео плеер, по принципу плеера Spivaimo.com и ребята хотели, чтоб я грузил огромную XML с путями ко всем видео и изображениям. Я, на свою голову, рассказал им своё видение реализации, как и что надо делать, и главным пунктом была замена XML на AMF.
Через два месяца они сообщили, что закончили работу и можно [...]]]></description>
			<content:encoded><![CDATA[<p>Недавно замиксовал очередной видео плеер, по принципу <a href="http://actualwave.com/blog/?p=332">плеера Spivaimo.com</a> и ребята хотели, чтоб я грузил огромную XML с путями ко всем видео и изображениям. Я, на свою голову, рассказал им своё видение реализации, как и что надо делать, и главным пунктом была замена XML на AMF.</p>
<p>Через два месяца они сообщили, что закончили работу и можно продолжать дальше. Я не хотел пожалеть ещё раз и промолчал о реализации. <img src='http://actualwave.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /><br />
Надо было быстренько подключить плеер сменив загрузчики данных с XML на AMF и быстренько я написал два класса, так чтоб не заморачиваться и не удвоить вес плеера.</p>
<p><span id="more-461"></span></p>
<p><a href="http://actualwave.com/lab/as3/aw/net/amf/ServiceCaller.as">ServiceCaller</a> – объект связанный с одним методом на стороне сервера</p>
<p><a href="http://actualwave.com/lab/as3/aw/net/amf/ServiceCallerSequence.as">ServiceCallerSequence</a> – очередь выполняемых ServiceCaller, один за другим</p>
<p>Ничего особенного, использовать так же просто как и писать подобную приблуду. Для этого надо только указать путь к шлюзу для AMF соединения:</p>
<div class="more_syntax">
<pre class="actionscript3"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">ServiceCaller.<span style="color: #006600;">gatewayURL</span> = <span style="color: #ff33cc; font-style: italic;">'http://somesite.com/flashservices/gateway.php'</span>; </div></li></ol></pre>
</div>
<p>Не плохо бы сделать класс в котором хранятся все AMF методы</p>
<div class="more_syntax">
<pre class="actionscript3"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #006699; font-weight: bold;">package</span> aw.<span style="color: #006600;">projects</span>.<span style="color: #006600;">******</span>.<span style="color: #0000cc; font-weight: bold;">videoplayer</span>.<span style="color: #006600;">net</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	<span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">class</span> ServiceMethods <span style="color: #006699; font-weight: bold;">extends</span> <span style="color: #0000cc; font-weight: bold;">Object</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">		<span style="color: #66cccc; font-weight: bold;">static</span> <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">const</span> GET_FULL_CONTENT:<span style="color: #0000cc; font-weight: bold;">String</span> = <span style="color: #ff33cc; font-style: italic;">'GetContent.get_full_content'</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">		<span style="color: #66cccc; font-weight: bold;">static</span> <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">const</span> GET_VIDEO_URL:<span style="color: #0000cc; font-weight: bold;">String</span> = <span style="color: #ff33cc; font-style: italic;">'GetSettings.get_video_url'</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"> …</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	<span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #663366;">&#125;</span> </div></li></ol></pre>
</div>
<p>Пример использования ServiceCaller:</p>
<div class="more_syntax">
<pre class="actionscript3"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #006699; font-weight: bold;">var</span> caller:ServiceCaller = <span style="color: #0000cc; font-weight: bold;">new</span> ServiceCaller<span style="color: #663366;">&#40;</span>ServiceMethods.<span style="color: #006600;">GET_STATUS</span>, <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">getStatusSuccessHandler</span>, <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">getStatusErrorHandler</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">caller.<span style="color: #006600;">call</span><span style="color: #663366;">&#40;</span><span style="color: #669933; font-weight: bold;">this</span>._statusCode<span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">…</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cccc; font-weight: bold;">protected</span> <span style="color: #006699; font-weight: bold;">function</span> getStatusSuccessHandler<span style="color: #663366;">&#40;</span>status:<span style="color: #0000cc; font-weight: bold;">Object</span><span style="color: #663366;">&#41;</span>:<span style="color: #669933; font-weight: bold;">void</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	…</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #663366;">&#125;</span></div></li></ol></pre>
</div>
<p>В конструкторе принимает имя удалённого метода(процедуры, если хотите) и ссылки на функции обратного вызова для вернувшегося результата и для ошибки. В метод ServiceCaller.call() передаются аргументы для удалённого метода.</p>
<p>Пример использования ServiceCallerSequence:</p>
<div class="more_syntax">
<pre class="actionscript3"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cccc; font-weight: bold;">protected</span> <span style="color: #006699; font-weight: bold;">function</span> loadData<span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>:<span style="color: #669933; font-weight: bold;">void</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	<span style="color: #006699; font-weight: bold;">var</span> sequence:ServiceCallerSequence = <span style="color: #0000cc; font-weight: bold;">new</span> ServiceCallerSequence<span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	sequence.<span style="color: #006600;">call</span><span style="color: #663366;">&#40;</span>ServiceMethods.<span style="color: #006600;">GET_VIDEO_URL</span>, <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">setURLTemplatesSuccessHandler</span>, <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">setURLTemplatesErrorHandler</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	sequence.<span style="color: #006600;">call</span><span style="color: #663366;">&#40;</span>ServiceMethods.<span style="color: #006600;">GET_CODE_URL</span>, <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">getCodeURLSuccessHandler</span>, <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">getCodeURLErrorHandler</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	sequence.<span style="color: #006600;">call</span><span style="color: #663366;">&#40;</span>ServiceMethods.<span style="color: #006600;">GET_HTML_CODE</span>, <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">getHTMLCodeSuccessHandler</span>, <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">getHTMLCodeErrorHandler</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	sequence.<span style="color: #006600;">call</span><span style="color: #663366;">&#40;</span>ServiceMethods.<span style="color: #006600;">GET_FULL_CONTENT</span>, <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">getFullContentSuccessHandler</span>, <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">getFullContentErrorHandler</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #663366;">&#125;</span></div></li></ol></pre>
</div>
<p>В метод ServiceCallerSequence.call() передаётся всё сразу – имя удалённого метода, ссылки на методы обратного вызова и аргументы для удалённого метода. Обработка запросов начинается сразу.</p>
<a class="downloadlink" href="http://actualwave.com/blog/wp-content/plugins/download-monitor/download.php?id=21" title=" downloaded 42 times" >ServiceCaller, исходный код (42)</a>
]]></content:encoded>
			<wfw:commentRss>http://actualwave.com/blog/?feed=rss2&amp;p=461</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Бесплатный SVN хостинг</title>
		<link>http://actualwave.com/blog/?p=455</link>
		<comments>http://actualwave.com/blog/?p=455#comments</comments>
		<pubDate>Thu, 01 Apr 2010 18:56:52 +0000</pubDate>
		<dc:creator>actual_wave</dc:creator>
				<category><![CDATA[Новости]]></category>
		<category><![CDATA[Hosting]]></category>
		<category><![CDATA[SVN]]></category>
		<category><![CDATA[бесплатно]]></category>
		<category><![CDATA[Система контроля версий]]></category>
		<category><![CDATA[Хостинг]]></category>

		<guid isPermaLink="false">http://actualwave.com/blog/?p=455</guid>
		<description><![CDATA[Небольшой список SVN хостингов, позволяющих создать бесплатный аккаунт для небольшого проекта. В основном это 200 Мб дискового пространства, один пользователь и система багтрекинга вроде Trac'а.

Unfuddle – 200 Мб SVN &#038; Git, 2 пользователя, своя система трекинга (напоминает Basecamp)
Codesion – 200 Мб SVN &#038; CVS, 1 пользователь, Trac &#038; Bugzilla
XP-dev – 200 Мб SVN, неограничено пользователей, [...]]]></description>
			<content:encoded><![CDATA[<p>Небольшой список SVN хостингов, позволяющих создать бесплатный аккаунт для небольшого проекта. В основном это 200 Мб дискового пространства, один пользователь и система багтрекинга вроде Trac'а.</p>
<ul>
<li><a href="http://unfuddle.com/about/tour/plans">Unfuddle</a> – 200 Мб SVN & Git, 2 пользователя, своя система трекинга (напоминает <a href="http://basecamphq.com/">Basecamp</a>)</li>
<li><a href="http://codesion.com/products/free-subversion-hosting.html">Codesion</a> – 200 Мб SVN & CVS, 1 пользователь, Trac & Bugzilla</li>
<li><a href="http://www.xp-dev.com/pricing">XP-dev</a> – 200 Мб SVN, неограничено пользователей, Trac и текстовая реклама от Google</li>
<li><a href="http://www.projectlocker.com/">ProjectLocker</a> – 500 Мб SVN & Git, 5 пользователей, Trac и туча рекламы</li>
<li><a href="http://www.ezsvn.com/index.php?APP=&ACT=products">EZ subversion</a> – 200 Мб SVN, 1 пользователь</li>
<li><a href="http://www.sliksvn.com/">Slik subversion</a> – 100 Мб SVN, 1 пользователь, Trac</li>
<li><a href="http://beanstalkapp.com/pricing">Beanstalk</a> – 100 Мб SVN, 3 пользователя <i>бесплатный аккаунт спрятан в ссылке под списком тарифных планов</i> <img src='http://actualwave.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </li>
<li><a href="http://www.myversioncontrol.com/prices/">myVersionControl</a> – 100 Мб SVN, 3 пользователя, Trac</li>
</ul>
<p>Отсортировал по ИМХО, но пользовался только четырьмя из всех, поэтому они идут первыми в списке.  <img src='http://actualwave.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Ещё нашёл <a href="http://www.svnhostingcomparison.com/">список тарифов SVN хостингов</a> с возможностью фильтрации. </p>
]]></content:encoded>
			<wfw:commentRss>http://actualwave.com/blog/?feed=rss2&amp;p=455</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>_global для ActionScript 3</title>
		<link>http://actualwave.com/blog/?p=480</link>
		<comments>http://actualwave.com/blog/?p=480#comments</comments>
		<pubDate>Thu, 01 Apr 2010 18:54:46 +0000</pubDate>
		<dc:creator>actual_wave</dc:creator>
				<category><![CDATA[ActionScript 3]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[_global]]></category>

		<guid isPermaLink="false">http://actualwave.com/blog/?p=480</guid>
		<description><![CDATA[В ActionScript 1 и иногда во втором, скорее по привычке, было полезно обратиться к глобальному хранилищу данных. Сейчас глобальный объект не несёт такой важной функциональности, но он всё ещё живёт, правда, запрятан далековато и просто так к нему не пробраться. Разве что, вы принципиально не пользуетесь классами в ActionScript 3 и строите свой замок на [...]]]></description>
			<content:encoded><![CDATA[<p>В ActionScript 1 и иногда во втором, скорее по привычке, было полезно обратиться к глобальному хранилищу данных. Сейчас глобальный объект не несёт такой важной функциональности, но он всё ещё живёт, правда, запрятан далековато и просто так к нему не пробраться. Разве что, вы принципиально не пользуетесь классами в ActionScript 3 и строите свой замок на прототипах. <img src='http://actualwave.com/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /> </p>
<p><span id="more-480"></span></p>
<p>В общем, как-то в поисках истины я написал маленький классик для быстрого доступа к этому объекту:</p>
<div class="more_syntax">
<pre class="actionscript3"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #006699; font-weight: bold;">package</span> aw.<span style="color: #006600;">utils</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	<span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">class</span> Global <span style="color: #006699; font-weight: bold;">extends</span> <span style="color: #0000cc; font-weight: bold;">Object</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">		<span style="color: #66cccc; font-weight: bold;">static</span> <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">function</span> <span style="color: #006699; font-weight: bold;">get</span> instance<span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>:<span style="color: #0000cc; font-weight: bold;">Object</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">			<span style="color: #669933; font-weight: bold;">if</span><span style="color: #663366;">&#40;</span>!_instance<span style="color: #663366;">&#41;</span> getInstance<span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">			<span style="color: #669933; font-weight: bold;">return</span> _instance;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">		<span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">		<span style="color: #66cccc; font-weight: bold;">static</span> <span style="color: #66cccc; font-weight: bold;">private</span> <span style="color: #006699; font-weight: bold;">var</span> _instance:<span style="color: #0000cc; font-weight: bold;">Object</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">		<span style="color: #66cccc; font-weight: bold;">static</span> <span style="color: #66cccc; font-weight: bold;">protected</span> <span style="color: #006699; font-weight: bold;">function</span> getInstance<span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>:<span style="color: #669933; font-weight: bold;">void</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">			_instance = <span style="color: #663366;">&#40;</span><span style="color: #006699; font-weight: bold;">function</span><span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>:<span style="color: #0000cc; font-weight: bold;">Object</span><span style="color: #663366;">&#123;</span><span style="color: #669933; font-weight: bold;">return</span> <span style="color: #669933; font-weight: bold;">this</span><span style="color: #663366;">&#125;</span><span style="color: #663366;">&#41;</span>.<span style="color: #006600;">call</span><span style="color: #663366;">&#40;</span><span style="color: #669933; font-weight: bold;">null</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">		<span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	<span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #663366;">&#125;</span></div></li></ol></pre>
</div>
<p>Если воспользоваться им и протрейсить объект находящийся в Global.instance, то получите вот такой трейс:</p>
<p><code>[object global]</code></p>
<p>Меня долго колбасило, но ничего путного я не смог из него выжать. Загрузку тоже делать не буду, просто чтоб узнали, те кто не знал.</p>
<p>З.Ы.: С первым апреля!</p>
]]></content:encoded>
			<wfw:commentRss>http://actualwave.com/blog/?feed=rss2&amp;p=480</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AFPUGSC &#8211; Adobe Flash Plaform User Group Skype Chat</title>
		<link>http://actualwave.com/blog/?p=445</link>
		<comments>http://actualwave.com/blog/?p=445#comments</comments>
		<pubDate>Fri, 12 Mar 2010 01:06:44 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Новости]]></category>

		<guid isPermaLink="false">http://actualwave.com/blog/?p=445</guid>
		<description><![CDATA[Аббревиатурой хотел переплюнуть BURAFPUG, почти получилось.   Микропост, чтоб сохранить ссылки на Skype чаты юзер групп, а то вечно выйди и потом хрен зайдёшь.  


UAFPUG
BAFPUG


RAFPUG Chat, как мне сказали, канул в лету. Если вы знаете ещё какой-нибудь полезный flash/flex/air чат, оставьте ссылку в комментариях, я добавлю к посту.
Кстати, ярлыки на рабочем столе всегда [...]]]></description>
			<content:encoded><![CDATA[<p>Аббревиатурой хотел переплюнуть BURAFPUG, почти получилось. <img src='http://actualwave.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Микропост, чтоб сохранить ссылки на Skype чаты юзер групп, а то вечно выйди и потом хрен зайдёшь. <img src='http://actualwave.com/blog/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' /> </p>
<table border="0" cellspacing="20">
<tr>
<td><a href="skype:?chat&blob=pQi9e6i9MP3cdJs_oTd0TL3rEEsFY2aLheIuPZy3xc6xtA6LCpDmgnjjdxtuDdoQGcoH2YhILuo5wnqnQ2Iqas3Yz3ILcAcf_ZIX0a33NTQssS_J3u-RW_RQmF5skC9fxR5xhQ0VEiWaUNFm9o6a_76h3HULRfd5m393vQUhXCi0VwxRA_0uqwD5JWiw7FnaStM"><img src="http://actualwave.com/blog/wp-content/uploads/images/afpugsc_afp_user_groups_skype_chat_links/skype-icon_small.png" alt="UAFPUG"/><br/>UAFPUG</a></td>
<td><a href="skype:?chat&blob=YJr20k-xGwupce4F2PMiZxZO8ZLGlKbnHy9JVS-LpgfYJ_K4L_5I4f5NuvDgFpKU71NV6BDn5rBd2LovtWFsPunSPxStiyoDDKDA2BjjDD_7hUfNQc7jmTv4zgUsoKMaee6FYdti05wcFJiyCfHc6sUMMuqmuo5OU9Gpd8_2Ne_GCWMgP1_I2Pp0wlE"><img src="http://actualwave.com/blog/wp-content/uploads/images/afpugsc_afp_user_groups_skype_chat_links/skype-icon_small.png" alt="BAFPUG"/><br/>BAFPUG</a></td>
</tr>
</table>
<p>RAFPUG Chat, как мне сказали, канул в лету. Если вы знаете ещё какой-нибудь полезный flash/flex/air чат, оставьте ссылку в комментариях, я добавлю к посту.<br />
Кстати, ярлыки на рабочем столе всегда срабатывают(при наличии корректно установленного Skype приложения).<br />
<a class="downloadlink" href="http://actualwave.com/blog/wp-content/plugins/download-monitor/download.php?id=20" title=" downloaded 116 times" >Flash Platform Skype Chats (116)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://actualwave.com/blog/?feed=rss2&amp;p=445</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Модальные окна в AIR, компонент для Flex 4</title>
		<link>http://actualwave.com/blog/?p=435</link>
		<comments>http://actualwave.com/blog/?p=435#comments</comments>
		<pubDate>Fri, 05 Mar 2010 21:20:19 +0000</pubDate>
		<dc:creator>actual_wave</dc:creator>
				<category><![CDATA[AIR]]></category>
		<category><![CDATA[ActionScript 3]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Gumbo]]></category>
		<category><![CDATA[modal]]></category>
		<category><![CDATA[NativeWindow]]></category>
		<category><![CDATA[window]]></category>

		<guid isPermaLink="false">http://actualwave.com/blog/?p=435</guid>
		<description><![CDATA[Сегодня понадобилось сделать модальное окно в AIR, пошарив по интернету я не смог найти вменяемый пример, поэтому написал свою версию. Если учитывать скупость средств, то можно сказать, что это одна из не многих версий.
Можно скачать MXML компонент , а можно посмотреть код под катом.


&#60;?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?&#62;&#60;s:Window minimizable=&#34;false&#34; maximizable=&#34;false&#34; resizable=&#34;false&#34; showStatusBar=&#34;false&#34; type=&#34;{NativeWindowType.UTILITY}&#34;		  xmlns:fx=&#34;http://ns.adobe.com/mxml/2009&#34;		  xmlns:s=&#34;library://ns.adobe.com/flex/spark&#34;		 [...]]]></description>
			<content:encoded><![CDATA[<p>Сегодня понадобилось сделать модальное окно в AIR, пошарив по интернету я не смог найти вменяемый пример, поэтому написал свою версию. Если учитывать скупость средств, то можно сказать, что это одна из не многих версий.<br />
Можно скачать MXML компонент <a class="downloadlink" href="http://actualwave.com/blog/wp-content/plugins/download-monitor/download.php?id=19" title=" downloaded 154 times" >Flex 4 модальное окно (154)</a>, а можно посмотреть код под катом.<br />
<span id="more-435"></span></p>
<div class="more_syntax">
<pre class="actionscript3"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">&lt;?<span style="color: #0000cc; font-weight: bold;">xml</span> version=<span style="color: #ff33cc; font-style: italic;">&quot;1.0&quot;</span> encoding=<span style="color: #ff33cc; font-style: italic;">&quot;utf-8&quot;</span>?&gt;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">&lt;s:Window minimizable=<span style="color: #ff33cc; font-style: italic;">&quot;false&quot;</span> maximizable=<span style="color: #ff33cc; font-style: italic;">&quot;false&quot;</span> resizable=<span style="color: #ff33cc; font-style: italic;">&quot;false&quot;</span> showStatusBar=<span style="color: #ff33cc; font-style: italic;">&quot;false&quot;</span> type=<span style="color: #ff33cc; font-style: italic;">&quot;{NativeWindowType.UTILITY}&quot;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">		  xmlns:fx=<span style="color: #ff33cc; font-style: italic;">&quot;http://ns.adobe.com/mxml/2009&quot;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">		  xmlns:s=<span style="color: #ff33cc; font-style: italic;">&quot;library://ns.adobe.com/flex/spark&quot;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">		  xmlns:mx=<span style="color: #ff33cc; font-style: italic;">&quot;library://ns.adobe.com/flex/halo&quot;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">		  preinitialize=<span style="color: #ff33cc; font-style: italic;">&quot;preinitializeHandler(event)&quot;</span>&gt;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	&lt;fx:Script&gt;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">		&lt;!<span style="color: #663366;">&#91;</span>CDATA<span style="color: #663366;">&#91;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">			<span style="color: #006600; font-weight: bold;">import</span> <span style="color: #660099 !important; font-weight: bold;">flash.<span style="color: #006600;">display</span></span>.<span style="color: #006600;">NativeWindow</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">			<span style="color: #006600; font-weight: bold;">import</span> <span style="color: #660099 !important; font-weight: bold;">flash.<span style="color: #006600;">events</span></span>.<span style="color: #0000cc; font-weight: bold;">Event</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">			<span style="color: #66cccc; font-weight: bold;">protected</span> <span style="color: #006699; font-weight: bold;">function</span> preinitializeHandler<span style="color: #663366;">&#40;</span><span style="color: #0000cc; font-weight: bold;">event</span>:<span style="color: #0000cc; font-weight: bold;">Event</span><span style="color: #663366;">&#41;</span>:<span style="color: #669933; font-weight: bold;">void</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">				<span style="color: #006699; font-weight: bold;">var</span> windows:<span style="color: #0000cc; font-weight: bold;">Array</span> = NativeApplication.<span style="color: #006600;">nativeApplication</span>.<span style="color: #006600;">openedWindows</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">				<span style="color: #669933; font-weight: bold;">for</span> <span style="color: #669933; font-weight: bold;">each</span><span style="color: #663366;">&#40;</span><span style="color: #006699; font-weight: bold;">var</span> window:NativeWindow <span style="color: #669933; font-weight: bold;">in</span> windows<span style="color: #663366;">&#41;</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">					<span style="color: #669933; font-weight: bold;">if</span><span style="color: #663366;">&#40;</span>window===<span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">nativeWindow</span><span style="color: #663366;">&#41;</span> <span style="color: #669933; font-weight: bold;">continue</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">					window.<span style="color: #006600;">addEventListener</span><span style="color: #663366;">&#40;</span><span style="color: #0000cc; font-weight: bold;">Event</span>.<span style="color: #006600;">ACTIVATE</span>, <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">applicationWindowActivateHandler</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">					window.<span style="color: #006600;">addEventListener</span><span style="color: #663366;">&#40;</span><span style="color: #0000cc; font-weight: bold;">Event</span>.<span style="color: #006600;">CLOSE</span>, <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">applicationWindowCloseHandler</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">				<span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">				<span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">addEventListener</span><span style="color: #663366;">&#40;</span><span style="color: #0000cc; font-weight: bold;">Event</span>.<span style="color: #006600;">CLOSE</span>, <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">windowCloseHandler</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">				<span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">applicationWindowActivateHandler</span><span style="color: #663366;">&#40;</span><span style="color: #669933; font-weight: bold;">null</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">			<span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">			<span style="color: #66cccc; font-weight: bold;">protected</span> <span style="color: #006699; font-weight: bold;">function</span> applicationWindowActivateHandler<span style="color: #663366;">&#40;</span><span style="color: #0000cc; font-weight: bold;">event</span>:<span style="color: #0000cc; font-weight: bold;">Event</span><span style="color: #663366;">&#41;</span>:<span style="color: #669933; font-weight: bold;">void</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">				<span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">orderToFront</span><span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">				<span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">activate</span><span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">				<span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">setFocus</span><span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">				<span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">nativeWindow</span>.<span style="color: #006600;">notifyUser</span><span style="color: #663366;">&#40;</span>NotificationType.<span style="color: #006600;">INFORMATIONAL</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">			<span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">			<span style="color: #66cccc; font-weight: bold;">protected</span> <span style="color: #006699; font-weight: bold;">function</span> applicationWindowCloseHandler<span style="color: #663366;">&#40;</span><span style="color: #0000cc; font-weight: bold;">event</span>:<span style="color: #0000cc; font-weight: bold;">Event</span><span style="color: #663366;">&#41;</span>:<span style="color: #669933; font-weight: bold;">void</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">				<span style="color: #006699; font-weight: bold;">var</span> window:NativeWindow = <span style="color: #0000cc; font-weight: bold;">event</span>.<span style="color: #006600;">target</span> <span style="color: #0000cc; font-weight: bold;">as</span> NativeWindow;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">				window.<span style="color: #006600;">removeEventListener</span><span style="color: #663366;">&#40;</span><span style="color: #0000cc; font-weight: bold;">Event</span>.<span style="color: #006600;">ACTIVATE</span>, <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">applicationWindowActivateHandler</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">				window.<span style="color: #006600;">removeEventListener</span><span style="color: #663366;">&#40;</span><span style="color: #0000cc; font-weight: bold;">Event</span>.<span style="color: #006600;">CLOSE</span>, <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">applicationWindowCloseHandler</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">			<span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">			<span style="color: #66cccc; font-weight: bold;">protected</span> <span style="color: #006699; font-weight: bold;">function</span> windowCloseHandler<span style="color: #663366;">&#40;</span><span style="color: #0000cc; font-weight: bold;">event</span>:<span style="color: #0000cc; font-weight: bold;">Event</span><span style="color: #663366;">&#41;</span>:<span style="color: #669933; font-weight: bold;">void</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">				<span style="color: #006699; font-weight: bold;">var</span> windows:<span style="color: #0000cc; font-weight: bold;">Array</span> = NativeApplication.<span style="color: #006600;">nativeApplication</span>.<span style="color: #006600;">openedWindows</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">				<span style="color: #669933; font-weight: bold;">for</span> <span style="color: #669933; font-weight: bold;">each</span><span style="color: #663366;">&#40;</span><span style="color: #006699; font-weight: bold;">var</span> window:NativeWindow <span style="color: #669933; font-weight: bold;">in</span> windows<span style="color: #663366;">&#41;</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">					window.<span style="color: #006600;">removeEventListener</span><span style="color: #663366;">&#40;</span><span style="color: #0000cc; font-weight: bold;">Event</span>.<span style="color: #006600;">ACTIVATE</span>, <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">applicationWindowActivateHandler</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">					window.<span style="color: #006600;">removeEventListener</span><span style="color: #663366;">&#40;</span><span style="color: #0000cc; font-weight: bold;">Event</span>.<span style="color: #006600;">CLOSE</span>, <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">applicationWindowCloseHandler</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">				<span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">				<span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">nativeWindow</span>.<span style="color: #006600;">removeEventListener</span><span style="color: #663366;">&#40;</span><span style="color: #0000cc; font-weight: bold;">Event</span>.<span style="color: #006600;">CLOSE</span>, <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">applicationWindowCloseHandler</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">			<span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">		<span style="color: #663366;">&#93;</span><span style="color: #663366;">&#93;</span>&gt;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	&lt;/fx:Script&gt;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	&lt;fx:Declarations&gt;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">		&lt;!-- Place non-visual elements <span style="color: #663366;">&#40;</span>e.<span style="color: #006600;">g</span>., services, value objects<span style="color: #663366;">&#41;</span> here --&gt;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	&lt;/fx:Declarations&gt;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">&lt;/s:Window&gt;</div></li></ol></pre>
</div>
<p>Как видите, всё очень просто и можно догадаться, что будут проблемы, если открыть не одно модальное окно.  <img src='http://actualwave.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Но нужно было одно одновременно открытое окно и если понадобиться больше, будет пост. <img src='http://actualwave.com/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /><br />
Если у вас есть готовые решения, не только для Flex, кидайте ссылки в комментарии.</p>
]]></content:encoded>
			<wfw:commentRss>http://actualwave.com/blog/?feed=rss2&amp;p=435</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Asset Modifier, внедрение кода во встраиваемую анимацию</title>
		<link>http://actualwave.com/blog/?p=416</link>
		<comments>http://actualwave.com/blog/?p=416#comments</comments>
		<pubDate>Wed, 17 Feb 2010 02:59:46 +0000</pubDate>
		<dc:creator>actual_wave</dc:creator>
				<category><![CDATA[ActionScript 3]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[addFrameScript]]></category>
		<category><![CDATA[asset]]></category>
		<category><![CDATA[Asset Modifier]]></category>
		<category><![CDATA[code injection]]></category>
		<category><![CDATA[Embed]]></category>
		<category><![CDATA[MovieClip]]></category>
		<category><![CDATA[symbol]]></category>

		<guid isPermaLink="false">http://actualwave.com/blog/?p=416</guid>
		<description><![CDATA[UPD 20.02.2010: Перенёс проект на Google code и добавил новый модификатор AssetCustomModifier, в который можно передавать любую функцию/метод.
Предположим, что вы разрабатываете приложение с анимацией и аниматор поставляет вам шаблоны анимации без кода, а вам надо управлять графикой и анимацией в разрабатываемом приложении. Если это так, возможно этот проект окажется решением.

Суть работы в том, что аниматор [...]]]></description>
			<content:encoded><![CDATA[<p><i>UPD 20.02.2010: Перенёс проект на <a href="http://code.google.com/p/as3-asset-modifier/">Google code</a> и добавил новый модификатор AssetCustomModifier, в который можно передавать любую функцию/метод.</i></p>
<p>Предположим, что вы разрабатываете приложение с анимацией и аниматор поставляет вам шаблоны анимации без кода, а вам надо управлять графикой и анимацией в разрабатываемом приложении. Если это так, возможно этот проект окажется решением.</p>
<p><span id="more-416"></span></p>
<p>Суть работы в том, что аниматор по завершении работы оставляет специальные метки в качестве меток кадров.</p>
<p><center><img src="http://actualwave.com/blog/wp-content/uploads/images/assetmodifier_code_injection_into_animation_template/flash_label1.png"/></center></p>
<p>Эти метки привязываются к заготовке и экспортируются со всем остальным содержимым в SWF/SWC файл. Когда программист получает экземпляр заготовки, он должен передать её в метод ModifierManager.apply(). При этом ModifierManager проводит поиск меток в кадрах и если находит необходимые метки, то заменяет код кадра на код, заранее подготовленного, модификатора. Код вставляется с помощью метода MovieClip.addFrameScript() в кадр с меткой, указателем на модификатор. Отдельно надо заметить, что в код кадра анимации попадает только описанный вами код, без дополнительных надстроек, поэтому анимация должна играть так же, как если бы вставили этот код прямо в кадр во Flash IDE.</p>
<p>Модификатор, это класс реализующий интерфейс IAssetModifier, способный возвращать экземпляр Function – эта функция и будет выполнять роль кода в кадре.</p>
<div class="more_syntax">
<pre class="actionscript3"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #006699; font-weight: bold;">package</span> aw.<span style="color: #006600;">projects</span>.<span style="color: #006600;">assetmodifier</span>.<span style="color: #006600;">modifiers</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	<span style="color: #006600; font-weight: bold;">import</span> <span style="color: #660099 !important; font-weight: bold;">flash.<span style="color: #006600;">display</span></span>.<span style="color: #0000cc; font-weight: bold;">MovieClip</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	<span style="color: #808080; font-style: italic;">/**</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">	 * @author Galaburda a_[w] Oleg</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">	 */</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	<span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">class</span> AssetStopModifier <span style="color: #006699; font-weight: bold;">extends</span> <span style="color: #0000cc; font-weight: bold;">Object</span> <span style="color: #006699; font-weight: bold;">implements</span> IAssetModifier<span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">		<span style="color: #66cccc; font-weight: bold;">static</span> <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">const</span> <span style="color: #669933; font-weight: bold;">LABEL</span>:<span style="color: #0000cc; font-weight: bold;">String</span> = <span style="color: #ff33cc; font-style: italic;">'stop'</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">		<span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">function</span> AssetStopModifier<span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>:<span style="color: #669933; font-weight: bold;">void</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">			<span style="color: #669933; font-weight: bold;">super</span><span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">		<span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">		<span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">function</span> <span style="color: #006699; font-weight: bold;">get</span> <span style="color: #669933; font-weight: bold;">label</span><span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>:<span style="color: #0000cc; font-weight: bold;">String</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">			<span style="color: #669933; font-weight: bold;">return</span> <span style="color: #669933; font-weight: bold;">LABEL</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">		<span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">		<span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">function</span> getHandler<span style="color: #663366;">&#40;</span>clip:<span style="color: #0000cc; font-weight: bold;">MovieClip</span>, rawParametersString:<span style="color: #0000cc; font-weight: bold;">String</span>=<span style="color: #ff33cc; font-style: italic;">''</span><span style="color: #663366;">&#41;</span>:<span style="color: #006699; font-weight: bold;">Function</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">			<span style="color: #006699; font-weight: bold;">var</span> handler:<span style="color: #006699; font-weight: bold;">Function</span> = <span style="color: #006699; font-weight: bold;">function</span><span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>:<span style="color: #669933; font-weight: bold;">void</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">				<span style="color: #0000cc; font-weight: bold;">arguments</span>.<span style="color: #006600;">callee</span>.<span style="color: #006600;">target</span>.<span style="color: #006600;">stop</span><span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">			<span style="color: #663366;">&#125;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">			<span style="color: #663366;">&#40;</span>handler <span style="color: #0000cc; font-weight: bold;">as</span> <span style="color: #0000cc; font-weight: bold;">Object</span><span style="color: #663366;">&#41;</span>.<span style="color: #006600;">target</span> = clip;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">			<span style="color: #669933; font-weight: bold;">return</span> handler;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">		<span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	<span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #663366;">&#125;</span></div></li></ol></pre>
</div>
<p>Каждый модификатор, так же, содержит название метки к которой он привязывается. Для использования модификаторов, они должны быть зарегистрированы в менеджере модификаторов. Для регистрации можно использовать один из двух методов менеджера:</p>
<ul style="text-align:left">
<li>registerModifier(modifier:IAssetModifier):void – регистрирует экземпляр модификатора многоразового использования</li>
<li>registerModifierByDefinition(label:String, definition:Class):void – регистрирует класс модификаторов, в таком случае для каждого кадра будет<br />
создаваться свой экземпляр модификатора</li>
</ul>
<div class="more_syntax">
<pre class="actionscript3"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #006699; font-weight: bold;">var</span> manager:ModifierManager = <span style="color: #0000cc; font-weight: bold;">new</span> ModifierManager<span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">manager.<span style="color: #006600;">registerModifier</span><span style="color: #663366;">&#40;</span><span style="color: #0000cc; font-weight: bold;">new</span> AssetStopModifier<span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">manager.<span style="color: #006600;">registerModifier</span><span style="color: #663366;">&#40;</span><span style="color: #0000cc; font-weight: bold;">new</span> ExampleInstanceModifier<span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">manager.<span style="color: #006600;">registerModifierByDefinition</span><span style="color: #663366;">&#40;</span>ExampleDefinitionModifier.<span style="color: #669933; font-weight: bold;">LABEL</span>, ExampleDefinitionModifier<span style="color: #663366;">&#41;</span>;</div></li></ol></pre>
</div>
<p>Можно создавать экземпляры менеджера или использовать одноимённые статические методы, как вариант глобального менеджера. Каждый менеджер содержит в себе идентификатор меток, которые он обрабатывает – это символ предваряющий каждую метку. Глобальный менеджер или любой другой по-умолчанию используют символ точки в качестве идентификатора. Получается, что если модификатор регистрируется с меткой "label", то, с идентификатором по-умолчанию, использоваться она должна как ".label".</p>
<p>Ещё метка может нести с собой некоторые данные, заключённые в круглые скобки -- .label(raw parameters). Такие данные не обрабатываются и передаются в модификатор "как есть". Но в комплект поставки входит класс ModifierParserUtils, который способен обработать</p>
<ul style="text-align:left">
<li>список аргументов в виде списка значений: <code>.label("value1", "value2", "value3", true, 123)</code>. В таком случае будет возвращён массив</li>
<li>список параметров в виде списка именованных значений: <code>.label(parameter1="value1", parameter2="value2", parameter3="value3", parameterBool=true, parameterInt=123)</code>. В таком случае будет возвращён экземпляр класса Object со значениями в одноимённых параметрах этого объекта</li>
</ul>
<p>В проекте присутствуют заранее подготовленные модификаторы:</p>
<ul>
<li>AssetBrakepointModifier – устанавливает брейкпоинт на кадр</li>
<li>AssetCustomModifier – вызывает функцию полученную конструкторе(AssetCustomModifier.handler), не имеет метки по-умолчанию</li>
<li>AssetEventModifier – вызывает событие</li>
<li>AssetGotoModifier – производит переход, аналог gotoAndPlay/gotoAndStop</li>
<li>AssetMultiModifier – контейнер для нескольких модификаторов, можно группировать модификаторы для вызова их в одном кадре. Не имеет метки по-умолчанию</li>
<li>AssetStopModifier – останавливает воспроизведение анимации, stop</li>
<li>AssetTraceModifier – выдаёт сообщение в консоль, trace</li>
</ul>
<p><center><img src="http://actualwave.com/blog/wp-content/uploads/images/assetmodifier_code_injection_into_animation_template/flash_label2.png"/></center></p>
<p>Реализуя интерфейс модификаторов возможно создавать абсолютно любые модификаторы. А используя различные идентификаторы меток, можно разнообразить жизнь аниматоров самым невообразимым образом. <img src='http://actualwave.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Ниже можно загрузить примеры и исходный код проекта.</p>
<p>Так же, в проекте присутствуют конструкторы:</p>
<ul>
<li>AssetConstructor – обслуживает один экземпляр шаблона анимации</li>
<li>MultiAssetConstructor – абстрактный класс для обслуживания группы шаблонов анимации</li>
</ul>
<p>Суть конструктора в том, что он содержит ссылку на класс шаблона анимации и ссылку на менеджер модификаторов и каждый раз, при создании экземпляра анимации, отдаёт его на обработку в менеджер модификаторов. Если в конструктор не передавать ссылку на конкретный менеджер модификаторов, то будет использован глобальный.</p>
<div class="more_syntax">
<pre class="actionscript3"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #006699; font-weight: bold;">var</span> constructor:AssetConstructor = <span style="color: #0000cc; font-weight: bold;">new</span> AssetConstructor<span style="color: #663366;">&#40;</span>ASSET_DEFINITION<span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">asset = constructor.<span style="color: #006600;">getAsset</span><span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">addChild</span><span style="color: #663366;">&#40;</span>asset<span style="color: #663366;">&#41;</span>;</div></li></ol></pre>
</div>
<p>Как вам известно, при внедрении конкретных символов с помощью мета-тега [Embed]:<code>[Embed(source="asset.swf", symbol="Asset")]</code>, весь код находившийся в кадрах или ещё где-либо теряется. Этот проект создавался изначально чтоб решить эту проблему, т.к. метки кадров остаются и их можно использовать, чтоб идентифицировать кадры в которых должен быть определённый код.</p>
<p>В общем, я подготовил несколько примеров, чтоб каждый желающий мог понять с чем имеет дело.</p>
<p>Скачать <a class="downloadlink" href="http://actualwave.com/blog/wp-content/plugins/download-monitor/download.php?id=17" title=" downloaded 61 times" >исходный код проекта Asset Modifier (61)</a></p>
<a class="downloadlink" href="http://actualwave.com/blog/wp-content/plugins/download-monitor/download.php?id=18" title=" downloaded 70 times" >Примеры использования Asset Modifier (70)</a>
]]></content:encoded>
			<wfw:commentRss>http://actualwave.com/blog/?feed=rss2&amp;p=416</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>EvalUtils – простой парсер команд</title>
		<link>http://actualwave.com/blog/?p=382</link>
		<comments>http://actualwave.com/blog/?p=382#comments</comments>
		<pubDate>Wed, 17 Feb 2010 00:41:58 +0000</pubDate>
		<dc:creator>actual_wave</dc:creator>
				<category><![CDATA[ActionScript 3]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Новости]]></category>
		<category><![CDATA[aw.utils.EvalUtils]]></category>
		<category><![CDATA[eval]]></category>

		<guid isPermaLink="false">http://actualwave.com/blog/?p=382</guid>
		<description><![CDATA[Когда-то давно мне было интересно написать интерпретатор ActionScript 3 и я начал его писать.   Но через некоторое время узнал о существовании компилятора ActionScript 3, портированом из кода проекта Tamarin. Конечно, интерпретатор потерял смысл в моих глазах, но часть кода уже была написана и я решил быстро сконцентрировать полученные знания и наработки в небольшом [...]]]></description>
			<content:encoded><![CDATA[<p>Когда-то давно мне было интересно написать интерпретатор ActionScript 3 и я начал его писать. <img src='http://actualwave.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Но через некоторое время узнал о существовании <a href="http://eval.hurlant.com/">компилятора ActionScript 3</a>, портированом из кода проекта <a href="http://www.mozilla.org/projects/tamarin/">Tamarin</a>. Конечно, интерпретатор потерял смысл в моих глазах, но часть кода уже была написана и я решил быстро сконцентрировать полученные знания и наработки в небольшом интерпретаторе команд, описанных в точечной нотации, поддерживающий особенности <nobr>ActionScript 3.</nobr> Так я получил клубок кода, который почти всегда делает то что мне нужно, использовал его в нескольких проектах и решил выложить здесь отдельно.</p>
<p><span id="more-382"></span><br />
Пример консоли, можете попробовать в действии. <img src='http://actualwave.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
<iframe src="http://actualwave.com/blog/examples/evalutils_simple_command_parser/" width="400" height="600" scrolling="no" frameborder="0"></iframe></p>
<p>Использование сводится к вызову статического метода aw.utils.EvalUtils.evaluate(), которому в качестве обязательного аргумента надо передать строку для обработки, далее могут следовать два не обязательных аргумента – объект определяющий область видимости в которой должен выполняться код и объект итерации, в котором можно указать позицию с которой надо начинать обработку.</p>
<p>Этот парсер создавался для работы с ActionScript 3 командами и вот, что он может делать:</p>
<ul>
<li>"понимает" пространства имён, при условии, что необходимый объект Namespace лежит в области видимости</li>
</ul>
<div class="more_syntax">
<pre class="actionscript3"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #006699; font-weight: bold;">var</span> scope:<span style="color: #0000cc; font-weight: bold;">Object</span> = <span style="color: #663366;">&#123;</span>ns:<span style="color: #0000cc; font-weight: bold;">new</span> <span style="color: #006699; font-weight: bold;">Namespace</span><span style="color: #663366;">&#40;</span><span style="color: #ff33cc; font-style: italic;">&quot;&quot;</span><span style="color: #663366;">&#41;</span>, parameter:<span style="color: #ff33cc; font-style: italic;">&quot;some value&quot;</span><span style="color: #663366;">&#125;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000cc; font-weight: bold;">trace</span><span style="color: #663366;">&#40;</span>EvalUtils.<span style="color: #006600;">evaluate</span><span style="color: #663366;">&#40;</span><span style="color: #ff33cc; font-style: italic;">'this.ns:parameter'</span>, scope<span style="color: #663366;">&#41;</span><span style="color: #663366;">&#41;</span>; <span style="color: #808080; font-style: italic;">// some value</span></div></li></ol></pre>
</div>
<ul>
<li>распознаёт и обрабатывает регулярные выражения и XML данные</li>
</ul>
<div class="more_syntax">
<pre class="actionscript3"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000cc; font-weight: bold;">trace</span><span style="color: #663366;">&#40;</span>EvalUtils.<span style="color: #006600;">evaluate</span><span style="color: #663366;">&#40;</span><span style="color: #ff33cc; font-style: italic;">'&quot; s o m e   v a l u e &quot;.match(/<span style="color: #000099; font-weight: bold;">\\</span>s+/g).length'</span><span style="color: #663366;">&#41;</span><span style="color: #663366;">&#41;</span>; <span style="color: #808080; font-style: italic;">// 10</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #006699; font-weight: bold;">var</span> data:<span style="color: #0000cc; font-weight: bold;">XMLList</span> = EvalUtils.<span style="color: #006600;">evaluate</span><span style="color: #663366;">&#40;</span><span style="color: #ff33cc; font-style: italic;">'&lt;root&gt;&lt;data&gt;&lt;![CDATA[Hello world!]]&gt;&lt;/data&gt;&lt;/root&gt;.data.text()'</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000cc; font-weight: bold;">trace</span><span style="color: #663366;">&#40;</span>data<span style="color: #663366;">&#41;</span>; <span style="color: #808080; font-style: italic;">// Hello world!</span></div></li></ol></pre>
</div>
<ul>
<li>обрабатывает бычные массивы и объекты, описанные литералами. Возможно использовать кавычки в случае, если имя свойства объекта содержит "не стандартные" символы</li>
</ul>
<div class="more_syntax">
<pre class="actionscript3"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #006699; font-weight: bold;">var</span> data:<span style="color: #0000cc; font-weight: bold;">Object</span> = EvalUtils.<span style="color: #006600;">evaluate</span><span style="color: #663366;">&#40;</span><span style="color: #ff33cc; font-style: italic;">'{list:[{name:&quot;Oleg&quot;,  lastname:&quot;Galaburda&quot;}, {&quot;super/monster&lt;s&gt;<span style="color: #000099; font-weight: bold;">\\</span>&quot;-<span style="color: #000099; font-weight: bold;">\\</span>&quot;name&quot;:&quot;Hulk&quot;, lastname:&quot;Hulk&quot;}], xml:&lt;root/&gt;, regexp:/^<span style="color: #000099; font-weight: bold;">\s</span>*/, currentDate:new Date()}'</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000cc; font-weight: bold;">trace</span><span style="color: #663366;">&#40;</span>data.<span style="color: #0000cc; font-weight: bold;">list</span><span style="color: #663366;">&#41;</span>; <span style="color: #808080; font-style: italic;">// [object Object],[object Object]</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #669933; font-weight: bold;">for</span><span style="color: #663366;">&#40;</span><span style="color: #006699; font-weight: bold;">var</span> name:<span style="color: #0000cc; font-weight: bold;">String</span> <span style="color: #669933; font-weight: bold;">in</span> data.<span style="color: #0000cc; font-weight: bold;">list</span><span style="color: #663366;">&#91;</span><span style="color: #ff6600; font-weight: bold;">1</span><span style="color: #663366;">&#93;</span><span style="color: #663366;">&#41;</span> <span style="color: #0000cc; font-weight: bold;">trace</span><span style="color: #663366;">&#40;</span>name<span style="color: #663366;">&#41;</span>; <span style="color: #808080; font-style: italic;">// super/monster&lt;s&gt;&quot;-&quot;name, lastname</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000cc; font-weight: bold;">trace</span><span style="color: #663366;">&#40;</span><span style="color: #663366;">&#40;</span>data.<span style="color: #0000cc; font-weight: bold;">xml</span> <span style="color: #0000cc; font-weight: bold;">as</span> <span style="color: #0000cc; font-weight: bold;">XML</span><span style="color: #663366;">&#41;</span>.<span style="color: #006600;">toXMLString</span><span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span><span style="color: #663366;">&#41;</span>; <span style="color: #808080; font-style: italic;">// &lt;root/&gt;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000cc; font-weight: bold;">trace</span><span style="color: #663366;">&#40;</span><span style="color: #663366;">&#40;</span>data.<span style="color: #0000cc; font-weight: bold;">regexp</span> <span style="color: #0000cc; font-weight: bold;">as</span> <span style="color: #0000cc; font-weight: bold;">RegExp</span><span style="color: #663366;">&#41;</span>.<span style="color: #0000cc; font-weight: bold;">source</span><span style="color: #663366;">&#41;</span>; <span style="color: #808080; font-style: italic;">// ^s*</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000cc; font-weight: bold;">trace</span><span style="color: #663366;">&#40;</span><span style="color: #663366;">&#40;</span>data.<span style="color: #006600;">currentDate</span> <span style="color: #0000cc; font-weight: bold;">as</span> <span style="color: #0000cc; font-weight: bold;">Date</span><span style="color: #663366;">&#41;</span>.<span style="color: #006600;">toDateString</span><span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span><span style="color: #663366;">&#41;</span>; <span style="color: #808080; font-style: italic;">// Tue Feb 16 2010</span></div></li></ol></pre>
</div>
<ul>
<li>способен создавать экземпляры объектов, при условии что использовалось полное имя класса - package.ClassName</li>
</ul>
<div class="more_syntax">
<pre class="actionscript3"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #006699; font-weight: bold;">var</span> <span style="color: #0000cc; font-weight: bold;">sprite</span>:<span style="color: #0000cc; font-weight: bold;">Sprite</span> = EvalUtils.<span style="color: #006600;">evaluate</span><span style="color: #663366;">&#40;</span><span style="color: #ff33cc; font-style: italic;">'new flash.display.Sprite()'</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000cc; font-weight: bold;">trace</span><span style="color: #663366;">&#40;</span>EvalUtils.<span style="color: #006600;">evaluate</span><span style="color: #663366;">&#40;</span><span style="color: #ff33cc; font-style: italic;">'this.addChild(new flash.display.Shape())'</span>, <span style="color: #0000cc; font-weight: bold;">sprite</span><span style="color: #663366;">&#41;</span><span style="color: #663366;">&#41;</span>; <span style="color: #808080; font-style: italic;">// [object Shape]</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">addChild</span><span style="color: #663366;">&#40;</span><span style="color: #0000cc; font-weight: bold;">sprite</span><span style="color: #663366;">&#41;</span>;</div></li></ol></pre>
</div>
<p>Что он не может делать:</p>
<ul>
<li>Использовать логические конструкции switch, if-else, ?:</li>
<li>Использовать любые цыклы</li>
<li>Обрабатывать больше одного выражения, правда, может обработать вложенные выражения</li>
<li>Создавать функции, методы; объявлять классы, интерфейсы и прочее</li>
</ul>
<p>Основная цель этого проекта, это встраивание в другие проекты. Использовал его в <a href="http://guibuilder.org/">GUIBuilder.org</a>, <a href="http://code.google.com/p/jsinterface/">JSInterface</a>, <a href="http://actualwave.com/blog/?p=416">Asset Modifier</a>. Плюс в том, что он весит в несколько раз меньше и работает достаточно быстро.</p>
<p>Скачать <a class="downloadlink" href="http://actualwave.com/blog/wp-content/plugins/download-monitor/download.php?id=16" title=" downloaded 60 times" >aw.utils.EvalUtils (60)</a></p>
<p>Если нужно что-то мощнее, можете посмотреть вот эти проекты:</p>
<p><a href="http://www.riaone.com/deval/">The D.eval API</a><br />
<a href="http://eval.hurlant.com/">As3 Eval</a><br />
<a href="http://code.google.com/p/as3scriptinglib/">as3scriptinglib</a></p>
]]></content:encoded>
			<wfw:commentRss>http://actualwave.com/blog/?feed=rss2&amp;p=382</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Особенность методов XML объектов в ActionScript 3</title>
		<link>http://actualwave.com/blog/?p=371</link>
		<comments>http://actualwave.com/blog/?p=371#comments</comments>
		<pubDate>Tue, 16 Feb 2010 01:23:42 +0000</pubDate>
		<dc:creator>actual_wave</dc:creator>
				<category><![CDATA[ActionScript 3]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Новости]]></category>
		<category><![CDATA[flash.utils.Proxy]]></category>
		<category><![CDATA[Function]]></category>
		<category><![CDATA[method]]></category>
		<category><![CDATA[prototype]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://actualwave.com/blog/?p=371</guid>
		<description><![CDATA[Наткнулся на немного неожиданную "особенность" при работе с методами XML объектов. Такое забывать нельзя, поэтому подробности под катом.

Если вызывать метод напрямую то происходит операция call property и метод вызывается, мы получаем ожидаемый результат и всё хорошо. 

var xml:XML = &#60;root/&#62;;trace&#40;xml.toXMLString&#40;&#41;&#41;;// &#60;root/&#62;

Если попытаться получить ссылку на метод, то происходит get property, которая возвращает не ссылку на [...]]]></description>
			<content:encoded><![CDATA[<p>Наткнулся на немного неожиданную "особенность" при работе с методами XML объектов. Такое забывать нельзя, поэтому подробности под катом.</p>
<p><span id="more-371"></span></p>
<p>Если вызывать метод напрямую то происходит операция <code>call property</code> и метод вызывается, мы получаем ожидаемый результат и всё хорошо. </p>
<div class="more_syntax">
<pre class="actionscript3"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #006699; font-weight: bold;">var</span> <span style="color: #0000cc; font-weight: bold;">xml</span>:<span style="color: #0000cc; font-weight: bold;">XML</span> = &lt;root/&gt;;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000cc; font-weight: bold;">trace</span><span style="color: #663366;">&#40;</span><span style="color: #0000cc; font-weight: bold;">xml</span>.<span style="color: #006600;">toXMLString</span><span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span><span style="color: #663366;">&#41;</span>;<span style="color: #808080; font-style: italic;">// &lt;root/&gt;</span></div></li></ol></pre>
</div>
<p>Если попытаться получить ссылку на метод, то происходит <code>get property</code>, которая возвращает не ссылку на метод, а экземпляр XLList и, скорее всего, пустой. </p>
<div class="more_syntax">
<pre class="actionscript3"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #006699; font-weight: bold;">var</span> <span style="color: #0000cc; font-weight: bold;">xml</span>:<span style="color: #0000cc; font-weight: bold;">XML</span> = &lt;root/&gt;;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000cc; font-weight: bold;">trace</span><span style="color: #663366;">&#40;</span>getQualifiedClassName<span style="color: #663366;">&#40;</span><span style="color: #0000cc; font-weight: bold;">xml</span>.<span style="color: #006600;">toXMLString</span><span style="color: #663366;">&#41;</span><span style="color: #663366;">&#41;</span>; <span style="color: #808080; font-style: italic;">// XMLList</span></div></li></ol></pre>
</div>
<p>Если вызывать метод через динамическое имя, то сначала происходит <code>get property</code>, а потом виртуальная машина получает указание вызвать экземпляр XMLList, на что получаем законный экземляр Error’а. <img src='http://actualwave.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<div class="more_syntax">
<pre class="actionscript3"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #006699; font-weight: bold;">var</span> <span style="color: #0000cc; font-weight: bold;">xml</span>:<span style="color: #0000cc; font-weight: bold;">XML</span> = &lt;root/&gt;;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000cc; font-weight: bold;">trace</span><span style="color: #663366;">&#40;</span><span style="color: #0000cc; font-weight: bold;">xml</span><span style="color: #663366;">&#91;</span><span style="color: #ff33cc; font-style: italic;">'toXMLString'</span><span style="color: #663366;">&#93;</span><span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span><span style="color: #663366;">&#41;</span>;</div></li></ol></pre>
</div>
<p><code style="color:#ff0000">TypeError: Error #1006: value is not a function.</code></p>
<p>Если нужна ссылка на метод, то его можно достать через прототип XML.prototype. </p>
<div class="more_syntax">
<pre class="actionscript3"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #006699; font-weight: bold;">var</span> <span style="color: #0000cc; font-weight: bold;">xml</span>:<span style="color: #0000cc; font-weight: bold;">XML</span> = &lt;root/&gt;;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #006699; font-weight: bold;">var</span> method:<span style="color: #006699; font-weight: bold;">Function</span> = <span style="color: #0000cc; font-weight: bold;">XML</span>.<span style="color: #006600;">prototype</span>.<span style="color: #006600;">toXMLString</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000cc; font-weight: bold;">trace</span><span style="color: #663366;">&#40;</span>method.<span style="color: #006600;">apply</span><span style="color: #663366;">&#40;</span><span style="color: #0000cc; font-weight: bold;">xml</span>, <span style="color: #663366;">&#91;</span><span style="color: #663366;">&#93;</span><span style="color: #663366;">&#41;</span><span style="color: #663366;">&#41;</span>; <span style="color: #808080; font-style: italic;">// &lt;root/&gt;</span></div></li></ol></pre>
</div>
<p>Или, как подсказали в <a href="http://actualwave.com/blog/?p=371#comment-1155">комментарии</a>, через встроенное пространство имён AS3:</p>
<div class="more_syntax">
<pre class="actionscript3"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #006699; font-weight: bold;">var</span> <span style="color: #0000cc; font-weight: bold;">xml</span>:<span style="color: #0000cc; font-weight: bold;">XML</span> = &lt;root/&gt;;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #006699; font-weight: bold;">var</span> method:<span style="color: #006699; font-weight: bold;">Function</span> = <span style="color: #0000cc; font-weight: bold;">xml</span>.<span style="color: #006600; font-weight: bold;">AS3</span>::toXMLString;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000cc; font-weight: bold;">trace</span><span style="color: #663366;">&#40;</span>method.<span style="color: #006600;">apply</span><span style="color: #663366;">&#40;</span><span style="color: #0000cc; font-weight: bold;">xml</span>, <span style="color: #663366;">&#91;</span><span style="color: #663366;">&#93;</span><span style="color: #663366;">&#41;</span><span style="color: #663366;">&#41;</span>; <span style="color: #808080; font-style: italic;">// &lt;root/&gt;</span></div></li></ol></pre>
</div>
<p>В общем, в подобных случаях надо предусматривать отдельный алгоритм работы с объектами XML(и экземплярами недобросовестно описанных детей класса flash.utils.Proxy), либо вызывать методы напрямую.</p>
]]></content:encoded>
			<wfw:commentRss>http://actualwave.com/blog/?feed=rss2&amp;p=371</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Google группа JSInterface</title>
		<link>http://actualwave.com/blog/?p=366</link>
		<comments>http://actualwave.com/blog/?p=366#comments</comments>
		<pubDate>Wed, 03 Feb 2010 12:16:25 +0000</pubDate>
		<dc:creator>actual_wave</dc:creator>
				<category><![CDATA[ActionScript 3]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[JSInterface]]></category>
		<category><![CDATA[Новости]]></category>

		<guid isPermaLink="false">http://actualwave.com/blog/?p=366</guid>
		<description><![CDATA[Создал группу для обсуждения проекта, теперь все новости по проекту будут публиковаться там(на английском и русском языках). Так же, там будут происходить опросы общественности по поводу необходимости и важности изменений. Любой желающий может подключиться к группе и следить за развитием проекта и задавать интересующие вопросы.
P.S.: Группа модерируется, поэтому спама не будет, но могут быть задержки [...]]]></description>
			<content:encoded><![CDATA[<p>Создал <a href="http://groups.google.com/group/jsinterface">группу</a> для обсуждения <a href="http://code.google.com/p/jsinterface">проекта</a>, теперь все новости по проекту будут публиковаться там(на английском и русском языках). Так же, там будут происходить опросы общественности по поводу необходимости и важности изменений. Любой желающий может подключиться к группе и следить за развитием проекта и задавать интересующие вопросы.</p>
<p>P.S.: Группа модерируется, поэтому спама не будет, но могут быть задержки с сообщениями, если я в offline.</p>
]]></content:encoded>
			<wfw:commentRss>http://actualwave.com/blog/?feed=rss2&amp;p=366</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Караоке плеер &#171;Спиваймо&#187;</title>
		<link>http://actualwave.com/blog/?p=332</link>
		<comments>http://actualwave.com/blog/?p=332#comments</comments>
		<pubDate>Mon, 11 Jan 2010 20:54:43 +0000</pubDate>
		<dc:creator>actual_wave</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[Поделки]]></category>
		<category><![CDATA[karaoke]]></category>
		<category><![CDATA[player]]></category>
		<category><![CDATA[spivaimo.com]]></category>

		<guid isPermaLink="false">http://actualwave.com/blog/?p=332</guid>
		<description><![CDATA[Ещё летом ко мне обратились с заказом сделать караоке-плеер для нового проекта, ТЗ как такового не было, был сначала один сайт, пример, с которого надо было позаимствовать идеи, а потом – второй. Поэтому все доделки и переделки тянулись до осени, а сейчас появилось время детально описать решения, которые я опробовал.


Полностью скинуемый плеер
Обмен данными внутри плеера
Устройство [...]]]></description>
			<content:encoded><![CDATA[<p>Ещё летом ко мне обратились с заказом сделать караоке-плеер для нового проекта, ТЗ как такового не было, был сначала <a href="http://www.thekaraokechannel.com/">один сайт</a>, пример, с которого надо было позаимствовать идеи, а потом – <a href="http://www.karaoke.ru/">второй</a>. Поэтому все доделки и переделки тянулись до осени, а сейчас появилось время детально описать решения, которые я опробовал.</p>
<p><span id="more-332"></span></p>
<ul>
<li><a href="#absolutely_skinable_player">Полностью скинуемый плеер</a></li>
<li><a href="#data_exchange_inside_application">Обмен данными внутри плеера</a></li>
<li><a href="#ui_elements_inside">Устройство элементов скина</a></li>
<li><a href="#player_xml_settings">Настройки плеера через XML</a></li>
<li><a href="#about_model">Общее построение модели</a></li>
<li><a href="#decompilation_protection_and_demo_mode">Защита от декомпиляции и демо режим</a></li>
</ul>
<p>Перед началом работ было получено краткое указание:</p>
<div class="more_syntax">
<pre>Описание плеера для проекта "******"
Плеер состоит из трех функциональных частей, переключающихся по принципу "аккордиона":
- караоке плеер
              - прокрутка текста (простой XML с текстом и таймлайнами)
              - проигрывание фонограммы (mp3, возможно стриминг с Red5)
              - запись видео с вебкамеры или звука с микрофона (тут надо как-то
              накладывать голос на фанеру)
              - настройки камеры, микрофона, возможно что-то еще будет
              - полноэкранный режим (с небольшими изменениями оформления)
              - возможность использования разных типов фона: картинки, слайдшоу, видео, векторные шаблоны (в дальнейшем)
- видео плеер - проигрывание записанного ролика. Если записанного ролика нет, эта вкладка не появляется
              - проигрывание видео
- стандартное управление, но без фулскрина
              - код вставки
- голосовалка
- загрузка файла
- прогресс-бар</pre>
</div>
<p>В обсуждении проявились технические детали:</p>
<ol>
<li><a name="absolutely_skinable_player"></a>Полностью скинуемый плеер</li>
<li>Резиновый интерфейс</li>
<li>Полный доступ к настройкам без перекомпиляции приложения</li>
</ol>
<p>Заказчик согласился и я приступил к работе определив для себя дополнительный пункт – в демо придётся показывать полноценный плеер, надо будет ограничить в возможностях свою работу до оплаты и поскольку не было ни слова сказано по поводу исходников, по умолчанию исходники остаются мне, а значит надо защитить плеер от декомпиляции. Дизайнер вспомнил о анимации интерфейса(движение аккордеона и прочие плюшки) уже на стадии тестирования, поэтому я предложил её делать за дополнительные деньги. Вообще, очень мучительно проходила работа над плеером, потому что дополнения появлялись по мере тестирования плеера(когда заказчик увидел где-то и говорит хочу такое же) и иногда приходилось многое менять, поэтому разработка очень затянулась.</p>
<p><strong>Полностью скинуемый плеер</strong></p>
<p>Для начала работ мне предоставили вот такое изображение</p>
<p><a href="http://actualwave.com/blog/wp-content/uploads/images/karaoke_player_spivaimo/spivajmo_player_2.jpg"><img src="http://actualwave.com/blog/wp-content/uploads/images/karaoke_player_spivaimo/spivajmo_player_2_thumb.jpg" alt="Шаблон караоке плеера" /></a></p>
<p>На много позже появился дизайн во FLA файле, который пришлось пересобирать под свои нужды – все символы сгруппировать, расставить и задать классы. Из иллюстрации видно, что весь скин разделён на три части, на три скрина – для записи, для воспроизведения записанного и для загрузки неких файлов. Цель третьего скрина мне не была понятна, даже не смотря на объяснения, я её реализовал, но она до сих под отключена и по моему о ней забыли. В общем, не долго думая, я разделил весь дизайн на контейнеры – скрины, которые назвал соответственно Record Screen, Play Screen, Upload Screen. Сразу было решено что надо отделить основное приложение – модель от скина/вида и загружать скин перед стартом приложения, таким образом получаем скинуемое приложение без необходимости в изменениях в основном приложении, а точнее – заказчик не имеет доступа к исходному коду приложения и за разработчиком остаётся поддержка.</p>
<p>Вот, получившиеся, в итоге, скрины приложения:</p>
<p><em>Проигрывание записи</em></p>
<p><img src="http://actualwave.com/blog/wp-content/uploads/images/karaoke_player_spivaimo/play_screen.png" alt="Проигрывание записи" /></p>
<p>С виду обычный плеер с вкладкой в которой можно получить коды вставки данной записи на HTML страницу или в ЖЖ. Так же, есть возможность указать рейтинг записи.</p>
<p><em>Запись песни</em></p>
<p><img src="http://actualwave.com/blog/wp-content/uploads/images/karaoke_player_spivaimo/record_screen.png" alt="Запись в караоке плеере" /></p>
<p>На скрине записи присутствуют вкладки настроек записи, а точнее – микрофона, выбор камеры для записи видео, использование вокала в фонограмме(возможен вокал с видео клипом), выбор формата текста песни – транслит или оригинальный текст. Ещё, в этом скрине можно вызвать мастер настроек микрофона:</p>
<p><img src="http://actualwave.com/blog/wp-content/uploads/images/karaoke_player_spivaimo/record_master_screen.png" alt="Мастер настройки микрофона" /></p>
<p>Настройка микрофона происходит постранично, выбор микрофона на первой странице, а далее проверка доступности и уровень, с возможностью проверки записи(сейчас, по моему, отключено).</p>
<p><em>Загрузка файлов</em></p>
<p><img src="http://actualwave.com/blog/wp-content/uploads/images/karaoke_player_spivaimo/upload_screen.png" alt="Загрузка файлов" /></p>
<p>Здесь только статический текст, выбор файла и полоса загрузки. Кстати, давно создал тестовый скрипт для проверки загрузки файлов и до сих пор он полезен, я его <a href="http://actualwave.com/blog/?p=327">отдельно положил</a>.</p>
<p><em>Основной принцип работы</em></p>
<p>Я сразу решил отделить классы приложения на два лагеря – одни идут с моделью, а другие с видом. Классы которые были связаны с моделью получили стандартный пакет aw.projects.project_name.*, а классы скина/вида обосновались в "локальном" пакете проекта skin.*. Классы вида в основном были привязаны к символам во FLA файле и весь скин компилировался в отдельный SWF файл, который потом надо было загружать.</p>
<p>Модель была построена таким образом, что главный класс Model, загружал XML настройки, потом инициализировал модель и под конец загружал скин. В модели было реализовано по медиатору на каждый скрин вида – Record Screen, Play Screen, Upload Screen. Эти три класса получали в конструкторе экземпляр IEventDispatcher(в нашем случае экземпляр Stage) и объект настроек, полученный из загруженного XML файла. Все три подписываются на определённые события от скина и отправляют события к скину.</p>
<p>После загрузки скина, он проходит инициализацию контролов вглубь дерева DisplayObject'ов. Каждый элемент скина при создании подписывается на событие Event.ADDED_TO_STAGE и, когда оно происходит, инициализирует себя. После полной инициализации скина, которая происходит лавинообразно в один кадр, скин считается готовым к приёму событий, он отправляет первое событие SkinEvents.RESIZE_SKIN.</p>
<p>Благодаря тому, что все события вещаются через Stage, элементы управления могут располагаться где угодно и быть какими угодно, главное, это перенести события и их типы из скина в скин.</p>
<p><strong><a name="data_exchange_inside_application"></a>Обмен данными внутри плеера</strong></p>
<p>Обмен данными между скином и моделью я возложил на стандартные события, которые вещал через самый доступный объект в среде DisplayObject’ов – Stage, доступный через свойство DisplayObject.stage. Этот объект передавался в модель как экземпляр IEventDispatcher и через него вещались события в обе стороны – Observer/контроллер, если хотите. </p>
<p>Возникла небольшая проблема – необходимо передавать сообщения между разными приложениями, хоть и загруженными одно в другое, от этого конфликт в классах. Событие хоть и называется одинаково aw.projects.project_name.events.SomeEvent, но в каждом приложении свой класс, соответственно разные классы и разные типы, отсюда ошибка. Но я не долго мучался, поскольку у обоих flash'ек хозяин один(в смысле, не будет сторонних скинов и можно не ждать подвоха от "скинодела"), значил я могу позволить себе грузить скин в тот же ApplicationDomain, в котором находится основное приложение. В такой способ конфликт с классами рассасывается сам по себе, т.к. они становятся общими. </p>
<p>Следующей проблемой оказалось спрятать классы из модели(контроллеры какие-нибудь, к которым я разрешал доступ) таким образом, чтоб они не компилировались вместе со скином и чтоб не было необходимости делится их исходниками, даже в SWC виде. Для этого я использовал интерфейсы, т.е. в скине и в событиях везде фигурируют интерфейсы, таким образом реальные классы оказались "за бортом". Зато остались события, классы всех событий использованных в скине были переданы вместе с классами самого скина заказчику. <img src='http://actualwave.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Сами типы(Event.type) события были двух видов – SET и CHANGE события. Первое испускается моделью для скина и указывается элементам скина, что нужно "по тихому" перейти в определённое состояние, а CHANGE событие в основном служит оповещением о действиях пользователя для модели, через них модель получает ценные указания от скина. </p>
<p>Все такие типы событий хранятся в отдельных классах, а не в классах событий. Это связано с тем, что типы были созданы конкретно под данное приложение, а сами классы событий абстрактны(ValueEvent, ListEvent, CheckboxEvent, StreamEvent) и могут быть использованы где угодно. Вот, пример такого класса со списком типов событий: </p>
<div class="more_syntax">
<pre class="actionscript3"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #006699; font-weight: bold;">package</span> skin.<span style="color: #006600;">record</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">   <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">class</span> RecordScreenEvents <span style="color: #006699; font-weight: bold;">extends</span> <span style="color: #0000cc; font-weight: bold;">Object</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #66cccc; font-weight: bold;">static</span> <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">const</span> RECORD_ALLOWED:<span style="color: #0000cc; font-weight: bold;">String</span> = <span style="color: #ff33cc; font-style: italic;">&quot;RecordScreen(recordAllowed)&quot;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #66cccc; font-weight: bold;">static</span> <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">const</span> RECORD_DISALLOWED:<span style="color: #0000cc; font-weight: bold;">String</span> = <span style="color: #ff33cc; font-style: italic;">&quot;RecordScreen(recordDisallowed)&quot;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #66cccc; font-weight: bold;">static</span> <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">const</span> INVALIDATE:<span style="color: #0000cc; font-weight: bold;">String</span> = <span style="color: #ff33cc; font-style: italic;">&quot;RecordScreen(invalidate)&quot;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #66cccc; font-weight: bold;">static</span> <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">const</span> PLAY:<span style="color: #0000cc; font-weight: bold;">String</span> = <span style="color: #ff33cc; font-style: italic;">&quot;RecordScreen(play)&quot;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #66cccc; font-weight: bold;">static</span> <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">const</span> PAUSE:<span style="color: #0000cc; font-weight: bold;">String</span> = <span style="color: #ff33cc; font-style: italic;">&quot;RecordScreen(pause)&quot;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #66cccc; font-weight: bold;">static</span> <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">const</span> STOP:<span style="color: #0000cc; font-weight: bold;">String</span> = <span style="color: #ff33cc; font-style: italic;">&quot;RecordScreen(stop)&quot;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #66cccc; font-weight: bold;">static</span> <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">const</span> RECORD:<span style="color: #0000cc; font-weight: bold;">String</span> = <span style="color: #ff33cc; font-style: italic;">&quot;RecordScreen(record)&quot;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      ...</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #66cccc; font-weight: bold;">static</span> <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">const</span> PLAY_PROGRESS_SET:<span style="color: #0000cc; font-weight: bold;">String</span> = <span style="color: #ff33cc; font-style: italic;">&quot;RecordScreen(playProgressSet)&quot;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #66cccc; font-weight: bold;">static</span> <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">const</span> PLAY_PROGRESS_CHANGE:<span style="color: #0000cc; font-weight: bold;">String</span> = <span style="color: #ff33cc; font-style: italic;">&quot;RecordScreen(playProgressChange)&quot;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #66cccc; font-weight: bold;">static</span> <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">const</span> LOAD_PROGRESS_SET:<span style="color: #0000cc; font-weight: bold;">String</span> = <span style="color: #ff33cc; font-style: italic;">&quot;RecordScreen(loadProgressSet)&quot;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #66cccc; font-weight: bold;">static</span> <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">const</span> MICROPHONE_SET_LEVEL:<span style="color: #0000cc; font-weight: bold;">String</span> = <span style="color: #ff33cc; font-style: italic;">'RecordScreen(microphoneLevelSet)'</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #66cccc; font-weight: bold;">static</span> <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">const</span> MICROPHONE_CHANGE_LEVEL:<span style="color: #0000cc; font-weight: bold;">String</span> = <span style="color: #ff33cc; font-style: italic;">'RecordScreen(microphoneLevelChange)'</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #66cccc; font-weight: bold;">static</span> <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">const</span> VOLUME_SET:<span style="color: #0000cc; font-weight: bold;">String</span> = <span style="color: #ff33cc; font-style: italic;">'RecordScreen(volumeSet)'</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #66cccc; font-weight: bold;">static</span> <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">const</span> VOLUME_CHANGE:<span style="color: #0000cc; font-weight: bold;">String</span> = <span style="color: #ff33cc; font-style: italic;">'RecordScreen(volumeChange)'</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #66cccc; font-weight: bold;">static</span> <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">const</span> MICROPHONELIST_SET_DEVICE:<span style="color: #0000cc; font-weight: bold;">String</span> = <span style="color: #ff33cc; font-style: italic;">'RecordScreen(microphoneListSet)'</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #66cccc; font-weight: bold;">static</span> <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">const</span> MICROPHONELIST_CHANGE_DEVICE:<span style="color: #0000cc; font-weight: bold;">String</span> = <span style="color: #ff33cc; font-style: italic;">'RecordScreen(microphoneListChange)'</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #66cccc; font-weight: bold;">static</span> <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">const</span> TEXT_SET_TYPE:<span style="color: #0000cc; font-weight: bold;">String</span> = <span style="color: #ff33cc; font-style: italic;">'RecordScreen(textSetType)'</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #66cccc; font-weight: bold;">static</span> <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">const</span> TEXT_CHANGE_TYPE:<span style="color: #0000cc; font-weight: bold;">String</span> = <span style="color: #ff33cc; font-style: italic;">'RecordScreen(textChangeType)'</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #66cccc; font-weight: bold;">static</span> <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">const</span> VOCAL_SET_VALUE:<span style="color: #0000cc; font-weight: bold;">String</span> = <span style="color: #ff33cc; font-style: italic;">'RecordScreen(vocalSet)'</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #66cccc; font-weight: bold;">static</span> <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">const</span> VOCAL_CHANGE_VALUE:<span style="color: #0000cc; font-weight: bold;">String</span> = <span style="color: #ff33cc; font-style: italic;">'RecordScreen(vocalChange)'</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #66cccc; font-weight: bold;">static</span> <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">const</span> CAMERALIST_SET_DEVICE:<span style="color: #0000cc; font-weight: bold;">String</span> = <span style="color: #ff33cc; font-style: italic;">'RecordScreen(cameraListSet)'</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #66cccc; font-weight: bold;">static</span> <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">const</span> CAMERALIST_CHANGE_DEVICE:<span style="color: #0000cc; font-weight: bold;">String</span> = <span style="color: #ff33cc; font-style: italic;">'RecordScreen(cameraListChange)'</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #66cccc; font-weight: bold;">static</span> <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">const</span> CAMERA_SET_VALUE:<span style="color: #0000cc; font-weight: bold;">String</span> = <span style="color: #ff33cc; font-style: italic;">'RecordScreen(cameraSet)'</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #66cccc; font-weight: bold;">static</span> <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">const</span> CAMERA_CHANGE_VALUE:<span style="color: #0000cc; font-weight: bold;">String</span> = <span style="color: #ff33cc; font-style: italic;">'RecordScreen(cameraChange)'</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      ...</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li></ol></pre>
</div>
<p>Как видите, в значении типа чётко обозначена принадлежность к скрину, т.к. события между ними могут быть одинаковыми(PLAY, PAUSE, STOP). А сам класс расположен в локальном пакете, а это означает что он кроме этого приложения больше нигде использован не будет. Позже это вызывало некоторые неудобства, но если немного поработать с такой записью, быстро привыкаешь, главное, это адекватные имена констант. </p>
<p>Позже появилось специальное событие RequestEvent, оно содержит в себе ссылку на URLLoader и URLRequest, которые должны выполниться сразу после этого события. Оно возникает  всякий раз, когда модель должна отправить запрос на сервер, а это событие способ провести ревизию запроса или подписаться на события загрузчика, т.к. модель изменять, у заказчика и его разработчиков, способа не было я организовал такой способ влияния на запросы. <img src='http://actualwave.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong><a name="ui_elements_inside"></a>Устройство элементов скина</strong></p>
<p>Все элементы скина имеют компонентную основу и строятся от простого к сложному, т.е. в проекте реализованы базовые классы, такие как Asset и SkinItem, которые являются прародителями всё и вся.</p>
<p>Asset, это подвижный элемент скина, он должен реагировать на изменения размеров области Flash player’а, а SkinItem заранее предрасположен слушать SET и вещать CHANGE события. К примеру, наследником Asset’а является контрольная панель с кнопками, а сами кнопки – SkinItem. Каждый скрин сам по себе является Asset'ом, но поскольку является аксиомой то, что для него координаты X/Y всегда равны нулю и он никогда не масштабируется, я смело использовал Asset’ы и внутри самих скринов. SkinItem предоставляет возможность задавать SET/CHANGE события для наследующего компонента.</p>
<p><em>Визуальные элементы которые не попали в скин</em></p>
<p>Чтоб не раскрывать технические тонкости реализации отдельных частей плеера, которые прямо не относились к скину, я их спрятал в модели и добавлял на сцену по мере необходимости, в зависимости от настроек из XML и выбранных пользователем. Не хотелось показывать реализацию двух основных частей плеера – системы медиа-скринов и  текста проигрываемой/записываемой фонограммы.</p>
<p>Такие визуальные объекты хоть и находятся выше всех UI элементов в иерерхии визуальных объектов, должны занимать только определённую область в плеере, к примеру, в PlayScreen, текст может по вертикали занять место от верхних Title Bar'ов до нижнего Control Bar'а. Указанием размеров этим компонентам занимется активный скрин(это либо Play Screen, либо Record Screen) – он должен отправить событие *ScreenEvents.INVALIDATE.</p>
<div class="more_syntax">
<pre class="actionscript3"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #006699; font-weight: bold;">package</span> skin.<span style="color: #006600;">player</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">   <span style="color: #006600; font-weight: bold;">import</span> aw.<span style="color: #006600;">projects</span>.<span style="color: #006600;">project</span>.<span style="color: #006600;">events</span>.<span style="color: #006600;">InvalidateScreenEvent</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">   <span style="color: #006600; font-weight: bold;">import</span> aw.<span style="color: #006600;">projects</span>.<span style="color: #006600;">project</span>.<span style="color: #006600;">events</span>.<span style="color: #006600;">ScreenEvent</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">   <span style="color: #006600; font-weight: bold;">import</span> <span style="color: #660099 !important; font-weight: bold;">flash.<span style="color: #006600;">geom</span></span>.<span style="color: #0000cc; font-weight: bold;">Rectangle</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">   ...</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">   <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">class</span> PlayerScreen <span style="color: #006699; font-weight: bold;">extends</span> Asset<span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">var</span> playScreenButton:ActiveEditableTitleBar;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">var</span> startPanel:PlayStartInfo;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      ...</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">function</span> PlayerScreen<span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>:<span style="color: #669933; font-weight: bold;">void</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">         <span style="color: #669933; font-weight: bold;">super</span><span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      ...</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #66cccc; font-weight: bold;">override</span> <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">function</span> resize<span style="color: #663366;">&#40;</span>width:<span style="color: #0000cc; font-weight: bold;">Number</span>, height:<span style="color: #0000cc; font-weight: bold;">Number</span><span style="color: #663366;">&#41;</span>:<span style="color: #669933; font-weight: bold;">void</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">         <span style="color: #669933; font-weight: bold;">super</span>.<span style="color: #006600;">resize</span><span style="color: #663366;">&#40;</span>width, height<span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">         ...</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">         <span style="color: #006699; font-weight: bold;">var</span> bounds:<span style="color: #0000cc; font-weight: bold;">Rectangle</span> = <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">getScreenBounds</span><span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">         <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">startPanel</span>.<span style="color: #006600;">x</span> = bounds.<span style="color: #006600;">x</span>+<span style="color: #663366;">&#40;</span>bounds.<span style="color: #006600;">width</span>-<span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">startPanel</span>.<span style="color: #006600;">width</span><span style="color: #663366;">&#41;</span>/<span style="color: #ff6600; font-weight: bold;">2</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">         <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">startPanel</span>.<span style="color: #006600;">y</span> = bounds.<span style="color: #006600;">y</span>+<span style="color: #663366;">&#40;</span>bounds.<span style="color: #006600;">height</span>-<span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">startPanel</span>.<span style="color: #006600;">height</span><span style="color: #663366;">&#41;</span>/<span style="color: #ff6600; font-weight: bold;">2</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">         <span style="color: #669933; font-weight: bold;">this</span>._stage.<span style="color: #006600;">dispatchEvent</span><span style="color: #663366;">&#40;</span><span style="color: #0000cc; font-weight: bold;">new</span> InvalidateScreenEvent<span style="color: #663366;">&#40;</span>PlayScreenEvents.<span style="color: #006600;">INVALIDATE</span>, bounds<span style="color: #663366;">&#41;</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">function</span> getScreenBounds<span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>:<span style="color: #0000cc; font-weight: bold;">Rectangle</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">         <span style="color: #006699; font-weight: bold;">var</span> y:<span style="color: #0000cc; font-weight: bold;">int</span> = <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">playScreenButton</span>.<span style="color: #006600;">y</span>+<span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">playScreenButton</span>.<span style="color: #006600;">height</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">         <span style="color: #669933; font-weight: bold;">return</span> <span style="color: #0000cc; font-weight: bold;">new</span> <span style="color: #0000cc; font-weight: bold;">Rectangle</span><span style="color: #663366;">&#40;</span><span style="color: #ff6600; font-weight: bold;">0</span>, y, <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">playScreenButton</span>.<span style="color: #006600;">width</span>, <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">settingsTabs</span>.<span style="color: #006600;">y</span>-y<span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      ...</div></li></ol></pre>
</div>
<p><em>Зрительные образы сопровождающие фонограмму</em></p>
<p>В обычных караоке плеерах есть визуальный ряд, проигрываемый во время воспроизведения фонограммы, для данного плеера это могло быть видео, ряд изображений или изображение с камеры, при записи фонограммы с видео. Я давно мечтал привести к общему виду подобные медиа-объекты в системе, которая позволяла бы одинаково просто использовать любые графические данные. И создал систему медиа-скринов, все они был переведены к общим интерфейсам(IScreen, IMediaScreen, IVideoScreen). Начало для этой системы было положено намного ранее, в этом проекте был неплохой тест драйв и в следующем проекте(Flog.com, но об этом в одном из следующих постов) я окончательно отшлифовал эту систему.</p>
<p>Последовательность отображаемых медиа-ресурсов можно задавать через конфигурационный XML, там же можно указать настройки эффекта затухания(продолжительность, к примеру), и для изображений время отображения(для видео тоже можно, но если не задано, то будет оно сменено когда завершится проигрывание). Каждый медиа-скрин имеет свой фон и соответственно, его настройки цвета и прозрачности, все они получают указатели на источник данных, приведённые к общему виду – MediaAddress.</p>
<p><em>Текст песни</em></p>
<p>Всегда было интересно как можно реализовать подобный функционал, а у меня была задача создать его так чтоб все настройки можно было вывести в XML при поддержке embed fonts. Было проверено несколько разных реализаций и самой устойчивой и скоростной оказалось простое наложение одного текстового поля на другое. Накладываемое поле получало значение autoSize TextFieldAutoSize.NONE, потому что была необходимость изменять его размер по мере проигрывания текста, а нижнее поле – TextFieldAutoSize.LEFT, чтоб иметь полный размер текста. Сразу был заметен визуальный артефакт, по краям уже закрашенного текста выступали пиксели от нижнего текстового поля, решилось всё наложением фильтра GlowFilter в один пиксель, заодно края текста сгладились при полноэкранном просмотре.</p>
<p>Иерархия визуальных объектов в точности повторяет конфигурационный XML, в котором описан текст и тайминги.</p>
<ul>
<li>TextManager</p>
<ul>
<li>Couplet – отображает куплет</p>
<ul>
<li>Line – отображает строчку текста</p>
<ul>
<li>Passage – отображал конкрентый слог, текст который описывает, но в последствии остался пустой единицей.</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>Passage, как атом данной структуры, управляет только сам собой, изменяя своё состояние по ENTER_FRAME событию. Остальные объекты структуры работают с очередями. Все эти объекты наследуются от TextContainer, а тот, в свою очередь – от TimeDepend/ITimeDepend, а очереди ещё и от TimeManager/ITimeManager. Все эти объекты являются наследниками от DisplayObject и все, кроме Passage содержат в себе визуальные объекты. В первых версиях Passage содержал в себе текстовые поля, которые он описывал, но оказалось что визуально это добавляло расстояния между слогами, поэтому Passage были переведены в более виртуальное состояние, а объекты Line взяли на себя нагрузку по отображению текста. Каждый объект всей структуры испускает события оповещающие о изменении его состояния, это позволяет очереди оперировать своими внутренними объектами.</p>
<p>Дополнительно к этим объектам был создан интерфейс IXMLTextParser и по нему реализован общий парсер XMLKaraokeChannelParser(название от сайта с которого, мне сказали, будет формат текста фонограммы), который воссоздавал всю иерархию по данным из XML. Так же интерфейс ITextStyle, которые реализованы в объектах TextStyle и TextLayout и передавались от родительского к дочернему объекту. И последний, о котором хотел рассказать, интерфейс ITextLayout, который передаётся в TextManager для построения текста. Мною было реализовано два вида построения:</p>
<ul>
<li>TextLayoutSimple – простая смена куплетов, когда данный куплет проигрался, он сменяется следующим.</li>
<li>TextLayoutFadeLine – смена строк куплетов, когда проигралась строка, она исчезает, а вместо неё появляется строка из следующего куплета.</li>
</ul>
<p>Виды построения можно менять через XML настройки и создавать свои, на этом был сделан отдельный упор.</p>
<p>Дополнительно в XML можно задать фильтры которые будут использованы для отображения текста, преобразователь XML -> BitmapFilter был взят из моей давней разработки GUIBuilder.org.</p>
<p><strong>Резиновый интерфейс</strong></p>
<p>С этим мне помог справиться набор правил/аксиом для скина, которые я вывел до создания кодовой базы:</p>
<ul>
<li>Весь скин поделён на три функциональные части, не зависимые друг от друга, но разделяющие интересы, такие как громкость или кнопки-ссылки на другие скрины.</li>
<li>Каждая тематическая единица должна служить контейнером для управляемых ею символов.</li>
<li>Все скрины всегда имеют нулевую позицию относительно левого верхнего угла и всегда занимают 100% всей области Flash player’а.</li>
<li>В интерфейсе нет удаляемых элементов, за редким исключением, соответственно можно все интерактивные элементы подписывать на события без отписки(но я не использую weak reference для событий, поэтому создавать методы отписки от событий уже привычка).</li>
</ul>
<p>Из всех этих рассуждений я вывел базовый класс для основных контейнеров интерфейса:</p>
<div class="more_syntax">
<pre class="actionscript3"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #006699; font-weight: bold;">package</span> skin<span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">   <span style="color: #006600; font-weight: bold;">import</span> <span style="color: #660099 !important; font-weight: bold;">flash.<span style="color: #006600;">display</span></span>.<span style="color: #0000cc; font-weight: bold;">Sprite</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">   <span style="color: #006600; font-weight: bold;">import</span> <span style="color: #660099 !important; font-weight: bold;">flash.<span style="color: #006600;">display</span></span>.<span style="color: #0000cc; font-weight: bold;">Stage</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">   <span style="color: #006600; font-weight: bold;">import</span> <span style="color: #660099 !important; font-weight: bold;">flash.<span style="color: #006600;">events</span></span>.<span style="color: #0000cc; font-weight: bold;">Event</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">   <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">class</span> Asset <span style="color: #006699; font-weight: bold;">extends</span> <span style="color: #0000cc; font-weight: bold;">Sprite</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #66cccc; font-weight: bold;">protected</span> <span style="color: #006699; font-weight: bold;">var</span> _stage:<span style="color: #0000cc; font-weight: bold;">Stage</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #66cccc; font-weight: bold;">protected</span> <span style="color: #006699; font-weight: bold;">var</span> _width:<span style="color: #0000cc; font-weight: bold;">Number</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #66cccc; font-weight: bold;">protected</span> <span style="color: #006699; font-weight: bold;">var</span> _height:<span style="color: #0000cc; font-weight: bold;">Number</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">function</span> Asset<span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>:<span style="color: #669933; font-weight: bold;">void</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">         <span style="color: #669933; font-weight: bold;">super</span><span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">         _width = <span style="color: #669933; font-weight: bold;">super</span>.<span style="color: #006600;">width</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">         _height = <span style="color: #669933; font-weight: bold;">super</span>.<span style="color: #006600;">height</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">         <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">addEventListener</span><span style="color: #663366;">&#40;</span><span style="color: #0000cc; font-weight: bold;">Event</span>.<span style="color: #006600;">ADDED_TO_STAGE</span>, <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">addedToStageHandler</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">         <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">addEventListener</span><span style="color: #663366;">&#40;</span><span style="color: #0000cc; font-weight: bold;">Event</span>.<span style="color: #006600;">REMOVED_FROM_STAGE</span>, <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">removedFromStageHandler</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #66cccc; font-weight: bold;">override</span> <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">function</span> <span style="color: #006699; font-weight: bold;">set</span> width<span style="color: #663366;">&#40;</span>value:<span style="color: #0000cc; font-weight: bold;">Number</span><span style="color: #663366;">&#41;</span>:<span style="color: #669933; font-weight: bold;">void</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">         <span style="color: #669933; font-weight: bold;">this</span>._width = value;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">         <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">resize</span><span style="color: #663366;">&#40;</span><span style="color: #669933; font-weight: bold;">this</span>._width, <span style="color: #669933; font-weight: bold;">this</span>._height<span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #66cccc; font-weight: bold;">override</span> <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">function</span> <span style="color: #006699; font-weight: bold;">set</span> height<span style="color: #663366;">&#40;</span>value:<span style="color: #0000cc; font-weight: bold;">Number</span><span style="color: #663366;">&#41;</span>:<span style="color: #669933; font-weight: bold;">void</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">         <span style="color: #669933; font-weight: bold;">this</span>._height = value;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">         <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">resize</span><span style="color: #663366;">&#40;</span><span style="color: #669933; font-weight: bold;">this</span>._width, <span style="color: #669933; font-weight: bold;">this</span>._height<span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #66cccc; font-weight: bold;">private</span> <span style="color: #006699; font-weight: bold;">function</span> addedToStageHandler<span style="color: #663366;">&#40;</span><span style="color: #0000cc; font-weight: bold;">event</span>:<span style="color: #0000cc; font-weight: bold;">Event</span><span style="color: #663366;">&#41;</span>:<span style="color: #669933; font-weight: bold;">void</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">         <span style="color: #669933; font-weight: bold;">this</span>._stage = <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #0000cc; font-weight: bold;">stage</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">         <span style="color: #669933; font-weight: bold;">this</span>._stage.<span style="color: #006600;">addEventListener</span><span style="color: #663366;">&#40;</span><span style="color: #0000cc; font-weight: bold;">Event</span>.<span style="color: #006600;">RESIZE</span>, <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">resizeHandler</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">         <span style="color: #669933; font-weight: bold;">this</span>._stage.<span style="color: #006600;">addEventListener</span><span style="color: #663366;">&#40;</span>SkinEvents.<span style="color: #006600;">RESIZE_SKIN</span>, <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">resizeSkinHandler</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">         <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">initialize</span><span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #66cccc; font-weight: bold;">protected</span> <span style="color: #006699; font-weight: bold;">function</span> initialize<span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>:<span style="color: #669933; font-weight: bold;">void</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">         <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">resize</span><span style="color: #663366;">&#40;</span><span style="color: #669933; font-weight: bold;">this</span>._stage.<span style="color: #006600;">stageWidth</span>, <span style="color: #669933; font-weight: bold;">this</span>._stage.<span style="color: #006600;">stageHeight</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #66cccc; font-weight: bold;">private</span> <span style="color: #006699; font-weight: bold;">function</span> removedFromStageHandler<span style="color: #663366;">&#40;</span><span style="color: #0000cc; font-weight: bold;">event</span>:<span style="color: #0000cc; font-weight: bold;">Event</span><span style="color: #663366;">&#41;</span>:<span style="color: #669933; font-weight: bold;">void</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">         <span style="color: #669933; font-weight: bold;">this</span>._stage.<span style="color: #006600;">removeEventListener</span><span style="color: #663366;">&#40;</span><span style="color: #0000cc; font-weight: bold;">Event</span>.<span style="color: #006600;">RESIZE</span>, <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">resizeHandler</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">         <span style="color: #669933; font-weight: bold;">this</span>._stage.<span style="color: #006600;">removeEventListener</span><span style="color: #663366;">&#40;</span>SkinEvents.<span style="color: #006600;">RESIZE_SKIN</span>, <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">resizeSkinHandler</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #66cccc; font-weight: bold;">private</span> <span style="color: #006699; font-weight: bold;">function</span> resizeHandler<span style="color: #663366;">&#40;</span><span style="color: #0000cc; font-weight: bold;">event</span>:<span style="color: #0000cc; font-weight: bold;">Event</span><span style="color: #663366;">&#41;</span>:<span style="color: #669933; font-weight: bold;">void</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">         <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">resize</span><span style="color: #663366;">&#40;</span><span style="color: #669933; font-weight: bold;">this</span>._stage.<span style="color: #006600;">stageWidth</span>, <span style="color: #669933; font-weight: bold;">this</span>._stage.<span style="color: #006600;">stageHeight</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #66cccc; font-weight: bold;">private</span> <span style="color: #006699; font-weight: bold;">function</span> resizeSkinHandler<span style="color: #663366;">&#40;</span><span style="color: #0000cc; font-weight: bold;">event</span>:<span style="color: #0000cc; font-weight: bold;">Event</span><span style="color: #663366;">&#41;</span>:<span style="color: #669933; font-weight: bold;">void</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">         <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">resize</span><span style="color: #663366;">&#40;</span><span style="color: #669933; font-weight: bold;">this</span>._width, <span style="color: #669933; font-weight: bold;">this</span>._height<span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">function</span> resize<span style="color: #663366;">&#40;</span>width:<span style="color: #0000cc; font-weight: bold;">Number</span>, height:<span style="color: #0000cc; font-weight: bold;">Number</span><span style="color: #663366;">&#41;</span>:<span style="color: #669933; font-weight: bold;">void</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">         <span style="color: #669933; font-weight: bold;">this</span>._width = width;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">         <span style="color: #669933; font-weight: bold;">this</span>._height = height;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      <span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">   <span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #663366;">&#125;</span></div></li></ol></pre>
</div>
<p>Как видите, он не имеет системы валидации новых значений, т.к. его назначением было "передать дальше". Предполагалось что такой контейнер не может быть сложным объектом, соответственно незачем делать валидацию и откладывание применения значений. А более сложные элементы скина, вроде интерактивных списков уже включают системы валидации и откладывают расчёты визуальной части на событие ENTER_FRAME. Такие контейнеры абсолютно автономны и слушают только глобальное изменение размеров изменяя позицию и размеры вверенных им элементов пользовательского интерфейса. В общем, для такого маленького проекта подобные принципы построения интерфейса очень даже оправданы, а для более сложных, просто "не прокатят"(позже, явно потребуется усложнить интерфейс и это может оказаться не большой, но проблемой, при таком подходе). <img src='http://actualwave.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Вот пример наследника Asset'а:</p>
<div class="more_syntax">
<pre class="actionscript3"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #006699; font-weight: bold;">package</span> skin<span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">   <span style="color: #006600; font-weight: bold;">import</span> <span style="color: #660099 !important; font-weight: bold;">flash.<span style="color: #006600;">display</span></span>.<span style="color: #0000cc; font-weight: bold;">DisplayObjectContainer</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">   <span style="color: #006600; font-weight: bold;">import</span> <span style="color: #660099 !important; font-weight: bold;">flash.<span style="color: #006600;">display</span></span>.<span style="color: #0000cc; font-weight: bold;">Graphics</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">   <span style="color: #006600; font-weight: bold;">import</span> <span style="color: #660099 !important; font-weight: bold;">flash.<span style="color: #006600;">display</span></span>.<span style="color: #0000cc; font-weight: bold;">Sprite</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">   <span style="color: #006600; font-weight: bold;">import</span> <span style="color: #660099 !important; font-weight: bold;">flash.<span style="color: #006600;">events</span></span>.<span style="color: #0000cc; font-weight: bold;">Event</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">   <span style="color: #663366;">&#91;</span><span style="color: #0000cc; font-weight: bold;">Event</span><span style="color: #663366;">&#40;</span>name=<span style="color: #ff33cc; font-style: italic;">&quot;open&quot;</span>,type=<span style="color: #ff33cc; font-style: italic;">&quot;flash.events.Event&quot;</span><span style="color: #663366;">&#41;</span><span style="color: #663366;">&#93;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">   <span style="color: #663366;">&#91;</span><span style="color: #0000cc; font-weight: bold;">Event</span><span style="color: #663366;">&#40;</span>name=<span style="color: #ff33cc; font-style: italic;">&quot;close&quot;</span>,type=<span style="color: #ff33cc; font-style: italic;">&quot;flash.events.Event&quot;</span><span style="color: #663366;">&#41;</span><span style="color: #663366;">&#93;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">   <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">class</span> AbstractAlert <span style="color: #006699; font-weight: bold;">extends</span> Asset<span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">     <span style="color: #66cccc; font-weight: bold;">static</span> <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">var</span> container:<span style="color: #0000cc; font-weight: bold;">DisplayObjectContainer</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">     <span style="color: #66cccc; font-weight: bold;">static</span> <span style="color: #66cccc; font-weight: bold;">private</span> <span style="color: #006699; font-weight: bold;">var</span> _instance:AbstractAlert;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">     <span style="color: #66cccc; font-weight: bold;">protected</span> <span style="color: #006699; font-weight: bold;">var</span> _locker:<span style="color: #0000cc; font-weight: bold;">Sprite</span> = <span style="color: #0000cc; font-weight: bold;">new</span> <span style="color: #0000cc; font-weight: bold;">Sprite</span><span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">     <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">function</span> AbstractAlert<span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>:<span style="color: #669933; font-weight: bold;">void</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">       <span style="color: #669933; font-weight: bold;">super</span><span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">       <span style="color: #669933; font-weight: bold;">if</span><span style="color: #663366;">&#40;</span>_instance<span style="color: #663366;">&#41;</span> hide<span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">       _instance = <span style="color: #669933; font-weight: bold;">this</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">     <span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">     <span style="color: #66cccc; font-weight: bold;">override</span> <span style="color: #66cccc; font-weight: bold;">protected</span> <span style="color: #006699; font-weight: bold;">function</span> initialize<span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>:<span style="color: #669933; font-weight: bold;">void</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">       <span style="color: #669933; font-weight: bold;">super</span>.<span style="color: #006600;">initialize</span><span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">       <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">addChildAt</span><span style="color: #663366;">&#40;</span><span style="color: #669933; font-weight: bold;">this</span>._locker, <span style="color: #ff6600; font-weight: bold;">0</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">       <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">dispatchEvent</span><span style="color: #663366;">&#40;</span><span style="color: #0000cc; font-weight: bold;">new</span> <span style="color: #0000cc; font-weight: bold;">Event</span><span style="color: #663366;">&#40;</span><span style="color: #0000cc; font-weight: bold;">Event</span>.<span style="color: #006600;">OPEN</span><span style="color: #663366;">&#41;</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">     <span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">     <span style="color: #66cccc; font-weight: bold;">override</span> <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">function</span> resize<span style="color: #663366;">&#40;</span>width:<span style="color: #0000cc; font-weight: bold;">Number</span>, height:<span style="color: #0000cc; font-weight: bold;">Number</span><span style="color: #663366;">&#41;</span>:<span style="color: #669933; font-weight: bold;">void</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">       <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">clearLocker</span><span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">       <span style="color: #669933; font-weight: bold;">super</span>.<span style="color: #006600;">resize</span><span style="color: #663366;">&#40;</span>width, height<span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">       <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">x</span> = <span style="color: #0000cc; font-weight: bold;">int</span><span style="color: #663366;">&#40;</span><span style="color: #663366;">&#40;</span>width-<span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">width</span><span style="color: #663366;">&#41;</span>/<span style="color: #ff6600; font-weight: bold;">2</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">       <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">y</span> = <span style="color: #0000cc; font-weight: bold;">int</span><span style="color: #663366;">&#40;</span><span style="color: #663366;">&#40;</span>height-<span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">height</span><span style="color: #663366;">&#41;</span>/<span style="color: #ff6600; font-weight: bold;">2</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">       <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">drawLocker</span><span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">     <span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">     <span style="color: #66cccc; font-weight: bold;">protected</span> <span style="color: #006699; font-weight: bold;">function</span> clearLocker<span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>:<span style="color: #669933; font-weight: bold;">void</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">       <span style="color: #669933; font-weight: bold;">this</span>._locker.<span style="color: #006600;">x</span> = <span style="color: #ff6600; font-weight: bold;">0</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">       <span style="color: #669933; font-weight: bold;">this</span>._locker.<span style="color: #006600;">y</span> = <span style="color: #ff6600; font-weight: bold;">0</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">       <span style="color: #669933; font-weight: bold;">this</span>._locker.<span style="color: #0000cc; font-weight: bold;">graphics</span>.<span style="color: #006600;">clear</span><span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">     <span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">     <span style="color: #66cccc; font-weight: bold;">protected</span> <span style="color: #006699; font-weight: bold;">function</span> drawLocker<span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>:<span style="color: #669933; font-weight: bold;">void</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">       <span style="color: #006699; font-weight: bold;">var</span> g:<span style="color: #0000cc; font-weight: bold;">Graphics</span> = <span style="color: #669933; font-weight: bold;">this</span>._locker.<span style="color: #0000cc; font-weight: bold;">graphics</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">       g.<span style="color: #006600;">clear</span><span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">       <span style="color: #669933; font-weight: bold;">this</span>._locker.<span style="color: #006600;">x</span> = -<span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">x</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">       <span style="color: #669933; font-weight: bold;">this</span>._locker.<span style="color: #006600;">y</span> = -<span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">y</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">       g.<span style="color: #006600;">beginFill</span><span style="color: #663366;">&#40;</span><span style="color: #ff6600; font-weight: bold;">0</span>, <span style="color: #ff6600; font-weight: bold;">0.4</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">       g.<span style="color: #006600;">drawRect</span><span style="color: #663366;">&#40;</span><span style="color: #ff6600; font-weight: bold;">0</span>, <span style="color: #ff6600; font-weight: bold;">0</span>, <span style="color: #669933; font-weight: bold;">this</span>._width, <span style="color: #669933; font-weight: bold;">this</span>._height<span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">       g.<span style="color: #006600;">endFill</span><span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">     <span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">     <span style="color: #66cccc; font-weight: bold;">static</span> <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">function</span> hide<span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>:<span style="color: #669933; font-weight: bold;">void</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">       <span style="color: #669933; font-weight: bold;">if</span><span style="color: #663366;">&#40;</span>!_instance<span style="color: #663366;">&#41;</span> <span style="color: #669933; font-weight: bold;">return</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">       <span style="color: #669933; font-weight: bold;">if</span><span style="color: #663366;">&#40;</span>_instance.<span style="color: #006600;">parent</span><span style="color: #663366;">&#41;</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      _instance.<span style="color: #006600;">dispatchEvent</span><span style="color: #663366;">&#40;</span><span style="color: #0000cc; font-weight: bold;">new</span> <span style="color: #0000cc; font-weight: bold;">Event</span><span style="color: #663366;">&#40;</span><span style="color: #0000cc; font-weight: bold;">Event</span>.<span style="color: #006600;">CLOSE</span><span style="color: #663366;">&#41;</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">      _instance.<span style="color: #006600;">parent</span>.<span style="color: #006600;">removeChild</span><span style="color: #663366;">&#40;</span>_instance<span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">       <span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">       _instance = <span style="color: #669933; font-weight: bold;">null</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">     <span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">   <span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #663366;">&#125;</span></div></li></ol></pre>
</div>
<p>Два переопределённых метода служат для инициализации(подписка на события, указание ролей вложенным компонентам) и изменения размеров контейнера, как правило, это всё что должен делать контейнер компонент.</p>
<p><strong>Итоги о визуальной части</strong></p>
<p>В итоге о визуальной части(о скине), хотел бы сказать что не понравилось больше всего. Во Flash CS4 появилась замечательная возможность создавать символы с другими внутри наследуясь от спрайта(В CS3 этого нельзя было делать, просил наследовать от MovieClip’а). Для меня этот проект оказался замечательным способом опробовать Flash CS4 с новыми возможностями. Но я напоролся на одну очень не приятную особенность – Flash CS4 всегда пытается объявить недостающие элементы сцены. К примеру, если у вас есть спрайт контейнер и в нём кнопка simpleButton, то у вас в классе при компиляции обязательно появится поле public var simpleButton:SimpleButton. Но Flash CS4 при этом не учитывает возможность объявления этого свойства в родительском классе и если это так, то при компиляции возникает очень неприятная ошибка. Единственное, что пришло в голову:</p>
<ul>
<li>Создавая символы давать им имена в виде "имясимвола_symbol", а в классе описывать геттер</li>
<div class="more_syntax">
<pre class="actionscript3">          <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">function</span> <span style="color: #006699; font-weight: bold;">get</span> имясимвола<span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>:<span style="color: #0000cc; font-weight: bold;">InteractiveObject</span><span style="color: #663366;">&#123;</span>
            <span style="color: #669933; font-weight: bold;">return</span> <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">getChildByName</span><span style="color: #663366;">&#40;</span><span style="color: #ff33cc; font-style: italic;">&quot;имясимвола_symbol&quot;</span><span style="color: #663366;">&#41;</span>;
          <span style="color: #663366;">&#125;</span></pre>
</div>
<li>После тестирования класса делать его dynamic и комментировать объявления символов перенося их в дочерний класс. Но этот метод использовался уже в конце работ, когда вносились срочные правки и возиться не было времени.</li>
</ul>
<p><strong><a name="player_xml_settings"></a>Настройки плеера через XML</strong></p>
<p>Все возможные настройки визуальной части, которые нельзя поменять перекомпилировав скин, я снёс в один XML файл, путь к которому указывается через Flashvars.</p>
<p>Благодаря тому, что был использован XMLLoader(ещё одна разработка из набора GUIBuilder.org), можно загружать один XML по частям из разных источников. Принцип его работы очень прост – он загружает первый, главный XML по указанному пути, а потом анализирует весь документ с помощью переданного экземпляра IXMLLoaderFormat(т.е. каждый желающий может описать свой тип меток), в поисках специальных меток указывающих URL части документа и тип вставки загруженной части. Вот пример формата метки использованного в данном проекте с единственным возможным вариантом вставки – замена узла метки на загруженный узел:</p>
<div class="more_syntax">
<pre class="xml"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">&quot;utf-8&quot;</span><span style="font-weight: bold; color: black;">?&gt;</span></span>
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;main<span style="font-weight: bold; color: black;">&gt;</span></span></span>
     <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;?xml-loader</span> xml/settings.xml<span style="font-weight: bold; color: black;">?&gt;</span></span>
     <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;screens<span style="font-weight: bold; color: black;">&gt;</span></span></span>
          <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;image</span> <span style="color: #000066;">url</span>=<span style="color: #ff0000;">&quot;snapshot20090526001158.jpg&quot;</span> <span style="color: #000066;">duration</span>=<span style="color: #ff0000;">&quot;5&quot;</span><span style="font-weight: bold; color: black;">/&gt;</span></span>
          <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;video</span> <span style="color: #000066;">url</span>=<span style="color: #ff0000;">&quot;video10sec.flv&quot;</span><span style="font-weight: bold; color: black;">/&gt;</span></span>
          <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;video</span> <span style="color: #000066;">url</span>=<span style="color: #ff0000;">&quot;video.flv&quot;</span><span style="font-weight: bold; color: black;">/&gt;</span></span>
     <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/screens<span style="font-weight: bold; color: black;">&gt;</span></span></span>
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;phonogram</span> <span style="color: #000066;">url</span>=<span style="color: #ff0000;">&quot;Mymalenkie_deti.flv&quot;</span> <span style="color: #000066;">title</span>=<span style="color: #ff0000;">&quot;Mymalenkie deti&quot;</span> <span style="color: #000066;">hasVideo</span>=<span style="color: #ff0000;">&quot;false&quot;</span><span style="font-weight: bold; color: black;">&gt;</span></span>
          <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;vocal</span> <span style="color: #000066;">url</span>=<span style="color: #ff0000;">&quot;&quot;</span> <span style="color: #000066;">hasVideo</span>=<span style="color: #ff0000;">&quot;&quot;</span> <span style="color: #000066;">master</span>=<span style="color: #ff0000;">&quot;false&quot;</span><span style="font-weight: bold; color: black;">/&gt;</span></span>
          <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;original<span style="font-weight: bold; color: black;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;?xml-loader</span> xml/karaoke.xml<span style="font-weight: bold; color: black;">?&gt;</span></span>
          <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/original<span style="font-weight: bold; color: black;">&gt;</span></span></span>
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;translit<span style="font-weight: bold; color: black;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;?xml-loader</span> xml/karaoke.xml<span style="font-weight: bold; color: black;">?&gt;</span></span>
          <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/translit<span style="font-weight: bold; color: black;">&gt;</span></span></span>
     <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/phonogram<span style="font-weight: bold; color: black;">&gt;</span></span></span>
<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/main<span style="font-weight: bold; color: black;">&gt;</span></span></span>
&nbsp;</pre>
</div>
<p>В этом XML файле есть три метки на загрузку частей, это всё исполняемые инструкции <?xml-loader URL?>. С помощью этих меток можно разделить большой XML файл на более мелкие и отделить статические части от динамических, таким образом статические будут, после первой загрузки, браться из кеша, а динамические –перегружаться каждый раз. Для клиента весь набор будет загружен как один файл и событие COMPLETE будет вызвано, когда все части загружены и вставлены.</p>
<p>А, вот пример полного файла настроек:</p>
<div class="more_syntax">
<pre class="xml"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">&quot;utf-8&quot;</span><span style="font-weight: bold; color: black;">?&gt;</span></span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;main<span style="font-weight: bold; color: black;">&gt;</span></span></span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">     <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;settings<span style="font-weight: bold; color: black;">&gt;</span></span></span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">          <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;skin</span> <span style="color: #000066;">url</span>=<span style="color: #ff0000;">&quot;skin.swf&quot;</span><span style="font-weight: bold; color: black;">/&gt;</span></span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;play</span> <span style="color: #000066;">autoPlay</span>=<span style="color: #ff0000;">&quot;false&quot;</span><span style="font-weight: bold; color: black;">&gt;</span></span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">            <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;text</span> <span style="color: #000066;">font</span>=<span style="color: #ff0000;">&quot;Verdana&quot;</span> <span style="color: #000066;">size</span>=<span style="color: #ff0000;">&quot;5&quot;</span> <span style="color: #000066;">scale</span>=<span style="color: #ff0000;">&quot;0.6&quot;</span> <span style="color: #000066;">embedFonts</span>=<span style="color: #ff0000;">&quot;false&quot;</span> <span style="color: #000066;">colorBefore</span>=<span style="color: #ff0000;">&quot;0xFFFFFF&quot;</span> <span style="color: #000066;">colorAfter</span>=<span style="color: #ff0000;">&quot;0x127fb3&quot;</span> <span style="color: #000066;">italic</span>=<span style="color: #ff0000;">&quot;false&quot;</span> <span style="color: #000066;">bold</span>=<span style="color: #ff0000;">&quot;false&quot;</span> <span style="color: #000066;">uppercase</span>=<span style="color: #ff0000;">&quot;false&quot;</span> <span style="color: #000066;">animated</span>=<span style="color: #ff0000;">&quot;false&quot;</span><span style="font-weight: bold; color: black;">&gt;</span></span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">                 <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;layout</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;fadeLine&quot;</span> <span style="color: #000066;">horizontalAlign</span>=<span style="color: #ff0000;">&quot;center&quot;</span> <span style="color: #000066;">verticalAlign</span>=<span style="color: #ff0000;">&quot;center&quot;</span> <span style="color: #000066;">textAlign</span>=<span style="color: #ff0000;">&quot;center&quot;</span> <span style="color: #000066;">lineHeight</span>=<span style="color: #ff0000;">&quot;0&quot;</span> <span style="color: #000066;">horizontalPadding</span>=<span style="color: #ff0000;">&quot;0&quot;</span> <span style="color: #000066;">verticalPadding</span>=<span style="color: #ff0000;">&quot;50&quot;</span><span style="font-weight: bold; color: black;">/&gt;</span></span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">                 <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;filters<span style="font-weight: bold; color: black;">&gt;</span></span></span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">                   <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;filter</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;glow&quot;</span> <span style="color: #000066;">color</span>=<span style="color: #ff0000;">&quot;0xAAAAAA&quot;</span> <span style="color: #000066;">strength</span>=<span style="color: #ff0000;">&quot;2&quot;</span> <span style="color: #000066;">blurX</span>=<span style="color: #ff0000;">&quot;3&quot;</span> <span style="color: #000066;">blurY</span>=<span style="color: #ff0000;">&quot;3&quot;</span><span style="font-weight: bold; color: black;">/&gt;</span></span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">                 <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/filters<span style="font-weight: bold; color: black;">&gt;</span></span></span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">                 <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;antiAlias</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;advanced&quot;</span> <span style="color: #000066;">gridFitType</span>=<span style="color: #ff0000;">&quot;subpixel&quot;</span> <span style="color: #000066;">thickness</span>=<span style="color: #ff0000;">&quot;0&quot;</span> <span style="color: #000066;">insideCutoff</span>=<span style="color: #ff0000;">&quot;0&quot;</span> <span style="color: #000066;">outsideCutoff</span>=<span style="color: #ff0000;">&quot;15&quot;</span> <span style="color: #000066;">colorType</span>=<span style="color: #ff0000;">&quot;dark&quot;</span><span style="font-weight: bold; color: black;">/&gt;</span></span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">            <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/text<span style="font-weight: bold; color: black;">&gt;</span></span></span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">          <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/play<span style="font-weight: bold; color: black;">&gt;</span></span></span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">          <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;record</span> <span style="color: #000066;">keyFrameInterval</span>=<span style="color: #ff0000;">&quot;20&quot;</span> <span style="color: #000066;">microphoneLevel</span>=<span style="color: #ff0000;">&quot;0&quot;</span> <span style="color: #000066;">useCamera</span>=<span style="color: #ff0000;">&quot;false&quot;</span> <span style="color: #000066;">enableVocal</span>=<span style="color: #ff0000;">&quot;false&quot;</span> <span style="color: #000066;">textType</span>=<span style="color: #ff0000;">&quot;original&quot;</span> <span style="color: #000066;">cameraQuality</span>=<span style="color: #ff0000;">&quot;60&quot;</span> <span style="color: #000066;">cameraBandwith</span>=<span style="color: #ff0000;">&quot;0&quot;</span> <span style="color: #000066;">videoWidth</span>=<span style="color: #ff0000;">&quot;320&quot;</span> <span style="color: #000066;">videoHeight</span>=<span style="color: #ff0000;">&quot;240&quot;</span> <span style="color: #000066;">videoFPS</span>=<span style="color: #ff0000;">&quot;24&quot;</span> <span style="color: #000066;">favorArea</span>=<span style="color: #ff0000;">&quot;true&quot;</span> <span style="color: #000066;">cameraBrightness</span>=<span style="color: #ff0000;">&quot;0.4&quot;</span><span style="font-weight: bold; color: black;">&gt;</span></span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">            <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;text</span> <span style="color: #000066;">font</span>=<span style="color: #ff0000;">&quot;Verdana&quot;</span> <span style="color: #000066;">embedFonts</span>=<span style="color: #ff0000;">&quot;false&quot;</span> <span style="color: #000066;">size</span>=<span style="color: #ff0000;">&quot;38&quot;</span> <span style="color: #000066;">scale</span>=<span style="color: #ff0000;">&quot;1&quot;</span> <span style="color: #000066;">colorBefore</span>=<span style="color: #ff0000;">&quot;0xFFFFFF&quot;</span> <span style="color: #000066;">colorAfter</span>=<span style="color: #ff0000;">&quot;0x127fb3&quot;</span> <span style="color: #000066;">italic</span>=<span style="color: #ff0000;">&quot;false&quot;</span> <span style="color: #000066;">bold</span>=<span style="color: #ff0000;">&quot;false&quot;</span> <span style="color: #000066;">uppercase</span>=<span style="color: #ff0000;">&quot;false&quot;</span><span style="font-weight: bold; color: black;">&gt;</span></span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">                 <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;layout</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;fadeLine&quot;</span> <span style="color: #000066;">horizontalAlign</span>=<span style="color: #ff0000;">&quot;center&quot;</span> <span style="color: #000066;">verticalAlign</span>=<span style="color: #ff0000;">&quot;bottom&quot;</span> <span style="color: #000066;">textAlign</span>=<span style="color: #ff0000;">&quot;center&quot;</span> <span style="color: #000066;">lineHeight</span>=<span style="color: #ff0000;">&quot;-20&quot;</span> <span style="color: #000066;">horizontalPadding</span>=<span style="color: #ff0000;">&quot;0&quot;</span> <span style="color: #000066;">verticalPadding</span>=<span style="color: #ff0000;">&quot;20&quot;</span><span style="font-weight: bold; color: black;">/&gt;</span></span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">                 <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;filters<span style="font-weight: bold; color: black;">&gt;</span></span></span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">                   <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;filter</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;glow&quot;</span> <span style="color: #000066;">color</span>=<span style="color: #ff0000;">&quot;0x000000&quot;</span> <span style="color: #000066;">strength</span>=<span style="color: #ff0000;">&quot;5&quot;</span> <span style="color: #000066;">blurX</span>=<span style="color: #ff0000;">&quot;6&quot;</span> <span style="color: #000066;">blurY</span>=<span style="color: #ff0000;">&quot;6&quot;</span><span style="font-weight: bold; color: black;">/&gt;</span></span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">                 <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/filters<span style="font-weight: bold; color: black;">&gt;</span></span></span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">            <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/text<span style="font-weight: bold; color: black;">&gt;</span></span></span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">          <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/record<span style="font-weight: bold; color: black;">&gt;</span></span></span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">          <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;upload</span> <span style="color: #000066;">sendCookies</span>=<span style="color: #ff0000;">&quot;true&quot;</span><span style="font-weight: bold; color: black;">&gt;</span></span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">            <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;dialog</span> <span style="color: #000066;">description</span>=<span style="color: #ff0000;">&quot;Video File(*.avi;*.mov;*.mp4;*.mpg;*.mpeg;*.3gp;*.asf;*.wmv;*.vob;*.mkv;*.flv)&quot;</span> <span style="color: #000066;">extensions</span>=<span style="color: #ff0000;">&quot;*.avi;*.mov;*.mp4;*.mpg;*.mpeg;*.3gp;*.asf;*.wmv;*.vob;*.mkv;*.flv&quot;</span> <span style="color: #000066;">macTypes</span>=<span style="color: #ff0000;">&quot;MooV;MPEG;VfW;MOV;FLV&quot;</span><span style="font-weight: bold; color: black;">/&gt;</span></span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">          <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/upload<span style="font-weight: bold; color: black;">&gt;</span></span></span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">     <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/settings<span style="font-weight: bold; color: black;">&gt;</span></span></span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">     <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;screens</span> <span style="color: #000066;">backgroundColor</span>=<span style="color: #ff0000;">&quot;0x000000&quot;</span> <span style="color: #000066;">fitScreen</span>=<span style="color: #ff0000;">&quot;showAll&quot;</span> <span style="color: #000066;">effectDuration</span>=<span style="color: #ff0000;">&quot;1&quot;</span><span style="font-weight: bold; color: black;">&gt;</span></span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">          <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;image</span> <span style="color: #000066;">url</span>=<span style="color: #ff0000;">&quot;http://localhost/spivaimo/defaultAudioThumbnail.gif&quot;</span><span style="font-weight: bold; color: black;">/&gt;</span></span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">     <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/screens<span style="font-weight: bold; color: black;">&gt;</span></span></span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;phonogram</span> <span style="color: #000066;">url</span>=<span style="color: #ff0000;">&quot;.../source.mp3&quot;</span> <span style="color: #000066;">title</span>=<span style="color: #ff0000;">&quot;Fairytale&quot;</span> <span style="color: #000066;">hasVideo</span>=<span style="color: #ff0000;">&quot;false&quot;</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;mp3&quot;</span><span style="font-weight: bold; color: black;">&gt;</span></span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">          <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;original<span style="font-weight: bold; color: black;">&gt;</span></span></span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">            <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;karaoke</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;4358&quot;</span> <span style="color: #000066;">d</span>=<span style="color: #ff0000;">&quot;159&quot;</span> <span style="color: #000066;">genre</span>=<span style="color: #ff0000;">&quot;Country&quot;</span><span style="font-weight: bold; color: black;">&gt;</span></span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;pg</span> <span style="color: #000066;">t</span>=<span style="color: #ff0000;">&quot;18.78&quot;</span> <span style="color: #000066;">d</span>=<span style="color: #ff0000;">&quot;7.46&quot;</span><span style="font-weight: bold; color: black;">&gt;</span></span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">                   <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;ln<span style="font-weight: bold; color: black;">&gt;</span></span></span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">                     <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;lyr</span> <span style="color: #000066;">s</span>=<span style="color: #ff0000;">&quot;Years &quot;</span> <span style="color: #000066;">t</span>=<span style="color: #ff0000;">&quot;18.78&quot;</span> <span style="color: #000066;">d</span>=<span style="color: #ff0000;">&quot;0.61&quot;</span><span style="font-weight: bold; color: black;">/&gt;</span></span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">                          ...</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">                   <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/ln<span style="font-weight: bold; color: black;">&gt;</span></span></span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">                 <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/pg<span style="font-weight: bold; color: black;">&gt;</span></span></span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">            <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/karaoke<span style="font-weight: bold; color: black;">&gt;</span></span></span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">          <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/original<span style="font-weight: bold; color: black;">&gt;</span></span></span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">     <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/phonogram<span style="font-weight: bold; color: black;">&gt;</span></span></span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">     <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;record</span> <span style="color: #000066;">host</span>=<span style="color: #ff0000;">&quot;rtmp://localhost/oflaDemo&quot;</span> <span style="color: #000066;">stream</span>=<span style="color: #ff0000;">&quot;record&quot;</span> <span style="color: #000066;">volume</span>=<span style="color: #ff0000;">&quot;.3&quot;</span><span style="font-weight: bold; color: black;">&gt;</span></span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">          <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;save</span> <span style="color: #000066;">url</span>=<span style="color: #ff0000;">&quot;http://localhost/spivaimo/save.php&quot;</span><span style="font-weight: bold; color: black;">/&gt;</span></span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">          <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;delete</span> <span style="color: #000066;">url</span>=<span style="color: #ff0000;">&quot;http://localhost/spivaimo/delete.php&quot;</span><span style="font-weight: bold; color: black;">/&gt;</span></span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">     <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/record<span style="font-weight: bold; color: black;">&gt;</span></span></span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;play</span> <span style="color: #000066;">username</span>=<span style="color: #ff0000;">&quot;Username&quot;</span> <span style="color: #000066;">url</span>=<span style="color: #ff0000;">&quot;http://localhost/spivaimo/rcord.flv&quot;</span> <span style="color: #000066;">count</span>=<span style="color: #ff0000;">&quot;http://localhost/spivaimo/count.php&quot;</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;flv&quot;</span> <span style="color: #000066;">hasVideo</span>=<span style="color: #ff0000;">&quot;false&quot;</span> <span style="color: #000066;">volume</span>=<span style="color: #ff0000;">&quot;.8&quot;</span><span style="font-weight: bold; color: black;">&gt;</span></span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">          <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;rating</span> <span style="color: #000066;">url</span>=<span style="color: #ff0000;">&quot;http://localhost/spivaimo/rating.php&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;4.5000&quot;</span> <span style="color: #000066;">votes</span>=<span style="color: #ff0000;">&quot;8&quot;</span><span style="font-weight: bold; color: black;">/&gt;</span></span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">     <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/play<span style="font-weight: bold; color: black;">&gt;</span></span></span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">     <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;upload</span> <span style="color: #000066;">url</span>=<span style="color: #ff0000;">&quot;http://localhost/spivaimo/upload.php&quot;</span><span style="font-weight: bold; color: black;">/&gt;</span></span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/main<span style="font-weight: bold; color: black;">&gt;</span></span></span></div></li></ol></pre>
</div>
<p>Основной узел настроек, это settings, в котором содержатся общие настройки для скринов, текста и отображения плеера в общем. Это статические настройки т.к. не привязаны к определённой фонограмме, а действуют на все запускаемые экземпляры плеера. Так же, в корневом узле содержаться узлы настроек для конкретного экземпляра плеера – динамические настройки, т.е. там находятся пути к конкретной фонограмме, к скрипту с параметрами указывающими на конкретного пользователя и т.д.</p>
<p>После загрузки весь XML преобразуется в объекты настроек, почти Value Object’ы, только с методами шорткатами, к примеру XMLTextSettings.getTextFormat() возвращает экземпляр TextFormat основанный на настройках полученных из XML. При переносе данных в объекты происходит конвертация типов(к примеру, строка "true" преобразуется в булево true и т.д.) и подстановка значений по умолчанию, если не задано другое.</p>
<p><strong><a name="about_model"></a>Общее построение модели</strong></p>
<p>Вся модель инициализируется в классе приложения, после загрузки и обработки XML настроек. Во время инициализации модели создаются классы обслуживающие скрины вида – PlayScreen, RecordScreen, UploadScreen, каждому из них передаются общие и личные настройки, ссылка на IEventDispatcher через который будет происходить обмен событиями. Так же заранее создаются отображаемые тексты, чтоб не притормаживать старт проигрывания. Все объекты загрузчики, видео, аудио и прочее медиа управляется исключительно классами модели, так же эти классы принимают и фильтруют/обрабатывают все CHANGE события и рассылают SET события, к примеру, при инициализации плеера. В общем, как и в любом другом приложении есть абстрактные классы перетекающие из проекта к проекту, это система медиа-скринов, управление медиа-потоками и прочие полезные составляющие и другой планктон(как я назвал их выше, медиаторы и адаптеры), который связывает все эти составляющие в систему и преобразует данные из одного формата в другой, к примеру, секунды в миллисекунды или значение от 0 до 1 в позицию на таймлайне.</p>
<p><em>Система стримов для проигрывания нескольких потоков и синхронизация</em></p>
<p>Это самая интересная часть проекта из-за которой я и взялся за этот плеер, уж очень было интересно попробовать свои силы. Я сразу писал картину заказчику, чтоб он понимал что полностью свести рассинхрон на нет будет нереально, по можно свести к минимуму – в пределах 50-150 миллисекунд. Это, в основном, заслуга формата FLV, т.к. видео этого формата можно перемотать исключительно по ключевым кадрам, а качество веб видео не позволяет расставлять слишком частые ключевые кадры, поэтому приходилось ухищряться, чтоб добиться синхронизации звука фонограммы и записи. </p>
<p>У меня уже были заготовки для описания потоков аудио и видео, ведь даже заказчик(имеется введу технический персонал заказчика с которым я работал) не знал какие форматы будут использоваться(предполагалось, что будем использовать всё что сможем, а для начала FLV и MP3), поэтому одинаково использовал NetStream(видео/аудио) и Sound, для аудио. Лучшим решением, для их использования, было привести к общему интерфейсу и задать общий набор событий испускаемых этими классами. К примеру, у NetStream есть статусы оповещающие о состоянии буффера, а у Sound только свойство Sound.buffering, поэтому для него я задал внутренний интервал, который проверяет состояние этого свойства и если оно TRUE, то испускается событие BUFFER_EMPTY и наоборот. Так же, у Sound и NetStream разные форматы времени, секунды и миллисекунды, поэтому пришлось приводить к общему  дочерних классах.</p>
<p>Далее были реализованы RecordStream для записи: у него вызов RecordStream.pause() вызывает ошибку т.к. недопустимое действие для записи – её можно либо начать, либо остановить. И последний из этой группы – класс MultiStream, который контролирует вверенные ему потоки и, как все остальные, реализует интерфейс IStream и испускает общие события. Основная функция MultiStream заключается в том, что он умеет останавливать все потоки если один или несколько из его внутренних потоков остановились для буферизации и восстанавливает воспроизведение, когда все потоки готовы воспроизводится.</p>
<p>Сначала для синхронизации существовал только метод вызываемый по определённым событиям(BUFFER_FULL, BUFFER_EMPY) и интервалу. Позже я выделил класс PositionValidator, который получает список потоков и TextManager, сортирует их по значимости – несомненно, экземпляр RecordStream будет важнее всех остальных и через определённые промежутки времени проверяет значение рассинхрона между потоками. Если рассинхрон превысил определённое значение, то происходит валидация, т.е. потоки вырвавшиеся вперёд  возвращаются немного назад и наоборот. Вторым по значимости я оставил отображаемый текст, т.к. при определённом качестве MP3 звука на некоторых моментах записи он серьёзно тормозил всё остальное и мало приятного наблюдать постоянно скачущий назад текст. <img src='http://actualwave.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  При валидации есть возможность указать наиболее приоритетный поток, если есть необходимость(в некоторых случаях это был поток записи).</p>
<p><strong><a name="decompilation_protection_and_demo_mode"></a>Защита от декомпиляции и демо режим</strong></p>
<p>Поскольку проект был небольшой, я подобрал идеальный способ защитить исходный код проекта. Необходимо было избавиться от угрозы декомпиляции я пошёл напрямую – всю логику плеера я поместил в отдельное приложение, которое внедрялось в плеер на стадии компиляции с помощью эмбеда. Получается, что весь код плеера находился в SWF приложении находящемся в другом SWF приложении ка набор байт, в виде ByteArray. Во время выполнения плеера, этот ByteArray выполнялся с помощью Loader.loadBytes() и плеер стартовал. Поскольку плеер весит не больше сотри килобайт я пренебрёг полосой загрузки для основного приложения – учитывая то, что люди используют плеер для воспроизведения мегабайт информации индикатор загрузки самого плеера вряд ли был бы замечен. <img src='http://actualwave.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  </p>
<p>Исходный код загрузчика плеера:</p>
<div class="more_syntax">
<pre class="actionscript3"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #006699; font-weight: bold;">package</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">     <span style="color: #006600; font-weight: bold;">import</span> aw.<span style="color: #006600;">projects</span>.<span style="color: #006600;">project</span>.<span style="color: #006600;">Model</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">     <span style="color: #006600; font-weight: bold;">import</span> <span style="color: #660099 !important; font-weight: bold;">flash.<span style="color: #006600;">display</span></span>.<span style="color: #0000cc; font-weight: bold;">DisplayObject</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">     <span style="color: #006600; font-weight: bold;">import</span> <span style="color: #660099 !important; font-weight: bold;">flash.<span style="color: #006600;">display</span></span>.<span style="color: #0000cc; font-weight: bold;">Loader</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">     <span style="color: #006600; font-weight: bold;">import</span> <span style="color: #660099 !important; font-weight: bold;">flash.<span style="color: #006600;">display</span></span>.<span style="color: #0000cc; font-weight: bold;">Sprite</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">     <span style="color: #006600; font-weight: bold;">import</span> <span style="color: #660099 !important; font-weight: bold;">flash.<span style="color: #006600;">events</span></span>.<span style="color: #0000cc; font-weight: bold;">Event</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">     <span style="color: #006600; font-weight: bold;">import</span> flash.<span style="color: #0000cc; font-weight: bold;">system</span>.<span style="color: #0000cc; font-weight: bold;">ApplicationDomain</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">     <span style="color: #006600; font-weight: bold;">import</span> flash.<span style="color: #0000cc; font-weight: bold;">system</span>.<span style="color: #0000cc; font-weight: bold;">LoaderContext</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">     <span style="color: #006600; font-weight: bold;">import</span> <span style="color: #660099 !important; font-weight: bold;">flash.<span style="color: #006600;">utils</span></span>.<span style="color: #0000cc; font-weight: bold;">ByteArray</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">     <span style="color: #663366;">&#91;</span>SWF<span style="color: #663366;">&#40;</span>width=<span style="color: #ff33cc; font-style: italic;">&quot;436&quot;</span>, height=<span style="color: #ff33cc; font-style: italic;">&quot;286&quot;</span>, frameRate=<span style="color: #ff33cc; font-style: italic;">&quot;24&quot;</span>, backgroundColor=<span style="color: #ff33cc; font-style: italic;">&quot;#000000&quot;</span><span style="color: #663366;">&#41;</span><span style="color: #663366;">&#93;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">     <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">class</span> main <span style="color: #006699; font-weight: bold;">extends</span> <span style="color: #0000cc; font-weight: bold;">Sprite</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">          <span style="color: #663366;">&#91;</span>Embed<span style="color: #663366;">&#40;</span><span style="color: #0000cc; font-weight: bold;">source</span>=<span style="color: #ff33cc; font-style: italic;">&quot;../bin-release/Model.swf&quot;</span>,mimeType=<span style="color: #ff33cc; font-style: italic;">&quot;application/octet-stream&quot;</span><span style="color: #663366;">&#41;</span><span style="color: #663366;">&#93;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">          <span style="color: #66cccc; font-weight: bold;">static</span> <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">const</span> modelDefinition:<span style="color: #006699; font-weight: bold;">Class</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">          <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">var</span> <span style="color: #0000cc; font-weight: bold;">loader</span>:<span style="color: #0000cc; font-weight: bold;">Loader</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">          <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">function</span> main<span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>:<span style="color: #669933; font-weight: bold;">void</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">            <span style="color: #669933; font-weight: bold;">super</span><span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">            <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">loadDefinition</span><span style="color: #663366;">&#40;</span>modelDefinition<span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">          <span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">          <span style="color: #66cccc; font-weight: bold;">protected</span> <span style="color: #006699; font-weight: bold;">function</span> loadDefinition<span style="color: #663366;">&#40;</span>definition:<span style="color: #006699; font-weight: bold;">Class</span><span style="color: #663366;">&#41;</span>:<span style="color: #669933; font-weight: bold;">void</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">            <span style="color: #0000cc; font-weight: bold;">loader</span> = <span style="color: #0000cc; font-weight: bold;">new</span> <span style="color: #0000cc; font-weight: bold;">Loader</span><span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">            <span style="color: #006699; font-weight: bold;">var</span> data:<span style="color: #0000cc; font-weight: bold;">ByteArray</span> = <span style="color: #0000cc; font-weight: bold;">new</span> definition<span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">            data.<span style="color: #006600;">position</span> = <span style="color: #ff6600; font-weight: bold;">0</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">              <span style="color: #0000cc; font-weight: bold;">loader</span>.<span style="color: #006600;">contentLoaderInfo</span>.<span style="color: #006600;">addEventListener</span><span style="color: #663366;">&#40;</span><span style="color: #0000cc; font-weight: bold;">Event</span>.<span style="color: #006600;">COMPLETE</span>, <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">completeHandler</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">            loaer.<span style="color: #006600;">loadBytes</span><span style="color: #663366;">&#40;</span>data, <span style="color: #0000cc; font-weight: bold;">new</span> <span style="color: #0000cc; font-weight: bold;">LoaderContext</span><span style="color: #663366;">&#40;</span><span style="color: #669933; font-weight: bold;">false</span>, <span style="color: #0000cc; font-weight: bold;">ApplicationDomain</span>.<span style="color: #006600;">currentDomain</span><span style="color: #663366;">&#41;</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">          <span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">          <span style="color: #66cccc; font-weight: bold;">protected</span> <span style="color: #006699; font-weight: bold;">function</span> completeHandler<span style="color: #663366;">&#40;</span><span style="color: #0000cc; font-weight: bold;">event</span>:<span style="color: #0000cc; font-weight: bold;">Event</span><span style="color: #663366;">&#41;</span>:<span style="color: #669933; font-weight: bold;">void</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">              <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #0000cc; font-weight: bold;">loader</span>.<span style="color: #006600;">contentLoaderInfo</span>.<span style="color: #006600;">removeEventListener</span><span style="color: #663366;">&#40;</span><span style="color: #0000cc; font-weight: bold;">Event</span>.<span style="color: #006600;">COMPLETE</span>, <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">completeHandler</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">            <span style="color: #006699; font-weight: bold;">var</span> content:<span style="color: #0000cc; font-weight: bold;">DisplayObject</span> = <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #0000cc; font-weight: bold;">loader</span>.<span style="color: #006600;">content</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">            <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #0000cc; font-weight: bold;">stage</span>.<span style="color: #006600;">addChild</span><span style="color: #663366;">&#40;</span>content<span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">          <span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">     <span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #663366;">&#125;</span></div></li></ol></pre>
</div>
<p>И main, и Model являются приложениями в проекте, но Model приложение по-умолчанию, а main использовалось только при публикации приложения. Получается что разрабатывать и тестировать приложение можно не заморачиваяcь а в релизе сначала компилировать Model, а потом main.</p>
<p>В самом классе модели, скрытом от глаз любопытного, стоял код определяющий по дате, когда необходимо предотвратить выполнение кода в приложении. Это и был единственный датчик демо-режима.</p>
<div class="more_syntax">
<pre class="actionscript3"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">     <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">class</span> Model <span style="color: #006699; font-weight: bold;">extends</span> <span style="color: #0000cc; font-weight: bold;">Sprite</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">          ...</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">          <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">function</span> Model<span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>:<span style="color: #669933; font-weight: bold;">void</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">            <span style="color: #669933; font-weight: bold;">super</span><span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">            <span style="color: #808080; font-style: italic;">//fixme DEMO</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">            <span style="color: #669933; font-weight: bold;">if</span><span style="color: #663366;">&#40;</span><span style="color: #663366;">&#40;</span><span style="color: #0000cc; font-weight: bold;">new</span> <span style="color: #0000cc; font-weight: bold;">Date</span><span style="color: #663366;">&#40;</span><span style="color: #ff6600; font-weight: bold;">2010</span>, <span style="color: #ff6600; font-weight: bold;">1</span><span style="color: #663366;">&#41;</span><span style="color: #663366;">&#41;</span>.<span style="color: #006600;">time</span>&lt;<span style="color: #663366;">&#40;</span><span style="color: #0000cc; font-weight: bold;">new</span> <span style="color: #0000cc; font-weight: bold;">Date</span><span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span><span style="color: #663366;">&#41;</span>.<span style="color: #006600;">time</span><span style="color: #663366;">&#41;</span> <span style="color: #669933; font-weight: bold;">return</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">            <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">addEventListener</span><span style="color: #663366;">&#40;</span><span style="color: #0000cc; font-weight: bold;">Event</span>.<span style="color: #006600;">ADDED_TO_STAGE</span>, <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">initialize</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">          <span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">          <span style="color: #66cccc; font-weight: bold;">protected</span> <span style="color: #006699; font-weight: bold;">function</span> initialize<span style="color: #663366;">&#40;</span><span style="color: #0000cc; font-weight: bold;">event</span>:<span style="color: #0000cc; font-weight: bold;">Event</span><span style="color: #663366;">&#41;</span>:<span style="color: #669933; font-weight: bold;">void</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">            <span style="color: #006699; font-weight: bold;">var</span> params:<span style="color: #0000cc; font-weight: bold;">Object</span> = <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #0000cc; font-weight: bold;">stage</span>.<span style="color: #0000cc; font-weight: bold;">loaderInfo</span>.<span style="color: #006600;">parameters</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">            ...</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li></ol></pre>
</div>
<p>Понятно, что такие меры не уберегут ваше приложение от особо назойливых, ведь можно достаточно просто вытащить из SWF приложения ByteArray, сохранив на диск как SWF и декомпилировать его. Но, отсеит большинство любопытных, т.к. человек знающий как декомпилировать это приложение наверняка уже знает, как реализовать ту или иную часть приложения и просто нет необходимости в декомпиляции. <img src='http://actualwave.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><strong>Мелочи</strong></p>
<ul>
<li>Локализация – от неё вообще отказались, но плодить строки по коду не кошерно, поэтому я поступил "как всегда" – загнал весь текст в константы класса Localization, так что при смене языка можно просто переписать значения и перекомпилировать.</li>
<li>Локальные данные были реализованы как адаптеры для объектов SharedObject, чтоб получать адкватуню справку, а внутри адаптеров простое присвоение динамическим свойствам к объекту SharedObject.data.</li>
<div class="more_syntax">
<pre class="actionscript3"><span style="color: #006699; font-weight: bold;">package</span> aw.<span style="color: #006600;">projects</span>.<span style="color: #006600;">project</span>.<span style="color: #006600;">model</span>.<span style="color: #006600;">local</span><span style="color: #663366;">&#123;</span>
     <span style="color: #006600; font-weight: bold;">import</span> aw.<span style="color: #006600;">projects</span>.<span style="color: #006600;">project</span>.<span style="color: #006600;">model</span>.<span style="color: #0000cc; font-weight: bold;">xml</span>.<span style="color: #006600;">PlaySettingsXML</span>;
&nbsp;
     <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">class</span> PlaySettingsLocal <span style="color: #006699; font-weight: bold;">extends</span> LocalSettings<span style="color: #663366;">&#123;</span>
          <span style="color: #66cccc; font-weight: bold;">static</span> <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">const</span> LOCAL_NAME:<span style="color: #0000cc; font-weight: bold;">String</span> = <span style="color: #ff33cc; font-style: italic;">'playSettings'</span>;
          <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">function</span> PlaySettingsLocal<span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>:<span style="color: #669933; font-weight: bold;">void</span><span style="color: #663366;">&#123;</span>
            <span style="color: #669933; font-weight: bold;">super</span><span style="color: #663366;">&#40;</span>LOCAL_NAME<span style="color: #663366;">&#41;</span>;
          <span style="color: #663366;">&#125;</span>
          <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">function</span> merge<span style="color: #663366;">&#40;</span>settings:PlaySettingsXML<span style="color: #663366;">&#41;</span>:<span style="color: #669933; font-weight: bold;">void</span><span style="color: #663366;">&#123;</span>
            <span style="color: #669933; font-weight: bold;">if</span><span style="color: #663366;">&#40;</span><span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">hasVolume</span><span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span><span style="color: #663366;">&#41;</span> settings.<span style="color: #006600;">volume</span> = <span style="color: #669933; font-weight: bold;">this</span>.<span style="color: #006600;">volume</span>;
          <span style="color: #663366;">&#125;</span>
          <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">function</span> <span style="color: #006699; font-weight: bold;">get</span> volume<span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>:<span style="color: #0000cc; font-weight: bold;">Number</span><span style="color: #663366;">&#123;</span>
            <span style="color: #669933; font-weight: bold;">return</span> <span style="color: #669933; font-weight: bold;">this</span>._sharedObject.<span style="color: #006600;">data</span>.<span style="color: #006600;">volume</span>;
          <span style="color: #663366;">&#125;</span>
          <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">function</span> hasVolume<span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>:<span style="color: #0000cc; font-weight: bold;">Boolean</span><span style="color: #663366;">&#123;</span>
            <span style="color: #669933; font-weight: bold;">return</span> <span style="color: #ff33cc; font-style: italic;">'volume'</span> <span style="color: #669933; font-weight: bold;">in</span> <span style="color: #669933; font-weight: bold;">this</span>._sharedObject.<span style="color: #006600;">data</span>;
          <span style="color: #663366;">&#125;</span>
          <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">function</span> <span style="color: #006699; font-weight: bold;">set</span> volume<span style="color: #663366;">&#40;</span>value:<span style="color: #0000cc; font-weight: bold;">Number</span><span style="color: #663366;">&#41;</span>:<span style="color: #669933; font-weight: bold;">void</span><span style="color: #663366;">&#123;</span>
            <span style="color: #669933; font-weight: bold;">this</span>._sharedObject.<span style="color: #006600;">data</span>.<span style="color: #006600;">volume</span> = value;
          <span style="color: #663366;">&#125;</span>
     <span style="color: #663366;">&#125;</span>
<span style="color: #663366;">&#125;</span></pre>
</div>
<li>Группировка воспроизводимых объектов – в модели скрина для записи предопределено три состояния: проигрывание фонограммы до записи, запись, проигрывание записанного перед сохранением. Эти состояния имеют разный набор объектов и часто возникали конфликты из-за не удалённых объектов, а это приводило к дублированию звуков и прочим неприятностям. Чтоб особо не заморачиваться, я запер эти состояния в соответствующие объекты – PlayCollection, RecordCollection, PlayRecordedCollection, которые создаются на старте и умирают при останове.</li>
<li>Индикатор таймаута между куплетами был реализован прямо в скине, поэтому я вывел события текста на Stage. Суть его работы в том, что он получает событие старта куплета с объектом ITimeDepend, у которого есть свойства startTime, duration и position. По информации из этого объекта он определяет позицию и отображает прогресс бар.</li>
<li>Для выбора микрофона по-умолчанию был создан отдельный класс DefaultMicrophone, который содержит логику по выбору микрофона, если таковой не был выбран пользователем в настройках Flash Player и настойках самого караоке-плеера. В этом классе есть набор слов, которые не должны встречаться в названии микрофона(line, input) и слова которые должны присутствовать(mic). С помощью этих слов подбирается микрофон, ведь мало приятного сразу после записи песни обнаружить, что звук писался из Line input. <img src='http://actualwave.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
<li>Мастер настроек основан на тех же принципах, что и весь скин – Asset’ы и события испускаемые через Stage. Кроме того, он может испускать SET события, чтоб установить значения выбранные по-умолчанию. Если нет доступа к микрофону(Microphone.muted), он вызывает панель настроек Flash player’а и если микрофон остаётся недоступным повторяет это ещё пару раз, но не настаивает. <img src='http://actualwave.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Если же микрофон доступен, то данная страница мастера автоматически пропускается и начинается настройка микрофона.</li>
</ul>
<p>Сейчас плеер передан полностью на поддержку разработчиков заказчика –мы пришли к договорённости о передаче полностью всего исходного кода, поэтому он постоянно изменяется и совершенствуется разработчиками проекта "<a href="http://spivaimo.com/">Спиваймо</a>".</p>
]]></content:encoded>
			<wfw:commentRss>http://actualwave.com/blog/?feed=rss2&amp;p=332</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Тестовый PHP скрипт для загрузки файлов</title>
		<link>http://actualwave.com/blog/?p=327</link>
		<comments>http://actualwave.com/blog/?p=327#comments</comments>
		<pubDate>Mon, 11 Jan 2010 15:47:22 +0000</pubDate>
		<dc:creator>actual_wave</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[Новости]]></category>
		<category><![CDATA[Поделки]]></category>
		<category><![CDATA[file]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[test]]></category>
		<category><![CDATA[upload]]></category>

		<guid isPermaLink="false">http://actualwave.com/blog/?p=327</guid>
		<description><![CDATA[Уже достаточно давно, на одном проекте надо было протестировать загрузку файлов и я сделал небольшой PHP скрипт для тестирования этого процесса. Ничего особенного он не делает, только получает файл и сохраняет его в папке под временной меткой загрузки с дампом переменных. Вроде ничего особенного, но вот уже который проект, а он всё равно полезен, поэтому [...]]]></description>
			<content:encoded><![CDATA[<p>Уже достаточно давно, на одном проекте надо было протестировать загрузку файлов и я сделал небольшой PHP скрипт для тестирования этого процесса. Ничего особенного он не делает, только получает файл и сохраняет его в папке под временной меткой загрузки с дампом переменных. Вроде ничего особенного, но вот уже который проект, а он всё равно полезен, поэтому я решил его выложить тут, может ещё кому-нибудь пригодится. Да и сам, если посею, так буду знать где взять(не раз уже блог меня спасал в подобных случаях). <img src='http://actualwave.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><span id="more-327"></span></p>
<p>Файл upload.php:</p>
<div class="more_syntax">
<pre class="php"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #000000; font-weight: bold;">&lt;?php</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span>!<a href="http://www.php.net/file_exists"><span style="color: #000066;">file_exists</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'./files'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <a href="http://www.php.net/mkdir"><span style="color: #000066;">mkdir</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'./files'</span><span style="color: #66cc66;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000ff;">$time</span> = <span style="color: #66cc66;">&#40;</span>string<span style="color: #66cc66;">&#41;</span><a href="http://www.php.net/time"><span style="color: #000066;">time</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000ff;">$dir</span> = <span style="color: #ff0000;">'./files/'</span>.<span style="color: #0000ff;">$time</span>.<span style="color: #ff0000;">'/'</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><a href="http://www.php.net/mkdir"><span style="color: #000066;">mkdir</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$dir</span><span style="color: #66cc66;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000ff;">$dump</span> = <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>.<a href="http://www.php.net/print_r"><span style="color: #000066;">print_r</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$GLOBALS</span>, <span style="color: #000000; font-weight: bold;">true</span><span style="color: #66cc66;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000ff;">$f</span> = <a href="http://www.php.net/fopen"><span style="color: #000066;">fopen</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$dir</span>.<span style="color: #ff0000;">'__dump.txt'</span>, <span style="color: #ff0000;">'a'</span><span style="color: #66cc66;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><a href="http://www.php.net/fwrite"><span style="color: #000066;">fwrite</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$f</span>, <span style="color: #0000ff;">$dump</span><span style="color: #66cc66;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><a href="http://www.php.net/fclose"><span style="color: #000066;">fclose</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$f</span><span style="color: #66cc66;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #b1b100;">if</span><span style="color: #66cc66;">&#40;</span><a href="http://www.php.net/count"><span style="color: #000066;">count</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$_FILES</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">              <span style="color: #b1b100;">foreach</span><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$_FILES</span> <span style="color: #b1b100;">as</span> <span style="color: #0000ff;">$key</span>=&gt;<span style="color: #0000ff;">$value</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">                            <span style="color: #0000ff;">$tmp</span> = <span style="color: #0000ff;">$value</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'tmp_name'</span><span style="color: #66cc66;">&#93;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">                            <span style="color: #0000ff;">$name</span> = <span style="color: #0000ff;">$value</span><span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'name'</span><span style="color: #66cc66;">&#93;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">                            <a href="http://www.php.net/echo"><span style="color: #000066;">echo</span></a> <a href="http://www.php.net/move_uploaded_file"><span style="color: #000066;">move_uploaded_file</span></a><span style="color: #66cc66;">&#40;</span><span style="color: #0000ff;">$tmp</span>, <span style="color: #0000ff;">$dir</span>.<span style="color: #0000ff;">$name</span><span style="color: #66cc66;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">              <span style="color: #66cc66;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cc66;">&#125;</span><span style="color: #b1b100;">else</span><span style="color: #66cc66;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #000000; font-weight: bold;">?&gt;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">&lt;form action=<span style="color: #ff0000;">&quot;./upload.php&quot;</span> method=<span style="color: #ff0000;">&quot;post&quot;</span> enctype=<span style="color: #ff0000;">&quot;multipart/form-data&quot;</span>&gt;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">&lt;input type=<span style="color: #ff0000;">&quot;text&quot;</span> name=<span style="color: #ff0000;">&quot;text&quot;</span>&gt;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">&lt;input type=<span style="color: #ff0000;">&quot;file&quot;</span> name=<span style="color: #ff0000;">&quot;file&quot;</span>&gt;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">&lt;input type=<span style="color: #ff0000;">&quot;submit&quot;</span>&gt;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">&lt;/form&gt;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #000000; font-weight: bold;">&lt;?php</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #66cc66;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #000000; font-weight: bold;">?&gt;</span></div></li></ol></pre>
</div>
<a class="downloadlink" href="http://actualwave.com/blog/wp-content/plugins/download-monitor/download.php?id=1" title=" downloaded 124 times" >Скрипт для тестирования загрузки файлов (124)</a>
]]></content:encoded>
			<wfw:commentRss>http://actualwave.com/blog/?feed=rss2&amp;p=327</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Разница в выборке «.*» в XML и во flash.utils.Proxy</title>
		<link>http://actualwave.com/blog/?p=320</link>
		<comments>http://actualwave.com/blog/?p=320#comments</comments>
		<pubDate>Fri, 08 Jan 2010 21:19:28 +0000</pubDate>
		<dc:creator>actual_wave</dc:creator>
				<category><![CDATA[ActionScript 3]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[flash.utils.Proxy]]></category>
		<category><![CDATA[Proxy]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://actualwave.com/blog/?p=320</guid>
		<description><![CDATA[В XML выборка элементов через знак звёздочки говорит о том, что надо выбрать все дочерние узлы, не зависимо от типа узла или пространства имён XML элемента. Класс flash.utils.Proxy даёт нам возможность пользоваться выборками в своих классах. Я обнаружил разницу в поведении и дальше делюсь наблюдениями.

Вот, результат такой выборки в XML документе:

var xml:XML = &#60;root xmlns:ns=&#34;urn:some-uri&#34;&#62;	&#60;node1/&#62;	&#60;node2/&#62;	&#60;node3/&#62;	&#60;ns:node4/&#62;	&#60;ns:node5/&#62;	&#60;ns:node6/&#62;&#60;/root&#62;;trace&#40;xml.*.toXMLString&#40;&#41;&#41;;/*&#60;node1 [...]]]></description>
			<content:encoded><![CDATA[<p>В XML выборка элементов через знак звёздочки говорит о том, что надо выбрать все дочерние узлы, не зависимо от типа узла или пространства имён XML элемента. Класс <code>flash.utils.Proxy</code> даёт нам возможность пользоваться выборками в своих классах. Я обнаружил разницу в поведении и дальше делюсь наблюдениями.</p>
<p><span id="more-320"></span></p>
<p>Вот, результат такой выборки в XML документе:</p>
<div class="more_syntax">
<pre class="actionscript3"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #006699; font-weight: bold;">var</span> <span style="color: #0000cc; font-weight: bold;">xml</span>:<span style="color: #0000cc; font-weight: bold;">XML</span> = &lt;root xmlns:ns=<span style="color: #ff33cc; font-style: italic;">&quot;urn:some-uri&quot;</span>&gt;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	&lt;node1/&gt;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	&lt;node2/&gt;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	&lt;node3/&gt;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	&lt;ns:node4/&gt;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	&lt;ns:node5/&gt;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	&lt;ns:node6/&gt;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">&lt;/root&gt;;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000cc; font-weight: bold;">trace</span><span style="color: #663366;">&#40;</span><span style="color: #0000cc; font-weight: bold;">xml</span>.<span style="color: #006600;">*</span>.<span style="color: #006600;">toXMLString</span><span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">/*</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">&lt;node1 xmlns:ns=&quot;urn:some-uri&quot;/&gt;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">&lt;node2 xmlns:ns=&quot;urn:some-uri&quot;/&gt;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">&lt;node3 xmlns:ns=&quot;urn:some-uri&quot;/&gt;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">&lt;ns:node4 xmlns:ns=&quot;urn:some-uri&quot;/&gt;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">&lt;ns:node5 xmlns:ns=&quot;urn:some-uri&quot;/&gt;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">&lt;ns:node6 xmlns:ns=&quot;urn:some-uri&quot;/&gt;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #808080; font-style: italic;">*/</span></div></li></ol></pre>
</div>
<p>Выбраны все узлы, не зависимо от пространства имён в котором он лежит.</p>
<p>Если реализовать метод <code>flash_proxy::getProperty()</code> для наследника <code>flash.utils.Proxy</code>, то в случае такой выборки в этот метод будет передаваться экземпляр QName в базовом пространстве имён, т.е. его свойство <code>uri</code> будет равно пустой строке. Это может вызвать проблемы, т.к. все свойства в любых других пространствах имён будут опущены. А для того чтоб выбрать все значения во всех пространствах имён из наследника <code>flash.utils.Proxy</code> необходимо делать выборку через .*::*(для XML эта выборка коснётся исключительно узлов типа ELEMENT) - так вы указываете любое пространство имён и в метод <code>flash_proxy::getProperty()</code> будет передан экземпляр QName c <code>uri</code> равным NULL, что и требовалось, собственно. <img src='http://actualwave.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Это не есть ошибка, т.к. в XML два вида узлов из пяти поддерживает пространства имён, поэтому в такой выборке они просто опускаются, а когда в выборке конкретно указывается пространство имён, то учитываются только элементы(или атрибуты, если делать выборку указав это).</p>
<p>Это мой опыт работы с <code>flash.utils.Proxy</code> и я не знаю как вы реализуете методы в наследниках <code>flash.utils.Proxy</code>, так что возможно для вас подобная ситуация окажется нормальной. Меня же подобная разность в поведении насторожила, поэтому и подчеркнул.</p>
]]></content:encoded>
			<wfw:commentRss>http://actualwave.com/blog/?feed=rss2&amp;p=320</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Информация о происхождении экземпляра QName</title>
		<link>http://actualwave.com/blog/?p=309</link>
		<comments>http://actualwave.com/blog/?p=309#comments</comments>
		<pubDate>Thu, 07 Jan 2010 13:22:13 +0000</pubDate>
		<dc:creator>actual_wave</dc:creator>
				<category><![CDATA[ActionScript 3]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[attribute]]></category>
		<category><![CDATA[aw.utils.QNameUtils]]></category>
		<category><![CDATA[flash.utils.Proxy]]></category>
		<category><![CDATA[namespace]]></category>
		<category><![CDATA[Proxy]]></category>
		<category><![CDATA[QName]]></category>
		<category><![CDATA[QNameUtils]]></category>
		<category><![CDATA[uri]]></category>

		<guid isPermaLink="false">http://actualwave.com/blog/?p=309</guid>
		<description><![CDATA[Flex cookbook entry: How to know QName instance origins.
В ActionScript 3 у простого типа QName есть возможность хранить информацию о происхождении экземпляра, т.е. можно узнать, это имя атрибута или узла/свойства. Но я не смог найти простого и прямого способа «выдернуть» эту информацию из экземпляра QName. Поэтому дальше горожу свой огород.  
 
В классе flash.utils.Proxy [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://cookbooks.adobe.com/post_How_to_know_QName_instance_origins-17293.html">Flex cookbook entry: How to know QName instance origins</a>.</p>
<p>В ActionScript 3 у простого типа QName есть возможность хранить информацию о происхождении экземпляра, т.е. можно узнать, это имя атрибута или узла/свойства. Но я не смог найти простого и прямого способа «выдернуть» эту информацию из экземпляра QName. Поэтому дальше горожу свой огород. <img src='http://actualwave.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p> <span id="more-309"></span></p>
<p>В классе <code>flash.utils.Proxy</code> есть метод <code>flash_proxy::isAttribute</code>, который возвращает булево значение – имя атрибута передано или нет. Я воспользовался этим методом немного не по назначению и появился метод <code>QNameUtils.isAttribute</code>:</p>
<div class="more_syntax">
<pre class="actionscript3"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #006699; font-weight: bold;">package</span> aw.<span style="color: #006600;">utils</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	<span style="color: #006600; font-weight: bold;">import</span> <span style="color: #660099 !important; font-weight: bold;">flash.<span style="color: #006600;">utils</span></span>.<span style="color: #0000cc; font-weight: bold;">Proxy</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	<span style="color: #006600; font-weight: bold;">import</span> <span style="color: #660099 !important; font-weight: bold;">flash.<span style="color: #006600;">utils</span></span>.<span style="color: #006600; font-weight: bold;">flash_proxy</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	<span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">class</span> QNameUtils <span style="color: #006699; font-weight: bold;">extends</span> <span style="color: #0000cc; font-weight: bold;">Object</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">		<span style="color: #66cccc; font-weight: bold;">static</span> <span style="color: #66cccc; font-weight: bold;">private</span> <span style="color: #006699; font-weight: bold;">const</span> proxyIsAttributeMethod:<span style="color: #006699; font-weight: bold;">Function</span> = <span style="color: #663366;">&#40;</span><span style="color: #0000cc; font-weight: bold;">new</span> <span style="color: #0000cc; font-weight: bold;">Proxy</span><span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span><span style="color: #663366;">&#41;</span>.<span style="color: #006600; font-weight: bold;">flash_proxy</span>::isAttribute;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">		<span style="color: #66cccc; font-weight: bold;">static</span> <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">function</span> isAttribute<span style="color: #663366;">&#40;</span>name:<span style="color: #0000cc; font-weight: bold;">QName</span><span style="color: #663366;">&#41;</span>:<span style="color: #0000cc; font-weight: bold;">Boolean</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">			<span style="color: #669933; font-weight: bold;">return</span> proxyIsAttributeMethod<span style="color: #663366;">&#40;</span>name<span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">		<span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">		...</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	<span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #663366;">&#125;</span></div></li></ol></pre>
</div>
<p>Далее, стало интересно, как можно влиять на это значение – простого способа, опять таки, нет.  Единственный способ , это создать в XML атрибут с таким же именем и потом получить <code>xml.@attribute.name()</code> – вот это будет имя атрибута.  Но появилась проблема в том, что XML атрибут не может находиться в пространстве имён NULL(это обозначает «любое пространство имён»), а экземпляр QName может ссылаться на него и при создании такого атрибута он перемещается в базовое пространство имён(с uri = “”). И опять на помощь спешит <code>flash.utils.Proxy</code> – при попытке запросить атрибут он сам создаёт имя атрибута без изменений пространства имён или локального имени. В общем, я опять воспользовался обходным путём.</p>
<div class="more_syntax">
<pre class="actionscript3"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #006699; font-weight: bold;">package</span> aw.<span style="color: #006600;">utils</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	<span style="color: #006600; font-weight: bold;">import</span> <span style="color: #660099 !important; font-weight: bold;">flash.<span style="color: #006600;">utils</span></span>.<span style="color: #0000cc; font-weight: bold;">Proxy</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	<span style="color: #006600; font-weight: bold;">import</span> <span style="color: #660099 !important; font-weight: bold;">flash.<span style="color: #006600;">utils</span></span>.<span style="color: #006600; font-weight: bold;">flash_proxy</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	<span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">class</span> QNameUtils <span style="color: #006699; font-weight: bold;">extends</span> <span style="color: #0000cc; font-weight: bold;">Object</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">		...</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">		<span style="color: #66cccc; font-weight: bold;">static</span> <span style="color: #66cccc; font-weight: bold;">private</span> <span style="color: #006699; font-weight: bold;">var</span> _converter:ConverterProxy;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">		<span style="color: #66cccc; font-weight: bold;">static</span> <span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">function</span> setAttribute<span style="color: #663366;">&#40;</span>name:<span style="color: #0000cc; font-weight: bold;">QName</span>, isAttribute:<span style="color: #0000cc; font-weight: bold;">Boolean</span>=<span style="color: #669933; font-weight: bold;">true</span><span style="color: #663366;">&#41;</span>:<span style="color: #0000cc; font-weight: bold;">QName</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">			<span style="color: #669933; font-weight: bold;">if</span><span style="color: #663366;">&#40;</span>isAttribute<span style="color: #663366;">&#41;</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">				<span style="color: #669933; font-weight: bold;">if</span><span style="color: #663366;">&#40;</span>!_converter<span style="color: #663366;">&#41;</span> _converter = <span style="color: #0000cc; font-weight: bold;">new</span> ConverterProxy<span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">				_converter.@<span style="color: #663366;">&#91;</span>name<span style="color: #663366;">&#93;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">				name = _converter.<span style="color: #006600;">getLastUsedName</span><span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">			<span style="color: #663366;">&#125;</span><span style="color: #669933; font-weight: bold;">else</span> name = <span style="color: #0000cc; font-weight: bold;">new</span> <span style="color: #0000cc; font-weight: bold;">QName</span><span style="color: #663366;">&#40;</span>name.<span style="color: #006600;">uri</span>, name.<span style="color: #006600;">localName</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">			<span style="color: #669933; font-weight: bold;">return</span> name;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">		<span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">		...</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	<span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #006600; font-weight: bold;">import</span> <span style="color: #660099 !important; font-weight: bold;">flash.<span style="color: #006600;">utils</span></span>.<span style="color: #0000cc; font-weight: bold;">Proxy</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #006600; font-weight: bold;">import</span> <span style="color: #660099 !important; font-weight: bold;">flash.<span style="color: #006600;">utils</span></span>.<span style="color: #006600; font-weight: bold;">flash_proxy</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #006699; font-weight: bold;">class</span> ConverterProxy <span style="color: #006699; font-weight: bold;">extends</span> <span style="color: #0000cc; font-weight: bold;">Proxy</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	<span style="color: #66cccc; font-weight: bold;">private</span> <span style="color: #006699; font-weight: bold;">var</span> _lastName:<span style="color: #0000cc; font-weight: bold;">QName</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	<span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">function</span> ConverterProxy<span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>:<span style="color: #669933; font-weight: bold;">void</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">		<span style="color: #669933; font-weight: bold;">super</span><span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	<span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	<span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">function</span> getLastUsedName<span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>:<span style="color: #0000cc; font-weight: bold;">QName</span><span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">		<span style="color: #669933; font-weight: bold;">return</span> <span style="color: #669933; font-weight: bold;">this</span>._lastName;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	<span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	<span style="color: #66cccc; font-weight: bold;">override</span> <span style="color: #006600; font-weight: bold;">flash_proxy</span> <span style="color: #006699; font-weight: bold;">function</span> getProperty<span style="color: #663366;">&#40;</span>name:*<span style="color: #663366;">&#41;</span>:*<span style="color: #663366;">&#123;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">		<span style="color: #669933; font-weight: bold;">this</span>._lastName = name;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">		<span style="color: #669933; font-weight: bold;">return</span> <span style="color: #669933; font-weight: bold;">null</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">	<span style="color: #663366;">&#125;</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #663366;">&#125;</span></div></li></ol></pre>
</div>
<p>Создал скрытого наследника <code>flash.utils.Proxy</code> исключительно для целей конвертации и использую его в методе <code>QNameUtils.setAttribute</code>.</p>
<p>В общем, встречайте <a href="http://actualwave.com/lab/as3/aw/utils/QNameUtils.as">aw.utils.QNameUtils</a>, класс для работы со скрытым ключом атрибута в экземплярах QName.</p>
<p>Вот небольшой пример его работы:</p>
<div class="more_syntax">
<pre class="actionscript3"><ol><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #006600; font-weight: bold;">import</span> aw.<span style="color: #006600;">utils</span>.<span style="color: #006600;">QNameUtils</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #006699; font-weight: bold;">var</span> name:<span style="color: #0000cc; font-weight: bold;">QName</span>;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #006699; font-weight: bold;">var</span> <span style="color: #0000cc; font-weight: bold;">xml</span>:<span style="color: #0000cc; font-weight: bold;">XML</span> = &lt;node attr=<span style="color: #ff33cc; font-style: italic;">&quot;value&quot;</span>/&gt;;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">name = <span style="color: #0000cc; font-weight: bold;">xml</span>.@attr.<span style="color: #006600;">name</span><span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>; <span style="color: #808080; font-style: italic;">// получаем имя атрибута</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000cc; font-weight: bold;">trace</span><span style="color: #663366;">&#40;</span>QNameUtils.<span style="color: #006600;">isAttribute</span><span style="color: #663366;">&#40;</span>name<span style="color: #663366;">&#41;</span><span style="color: #663366;">&#41;</span>; <span style="color: #808080; font-style: italic;">// true</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">name = <span style="color: #0000cc; font-weight: bold;">new</span> <span style="color: #0000cc; font-weight: bold;">QName</span><span style="color: #663366;">&#40;</span><span style="color: #ff33cc; font-style: italic;">''</span>, <span style="color: #ff33cc; font-style: italic;">'attr'</span><span style="color: #663366;">&#41;</span>; <span style="color: #808080; font-style: italic;">// создаём обычный экземпляр QName</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000cc; font-weight: bold;">trace</span><span style="color: #663366;">&#40;</span><span style="color: #0000cc; font-weight: bold;">xml</span>.@<span style="color: #663366;">&#91;</span>name<span style="color: #663366;">&#93;</span><span style="color: #663366;">&#41;</span>; <span style="color: #808080; font-style: italic;">// value</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;">name = QNameUtils.<span style="color: #006600;">create</span><span style="color: #663366;">&#40;</span><span style="color: #ff33cc; font-style: italic;">''</span>, <span style="color: #ff33cc; font-style: italic;">'attr'</span>, <span style="color: #669933; font-weight: bold;">true</span><span style="color: #663366;">&#41;</span>; <span style="color: #808080; font-style: italic;">// создаём экземпляр QName для атрибута</span></div></li><li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;"><div style="font-size:12px; font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #0000cc; font-weight: bold;">trace</span><span style="color: #663366;">&#40;</span><span style="color: #0000cc; font-weight: bold;">xml</span><span style="color: #663366;">&#91;</span>name<span style="color: #663366;">&#93;</span><span style="color: #663366;">&#41;</span>; <span style="color: #808080; font-style: italic;">// value </span></div></li></ol></pre>
</div>
<p>Как видите, нет необходимости хранить информацию о происхождении отдельно или указывать при запросе – можно в один способ запросить узел и атрибут по динамическому имени без дополнительных хранилищ данных, ведь всё хранится прямо в экземпляре QName. А вопрос сериализации QName с ключом пусть ляжет на конкретного разработчика в конкретном случае , если кто решит воспользоваться.</p>
]]></content:encoded>
			<wfw:commentRss>http://actualwave.com/blog/?feed=rss2&amp;p=309</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>flash.utils.Proxy и Object.constructor</title>
		<link>http://actualwave.com/blog/?p=298</link>
		<comments>http://actualwave.com/blog/?p=298#comments</comments>
		<pubDate>Mon, 04 Jan 2010 17:45:09 +0000</pubDate>
		<dc:creator>actual_wave</dc:creator>
				<category><![CDATA[ActionScript 3]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[constructor]]></category>
		<category><![CDATA[flash.utils.Proxy]]></category>
		<category><![CDATA[flash.utils.Proxy Proxy Object.constructor]]></category>
		<category><![CDATA[Object.constructor]]></category>
		<category><![CDATA[Proxy]]></category>

		<guid isPermaLink="false">http://actualwave.com/blog/?p=298</guid>
		<description><![CDATA[Небольшой совет для всех кто активно использует или собирается использовать класс flash.utils.Proxy – всегда реализуйте свойство constructor возвращающее тип(экземпляр типа Class) данного объекта.

Это свойство есть у всех объектов расширяющих Object класс, но природа наследников flash.utils.Proxy такова, что любой «получить значение свойства» запрос проходит через метод flash_proxy::getProperty(), кроме тех случаев, когда запрашивается свойство или поле описаное [...]]]></description>
			<content:encoded><![CDATA[<p>Небольшой совет для всех кто активно использует или собирается использовать класс <code>flash.utils.Proxy</code> – всегда реализуйте свойство <code>constructor</code> возвращающее тип(экземпляр типа <code>Class</code>) данного объекта.</p>
<p><span id="more-298"></span></p>
<p>Это свойство есть у всех объектов расширяющих <code>Object</code> класс, но природа наследников <code>flash.utils.Proxy</code> такова, что любой «получить значение свойства» запрос проходит через метод <code>flash_proxy::getProperty()</code>, кроме тех случаев, когда запрашивается свойство или поле описаное в наследнике  <code>flash.utils.Proxy</code>. Поэтому если не описать это свойство вовремя – при запросе происходит вызов метода <code>flash_proxy::getProperty()</code>, а дальше приходит неизвестность, т.е. вы теряете очень важную и полезную особенность присущую обычным объектам т.к. наиболее быстрый и правильный способ узнать тип объекта, это обратиться к свойству <code>constructor</code> любого объекта. </p>
<p>Я обычно описываю это свойство двумя способами:</p>
<p>Для абстрактного класса:</p>
<div class="more_syntax">
<pre class="actionscript3"><span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">class</span> AbstractWrapper <span style="color: #006699; font-weight: bold;">extends</span> <span style="color: #0000cc; font-weight: bold;">Proxy</span><span style="color: #663366;">&#123;</span>
	…
	<span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">function</span> <span style="color: #006699; font-weight: bold;">get</span> constructor<span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>:<span style="color: #006699; font-weight: bold;">Class</span><span style="color: #663366;">&#123;</span>
		<span style="color: #669933; font-weight: bold;">return</span> getDefinitionByName<span style="color: #663366;">&#40;</span>getQualifiedClassName<span style="color: #663366;">&#40;</span><span style="color: #669933; font-weight: bold;">this</span><span style="color: #663366;">&#41;</span><span style="color: #663366;">&#41;</span> <span style="color: #0000cc; font-weight: bold;">as</span> <span style="color: #006699; font-weight: bold;">Class</span>;
	<span style="color: #663366;">&#125;</span></pre>
</div>
<p>В таком случае не будет ошибки, если в дочернем классе забыть переписать этот метод. <img src='http://actualwave.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>А для конкретного класса:</p>
<div class="more_syntax">
<pre class="actionscript3">;public <span style="color: #006699; font-weight: bold;">class</span> Wrapper <span style="color: #006699; font-weight: bold;">extends</span> <span style="color: #0000cc; font-weight: bold;">Proxy</span><span style="color: #663366;">&#123;</span>
	…
	<span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">function</span> <span style="color: #006699; font-weight: bold;">get</span> constructor<span style="color: #663366;">&#40;</span><span style="color: #663366;">&#41;</span>:<span style="color: #006699; font-weight: bold;">Class</span><span style="color: #663366;">&#123;</span>
		<span style="color: #669933; font-weight: bold;">return</span> Wrapper;
	<span style="color: #663366;">&#125;</span></pre>
</div>
<p>Можно, конечно и так:</p>
<div class="more_syntax">
<pre class="actionscript3"><span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">class</span> Wrapper <span style="color: #006699; font-weight: bold;">extends</span> <span style="color: #0000cc; font-weight: bold;">Proxy</span><span style="color: #663366;">&#123;</span>
	…
	<span style="color: #66cccc; font-weight: bold;">public</span> <span style="color: #006699; font-weight: bold;">const</span> constructor:<span style="color: #006699; font-weight: bold;">Class</span> = Wrapper;
	<span style="color: #663366;">&#125;</span></pre>
</div>
<p>Но, чревато последствиями, если класс не обозначить как final – при наследовании нет возможности изменить значение константы.</p>
]]></content:encoded>
			<wfw:commentRss>http://actualwave.com/blog/?feed=rss2&amp;p=298</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Server-Side ActionScript — полная русская версия справки</title>
		<link>http://actualwave.com/blog/?p=283</link>
		<comments>http://actualwave.com/blog/?p=283#comments</comments>
		<pubDate>Wed, 09 Dec 2009 16:15:48 +0000</pubDate>
		<dc:creator>actual_wave</dc:creator>
				<category><![CDATA[Новости]]></category>
		<category><![CDATA[Flash Media Server]]></category>
		<category><![CDATA[FMS]]></category>
		<category><![CDATA[Server-Side ActionScript]]></category>
		<category><![CDATA[перевод]]></category>
		<category><![CDATA[русский]]></category>
		<category><![CDATA[справка]]></category>

		<guid isPermaLink="false">http://actualwave.com/blog/?p=283</guid>
		<description><![CDATA[Полный перевод на русский язык справки по Flash Media Server 3.5 Server-Side ActionScript. Круглосуточно   доступен онлайн по адресу http://ruslanshestopal.com/flashmediaserver
]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.adobe.com/devnet/images/160x160/flashmediaserver_cs4.jpg" width="80" height="80" hspace="20" align="left"/>Полный перевод на русский язык справки по Flash Media Server 3.5 Server-Side ActionScript. Круглосуточно   доступен онлайн по адресу <br><a href="http://ruslanshestopal.com/flashmediaserver" title="Flash Media Server 3.5 Server-Side ActionScript на русском" target="_self">http://ruslanshestopal.com/flashmediaserver</a></p>
]]></content:encoded>
			<wfw:commentRss>http://actualwave.com/blog/?feed=rss2&amp;p=283</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
