<?xml version="1.0" encoding="UTF-8"?><rss version="0.92">
<channel>
	<title>FlashImp</title>
	<link>http://flashimp.ru</link>
	<description>Flash Implosion new generation</description>
	<lastBuildDate>Fri, 30 Dec 2011 10:55:53 +0000</lastBuildDate>
	<docs>http://backend.userland.com/rss092</docs>
	<language>en</language>
	<!-- generator="WordPress/3.2.1" -->

	<item>
		<title>Структуры данных: MagicObject</title>
		<description><![CDATA[source:

<em>Название MagicObject, имхо, явно лучше E4XMap и подобных названий.</em>

<strong>Intro.</strong>

В играх я частенько использую машины состояний и сложные структуры данных (коллекции, карты..) , сильно упрощающие разработку. Что актуально, кстати, не только для игр, но для риа вообще.

Сегодня хочу поделиться простенькой реализацией e4x в Объекте, где основной фишкой является расширение нативного e4x, который не позволяет callDescendants.

Например вот так:
<pre lang="actionscript3">object..method(args)</pre>
<strong>Зачем это нужно?</strong>
Допустим, дано:
- StateMachine и сложное дерево состояний;
- Анимация игрового объекта завязана на состояния, точнее, на смены состояний;
- Есть VO (ValueObjects) и есть рендеры, которые визуализируют изменения в VO;
- Рендеры имеют сложную иерархию, уровни вложенности.

<strong>Как происходит</strong> изменение состояния и отображение изменений при использовании MagicObject:
- Изменяем состояние в StateMachine;
- При удачном изменении состояния обновляем данные в VO;
- Вызываем обновление во всех рендерах внутри игрового уровня:
<pre lang="actionscript3">// magic = MagicObject instance
// magic[keyA] = Renderer instance
// magic[keyB] = Renderer instance
// magic[keyB][keyC] = Renderer instance - sub-renderer
// magic.subMagic.[keyD] = Renderer instance - sub-renderer
(magic..update)();
// или так:
(magic..update)(magic.changes);</pre>
Метод update() вызовется последовательно у всех объектов, имеющих этот метод.

<strong>Поясню как работает:</strong>
magic..update достаёт со всех уровней вложенности значения всех полей с именем update. Если там есть экземпляры класса Function, то всё это хозяйство оборачивается noname-фукцией, а ей задаются все свойства массива (для итеративного пробега) и пары, типа ключ-значение, где значение - каждое найденое поле с именем update.
<strong>На примере:</strong>
<pre lang="actionscript3">const result:Object = magic..update;
// можно вызвать:
result(); // or result(args);
// можно получить определённый элемент:
for(var key:String in magic)
	trace('in', magic, ':', key, '=', magic[key]),
	// или вызвать:
	magic[key] is Function &#038;& magic[key]();</pre>
<strong>History tracking:</strong>
<pre lang="actionscript3">const magic:MagicObject = new MagicObject();
magic.x = 0;
magic.x = 1;
 
// вернёт все изменения на первом уровней вложенности:
trace(magic.changes); // :Vector.<MagicNode>
 
// вернёт все изменения на всех уровнях вложенности:
trace(magic..changes); // [:Vector.<MagicNode>,..] или Vector.<MagicNode> если элемент один.
 
// чистим историю изменений:
magic.clearChanges();
// or magic..clearChanges();</pre>
<strong>Уведомления об изменениях:</strong>
Создали экземпляр:
<pre lang="actionscript3"> const magic:MagicObject = new MagicObject();</pre>
Дали ссылку на колбэк:
<pre lang="actionscript3">magic.notificationCallback = function():void
	{
		trace('new changes:', magic.changes);
	}</pre>
или так:
<pre lang="actionscript3">magic.notificationCallback = function(changes:Vector.<MagicNode>):void
	{
		trace('new changes:', changes);
	}</pre>
сдели какие-то изменения:
<pre lang="actionscript3"> magic.x = 0;
magic.x = 1;</pre>
.. и мы сразу получаем эти изменения в колбэк.

<a title="on BitBucket" href="https://bitbucket.org/Aleksandr_Kozlovskij/data-utils/src/fe542ffd764c/src/ru/kozlovskij/utils/data/MagicObject.as">Собственно сам класс лежит здесь.</a>

Вот <strong>пример расширения на деле:</strong>
<pre lang="actionscript3">package ru.kozlovskij.game.objects.data
{
	import ru.kozlovskij.utils.data.MagicNode;
	import ru.kozlovskij.utils.data.MagicObject;
 
	/**
	 * @author Aleksandr Kozlovskij (created: Dec 27, 2011)
	 */
	public dynamic class GameObjectData extends MagicObject
	{
		protected static const PRIVATE_ACCESSOR_PREFIX:String = '_';
 
		private var _notificationCallback:Function;
 
		//------------ constructor ------------//
 
		public function GameObjectData()
		{
			super();
			super.notificationCallback = __notificationCallback;
		}
 
		//------------ initialize ------------//
 
		//--------------- ctrl ---------------//
 
		//------------ get / set -------------//
 
		public function get selected():Boolean
		{
			return this._selected;
		}
 
		public function set selected(value:Boolean):void
		{
			this._selected = value;
		}
 
 
		override public function get notificationCallback():Function
		{
			return _notificationCallback;
		}
 
		override public function set notificationCallback(value:Function):void
		{
			_notificationCallback = value;
		}
 
		//------- handlers / callbacks -------//
 
		protected function __notificationCallback(changes:Vector.<MagicNode>):void
		{
			const ns:Namespace = nodeResetNS;
			for each(var node:MagicNode in changes)
			{
				const property:String = node.public::property;
				if(property.charAt() == PRIVATE_ACCESSOR_PREFIX)
					node.ns::property = property.substr(1);
			}
 
			// finally:
			_notificationCallback &#038;& (_notificationCallback.length ? _notificationCallback(changes) : _notificationCallback());
		}
	}
}</pre>
Получилось несколько сумбурно и возможно что-то забыл упомянуть.
Комментарии, идеи и замечания очень приветствуются. Надеюсь, кому-то это пригодится.]]></description>
		<link>http://flashimp.ru/149</link>
			</item>
	<item>
		<title>Flex 4.6 Released</title>
		<description><![CDATA[Вчера был выпущен в паблик Flex 4.6.0 (Release).]]></description>
		<link>http://flashimp.ru/134</link>
			</item>
	<item>
		<title>TexturePacker</title>
		<description><![CDATA[Открыл для себя прекрасный генератор атласов тектур под OS X. Зовут "TexturePacker". Бесплатен. И Про-версию раздают. Фичи многообещающи.]]></description>
		<link>http://flashimp.ru/128</link>
			</item>
	<item>
		<title>Определятор статуса, типа и представления экранной клавиатуры.</title>
		<description><![CDATA[Приветствую, коллеги. Коротко о главном: В комбинации AIR + iOS + {желание работать с текстом, клавой} есть одна большая проблема - это и есть большая проблема. Нет событий от экранной клавиатуры (за некоторым исключением); Нет раздельных стилей в режиме редактирования; Нет обновлений фокуса и позиции мыши/пальца в режиме редактирования; Ещё много чего нет.. Предлагаю вам, [...]]]></description>
		<link>http://flashimp.ru/136</link>
			</item>
	<item>
		<title>Wallaby prerelease</title>
		<description><![CDATA[Вышел обещанный н MAX'e фрэймворк для конвертации Flash-контента в HTML5. На самом деле это AIR-приложение, сыренькое. Конвертируются только .FLA, состряпанные в Flash Pro CS5. Link on labs. Help.]]></description>
		<link>http://flashimp.ru/118</link>
			</item>
	<item>
		<title>Adobe Flash Player 10.3 Beta</title>
		<description><![CDATA[Flash Player 10.3 for Windows, Mac, and Linux introduces new developer features and enhanced user privacy protection, such as: Media Measurement Acoustic Echo Cancellation Integration with browser privacy control for local storage Native Control Panel Auto-Update Notification for Mac OS Link.]]></description>
		<link>http://flashimp.ru/116</link>
			</item>
	<item>
		<title>Apple снимает ограничения для Flash &#8211; разработчиков.</title>
		<description><![CDATA[Сегодня Apple сообщили, что ограничения в использовании средств разработки под iOS будут сняты. "Мы снимаем все ограничения которые касаются средств разработки используемые для создания приложений под iOS, запрещенным остается только загрузка дополнительного кода созданным приложением. Это предоставит разработчикам больше свободы в выборе инструментов, в которых они нуждаются. В то же время безопасность приложений останется на [...]]]></description>
		<link>http://flashimp.ru/114</link>
			</item>
	<item>
		<title>I&#8217;m alive. FlashImp too.</title>
		<description><![CDATA[В последнее время я сильно погряз в болоте работы, сроки сдачи которой давно проебал. Собственно, в болоте этом я сижу все время, но обычно не больше чем по колено, а тут накрывает с головой. Тем не менее, я отчаянно барахтаюсь в попытке выбраться из отвратительной трясины лени и безответственности. В скором времени начну выкладывать некоторые [...]]]></description>
		<link>http://flashimp.ru/112</link>
			</item>
	<item>
		<title>It&#8217;s Adobe :) LOL</title>
		<description><![CDATA[download link]]></description>
		<link>http://flashimp.ru/107</link>
			</item>
	<item>
		<title>UINativeWindow</title>
		<description><![CDATA[package ru.kozlovskij.air &#123; import flash.display.DisplayObject; import flash.display.DisplayObjectContainer; import flash.display.NativeWindow; import flash.display.NativeWindowInitOptions; import flash.events.Event; &#160; import mx.core.IUIComponent; import mx.events.FlexEvent; import mx.managers.WindowedSystemManager; &#160; /** * Composition of &#60;code&#62;NativeWindow&#60;/code&#62; and &#60;code&#62;IUIComponent&#60;/code&#62;. * * @author Aleksandr.Kozlovskiy */ public class UINativeWindow extends NativeWindow &#123; protected var systemManager:WindowedSystemManager; protected var childDisplayObject:IUIComponent; protected var rootDisplayObject:IUIComponent; &#160; /** * After initialization &#60;code&#62;childDisplayObject&#60;/code&#62; added [...]]]></description>
		<link>http://flashimp.ru/101</link>
			</item>
	<item>
		<title>Creative Suite 5 to launch on April 12th</title>
		<description><![CDATA[Ура, товарищи! Ждёмс..]]></description>
		<link>http://flashimp.ru/99</link>
			</item>
	<item>
		<title>Emergency Flash Platform World Help</title>
		<description><![CDATA[Приветствую, дамы и господа разработчики! Обращаюсь к тем членам нашего комьюнити, ощущающих острую нехватку "огонька" и денюшек, - экстрима в общем. Все желающие участвовать в интересных и не очень, но чрезвычайно горячих проектах, в качестве скорой программерской помощи - милости прошу (мыло в конце поста). Меня в первую очередь интересуют реально крутые монстры своего ремесла [...]]]></description>
		<link>http://flashimp.ru/94</link>
			</item>
	<item>
		<title>Book: &#8220;Hello! Flex 4&#8243;</title>
		<description><![CDATA[На заграничных прилавках появилась первая книжка про Flex 4: "Hello! Flex 4". Автор: Peter Armstrong. PDF ebook стоит $22.50.]]></description>
		<link>http://flashimp.ru/90</link>
			</item>
	<item>
		<title>Package Assistant (public alpha)</title>
		<description><![CDATA[Serge Jespers опубликовал Package Assistant, о котором писал ранее. Текущая версия: "public alpha". Скачать можно тут (.dmg). Это AIR2-приложение представляет из себя некоего "помощника" для сборки приложений с нативными (встроенными) инсталяторами. Эти самые инсталяторы - есть одна из фич AIR2. Так вот, чтобы воспользоваться этой вкусняжкой, приходилось иметь дело с ADT (command line compiler) , [...]]]></description>
		<link>http://flashimp.ru/85</link>
			</item>
	<item>
		<title>Анонс Flash Platform Game Technology Center</title>
		<description><![CDATA[Позитивная новость для геймдива: В полку сервисов всеми любимой Adobe прибыло. Точнее, прибудет. Adobe анонсировала открытие Flash Platform Game Technology Center - ресурса для разработчиков игр на Flash Platform. Украдено у Алексея Яковенко. UPD: Только что на девнете была опубликована статья Danielle Deibler Introducing the Adobe Flash Platform Gaming.]]></description>
		<link>http://flashimp.ru/80</link>
			</item>
</channel>
</rss>

