tag:blogger.com,1999:blog-3932136248111191992024-03-05T03:39:02.502-08:00Flash-разработка. Чужая тетрадьНезаметно подглядываем, аккуратно списываем, вежливо заимствуем, откровенно сдираем, бессовестно тырим, нагло плагиатствуем и... <br/>
говорим БОЛЬШОЕ СПАСИБО.Anonymoushttp://www.blogger.com/profile/13778770709453656580noreply@blogger.comBlogger34125tag:blogger.com,1999:blog-393213624811119199.post-11312654702828411622009-10-03T08:27:00.000-07:002009-10-03T08:28:42.099-07:00Реализация стирания для объектов Bitmap// И рисования<span class="Apple-style-span" style=" ;font-family:arial, sans-serif;font-size:12px;"><div><a href="http://groups.google.com/group/ruflash/browse_thread/thread/337ed59ee54347a0?hl=ru">Оригинал</a>.</div><div><br /></div>Кисть:<br /><p>brush = new BitmapData(star_mc.width, star_mc.height,true,0);<br />brush.draw(star_mc);<br /></p><p>Бумага (холст):<br /></p><p>paper = new BitmapData(800, 600, true, 0);<br />addChild(new Bitmap(paper));<br /></p><p>Рисуем:<br /></p><p>var m:Matrix = new Matrix();<br />m.translate(mouseX, mouseY);<br />paper.draw(brush, m);<br /></p><p>Стираем:<br /></p><p>var m:Matrix = new Matrix();<br />m.translate(mouseX, mouseY);<br />paper.draw(brush, m, null, BlendMode.ERASE); </p></span>Anonymoushttp://www.blogger.com/profile/13778770709453656580noreply@blogger.com0tag:blogger.com,1999:blog-393213624811119199.post-11470458341218849702009-08-20T02:39:00.001-07:002009-08-20T02:40:33.901-07:00Рендеринг поверхностей во Flash. // Отличный обзор<a href="http://bruce-lab.blogspot.com/2009/01/terrain-rendering-in-flash.html">http://bruce-lab.blogspot.com/2009/01/terrain-rendering-in-flash.html</a>Anonymoushttp://www.blogger.com/profile/13778770709453656580noreply@blogger.com0tag:blogger.com,1999:blog-393213624811119199.post-49104352496283267922009-07-21T23:26:00.000-07:002009-07-21T23:28:49.708-07:00Пишем музыку на FlashPlayer 10 //Пример генерирует музыку<a href="http://kutu182.wordpress.com/2008/08/27/15/" rel="bookmark">Оригинал</a>. <a href="http://kutu182.wordpress.com/">kutu</a>Anonymoushttp://www.blogger.com/profile/13778770709453656580noreply@blogger.com0tag:blogger.com,1999:blog-393213624811119199.post-87101273220970029992009-05-31T11:26:00.000-07:002009-05-31T11:31:11.641-07:00Загрузка изображений в TextField, в виде строки Base64, встроенной в HTML код // Важно!<a href="http://actualwave.com/blog/?p=227">Оригинал</a>. <a href="http://actualwave.com/blog/">a_[w] блог</a><br /><br />У многих браузеров есть классная особенность - они умеют отображать картинки из строки кодированной в <a href="http://ru.wikipedia.org/wiki/Base64">Base64</a>. Такие изображения отличаются только содержимым атрибута SRC:<br /><img src="data:image/png;base64,iVBORw0KGgoAAAANS..." alt="Изображение" /><br /><br />Мне стало интересно провернуть такой же трюк в TextField'е во Flash приложении.<br /><br />Получив HTML код с таким, кодированым в Base64, изображением, его необходимо вырезать из HTML, раскодировать и загрузить вручную в HTML код.<br />Вот, собственно, код с пояснениями: ....Anonymoushttp://www.blogger.com/profile/13778770709453656580noreply@blogger.com0tag:blogger.com,1999:blog-393213624811119199.post-6220480896253715512009-02-18T23:04:00.000-08:002009-02-18T23:06:50.549-08:00<a href="http://vapes.na.by/blog/?entry=entry090218-210147">Оригинал</a>. <a href="http://vapes.na.by/blog/">No Title flash</a>.<br /><br />Как отформатировать размер файла<br />Для этой задачи я взял пример кода из интернета и переписал под Action Script 3. Получился метод который всегда выводит размер файла 4 значным числом, будь то 1,234 или 1000 и приставку kb, Mb, и т.д.<br /><br /><br />private function formatSizeValue( size : Number) : String<br />{<br /><br />//Эти переменные лучше всего вынести в константы и, как вы догадались, они равты колличеству байт.<br /><br />var longPB : Number = 1024 * 1024 * 1024 * 1024 * 1024;<br />var longTB : Number = 1024 * 1024 * 1024 * 1024;<br />var longGB : Number = 1024 * 1024 * 1024;<br />var longMB : Number = 1024 * 1024;<br />var longKB : Number = 1024;<br /><br />var byteSize : String;<br />var displayNumber : Number;<br /><br />Дальше выбикаем величину, в которой будем показывать размер<br /><br />if (size >= longPB)<br />{<br />displayNumber = size / longPB;<br />byteSize = "Pb";<br />}<br />else if (size >= longTB)<br />{<br />displayNumber = size / longTB;<br />byteSize = "Tb";<br />}<br />else if (size >= longGB)<br />{<br />displayNumber = size /longGB;<br />byteSize = "Gb";<br />}<br />else if (size >= longMB)<br />{<br />displayNumber = size /longMB;<br />byteSize = "Mb";<br />}<br />else if (size >= longKB)<br />{<br />displayNumber = size / longKB;<br />byteSize = "kb";<br />}<br />else<br />{<br />displayNumber = size;<br />byteSize = "bytes";<br />}<br /><br />// А здесь попрошу обратить внимание на метод toPrecision(n : int), вот он и делает число n значным, с округлением. Подробнее - читайте хелп :)<br /><br />return displayNumber.toPrecision(4).toString() + ' ' + byteSize;<br /><br />}<br /><br /><br />Как обнаружить, что файл был удален, или перемещен<br />Столкнулся с проблемкой что пользователь, открыв окошко для выбора файлов, начинает там наводить порядок. И бывали случаи когда этот файл был уже добавлен в список претендентов на закачку. И естественно, нажав upload происходил креш приложения.<br />Для этого я написал след метод:<br /><br /><br />private var _fr : FileReference;<br /><br />public function get size() : uint<br />{<br /><br />// Если фал был удален, то обращение к полю size у FileReference будет выдавать ошибку. Вот тут я и воспользовался try/catch<br /><br />try {<br />return _fr.size;<br />}<br />catch(error : Error) {<br />dispatchEvent(new Event('itemWasDeleted') );<br />isError = true;<br />return 0;<br />}<br />return _fr.size;<br />}<br /><br /><br />Как раскрасить элементы листа в зависимости от местоположения<br />На этот вопрос развелась бурная дискуссия в чате UAFPUG. Внутри itemRenderer я изобрел след. велосипед:<br /><br /><br />return List(owner).itemRendererToIndex(this) % 2 ? 0xCCCCCC : 0xFFFFFF;<br /><br />Rostislav Siryk: Тут лист используется только как ссылка на метод получения индекса из провайдера.<br /><br />Если делать так, чтобы всего лишь разукрасить фон под itemRenderer - то лучше применить стиль alternatingItemColors. Но если вам нужно будет разукрасить внутренние компоненты, или сдвинуть их, то этот метод оптимальный.<br /><br /><br />Как получить ответ от сервера<br />Для этого я подсмотрел рецепт у http://flexcookbook.ru/ а именно: этот пост.<br /><br />В интернете довольно много примеров по тому, как использовать FileReference для отправки файла на сервер, но мало где поясняется, как же все-таки отследить дальнейшую судьбу файла. Ведь событие Event.COMPLETE возникает всего лишь при удачной отправке файла на сервер. Как узнать, удалось ли вашему серверному приложению корректно обработать файл. Есть еще очень хорошее событие DataEvent.UPLOAD_COMPLETE_DATA которое возникает, если сервер вернул какие-то данные.<br /><br />Итак, на COMPLETE у меня высвечивается Processing... а на UPLOAD_COMPLETE_DATA я выставляю галочку, что файл зааплодился успешно, и запрашиваю к нему путь через веб сервис.<br /><br />Ну и напосдедок скажу, что отвечу на любые вопросы в комментариях :)Anonymoushttp://www.blogger.com/profile/13778770709453656580noreply@blogger.com0tag:blogger.com,1999:blog-393213624811119199.post-30553184735250488462008-12-27T03:01:00.000-08:002008-12-27T03:04:15.838-08:00AS3 Удаление объекта //Хак<a href="http://groups.google.com/group/ruFlash/browse_thread/thread/70d062d31cd19c37/15e37f261b42707b?show_docid=15e37f261b42707b&pli=1#">AS3 Удаление объекта</a>. <a class="ln" href="http://groups.google.com/group/ruFlash">ruFlash</a><br /><br />Nox Noctis:<br /><br />Хак с двумя локалконнекшнами рассказал Грант Скиннер еще в 2006 году.<br />Гуглом можно найти. Как он дошел до жизни такой -- неведомо, но это<br />работает.<br /><code><br />try {<br />new LocalConnection().connect("gc");<br />new LocalConnection().connect("gc");<br />} catch (error:Error) {<br />// ignore<br />}<br /></code><br /><br />Это заставит GC запустится. Однако, стоит учитывать, что за один проход<br />коллектор может и не собрать весь мусор (никто этого и не обещал).<br /><br />> Есть ещё метод gc(), но он работает только в Debug версии<br />> проигрывателя.<br /><br />Кстати в AIR работает и в недебаговой версии, если контент, который<br />запускает System.gc() находится в песочнице установленного AIR-приложения.Anonymoushttp://www.blogger.com/profile/13778770709453656580noreply@blogger.com1tag:blogger.com,1999:blog-393213624811119199.post-57312071834804856172008-11-09T11:55:00.000-08:002008-11-09T12:03:09.117-08:00Шаблон Модель-Представление-Контроллер<a href="http://fla-master.livejournal.com/4200.html#cutid1">Шаблон Модель-Представление-Контроллер.</a> <a href="http://www.livejournal.com/users/fla_master/">fla_master</a><a href="http://fla-master.livejournal.com/4200.html#cutid1"> </a><br /><br />Продолжение статьи: <a href="http://racer242spy.blogspot.com/2008/11/blog-post.html">Что такое шаблон Модель-Представление-Контроллер?</a><br /><br /><div class="entrycontent"><br /><div style="FONT-SIZE: 12px; WIDTH: 450px; FONT-FAMILY: 'Trebuchet MS'"><br />SRC:<br />O’Rеillу. ActionScript 3.0 Design Patterns.<br />Глава 12. Model-View-Controller Pattern.<br /><br />Продолжение. <a href="http://fla-master.livejournal.com/3972.html#cutid1">См. начало главы об MVC</a><br /><br /><a name="cutid1"></a><br /><br /><b><span style="font-size:78%;">Создание вложенных Представлений</span></b><br /><br />Для демонстрации вложенных Представлений мы создадим узел составного Представления и два дочерних компонента, как показано на Рисунке 12-2.<br /><br /><img id="BLOGGER_PHOTO_ID_5266749686807199794" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: hand; HEIGHT: 231px; TEXT-ALIGN: center" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgukTwf9jFxrMOhlRVQkb9T6mAapKvbls5wzgLkpiDC16SpuinX6Q-jkvxqJGh2qBHOpSgSelHAjeEKKbclf5qFoQ-porrM2gg-ZBmJkvlawYb0HtdU_5gikuWxUQ-AL-I6TUJG7vnsh_g/s400/mvc_nested_views.gif" border="0" /><br /><br /><i>Рисунок 12-2. Структура вложенных Представлений в минималистичном примере</i><br /><br /><br />Сначала мы создадим составное Представление под названием RootNodeView. Это составное Представление будет получать ввод с клавиатуры от сцены. Это Представление также зарегистрируется для получения уведомлений об обновлении от Модели. Составное Представление RootNodeView обзаведется двумя дочерними компонентами: CharCodeLeafView и AsciiCharLeafView. CharCodeLeafView будет отслеживать код последнего введенного с клавиатуры символа. AsciiCharLeafView будет отслеживать ASCII-символ, соответствующий этому коду символа. Давайте сначала создадим составное Представление, как показано в Примере 12-9.<br /><br /><i>Пример 12-9. RootNodeView.as</i><br /><br /><br /><div style="PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; WIDTH: 462px"><pre class="actionscript">package <span style="color:#66cc66;">{</span><br /><br /> <span style="color:#0066cc;">import</span> flash.<span style="color:#006600;">events</span>.<span style="color:#006600;">*</span>;<br /><br /> <span style="color:#0066cc;">import</span> flash.<span style="color:#006600;">display</span>.<span style="color:#006600;">*</span>;<br /><br /><br /><br /> <span style="color:#0066cc;">public</span> <span style="FONT-WEIGHT: bold;color:#000000;" >class</span> RootNodeView <span style="color:#0066cc;">extends</span> CompositeView <span style="color:#66cc66;">{</span><br /><br /><br /><br /> <span style="color:#0066cc;">public</span> <span style="FONT-WEIGHT: bold;color:#000000;" >function</span> RootNodeView<span style="color:#66cc66;">(</span>aModel:IModel,aController:<span style="color:#0066cc;">Object</span>=<span style="FONT-WEIGHT: bold;color:#000000;" >null</span><span style="color:#66cc66;">)</span> <span style="color:#66cc66;">{</span><br /><br /> <span style="color:#0066cc;">super</span><span style="color:#66cc66;">(</span>aModel,aController<span style="color:#66cc66;">)</span>;<br /><br /> <span style="FONT-STYLE: italic;color:#808080;" >// подписывается на получение событий нажатий клавиш от сцены</span><br /><br /> <span style="color:#0066cc;">target</span>.<span style="color:#006600;">addEventListener</span><span style="color:#66cc66;">(</span>KeyboardEvent.<span style="color:#006600;">KEY_DOWN</span>,<span style="color:#0066cc;">this</span>.<span style="color:#006600;">onKeyPress</span><span style="color:#66cc66;">)</span>;<br /><br /> <span style="color:#66cc66;">}</span><br /><br /><br /><br /> <span style="color:#0066cc;">private</span> <span style="FONT-WEIGHT: bold;color:#000000;" >function</span> onKeyPress<span style="color:#66cc66;">(</span>event:KeyboardEvent<span style="color:#66cc66;">)</span>:<span style="color:#0066cc;">void</span> <span style="color:#66cc66;">{</span><br /><br /> <span style="FONT-STYLE: italic;color:#808080;" >// передается на обработку в Контроллер (Стратегия)</span><br /><br /> controller as IKeyboardInputHandler.<span style="color:#006600;">keyPressHandler</span><span style="color:#66cc66;">(</span>event<span style="color:#66cc66;">)</span>;<br /><br /> <span style="color:#66cc66;">}</span><br /><br /><br /><br /> <span style="color:#66cc66;">}</span><br /><br /><span style="color:#66cc66;">}</span></pre></div><br /><br />Класс RootNodeView, показанный в Примере 12-9, расширяет класс CompositeView. Он не отрисовывает пользовательский интерфейс, а просто слушает события нажатия клавиш и передает их на обработку Контроллеру. Обратите внимание на присутствие super в конструкторе, что требуется для вызова конструктора родителя класса. А теперь мы можем создать два компонентных Представления (Примеры 12-10 и 12-11).<br /><br /><i>Пример 12-10. CharCodeLeafView.as</i><br /><br /><br /><div style="PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; WIDTH: 471px"><pre class="actionscript">package <span style="color:#66cc66;">{</span><br /><br /> <span style="color:#0066cc;">import</span> flash.<span style="color:#006600;">events</span>.<span style="color:#006600;">Event</span>;<br /><br /><br /><br /> <span style="color:#0066cc;">public</span> <span style="FONT-WEIGHT: bold;color:#000000;" >class</span> CharCodeLeafView <span style="color:#0066cc;">extends</span> ComponentView <span style="color:#66cc66;">{</span><br /><br /><br /><br /> <span style="color:#0066cc;">public</span> <span style="FONT-WEIGHT: bold;color:#000000;" >function</span> CharCodeLeafView<span style="color:#66cc66;">(</span>aModel:IModel,aController:<span style="color:#0066cc;">Object</span>=<span style="FONT-WEIGHT: bold;color:#000000;" >null</span><span style="color:#66cc66;">)</span> <span style="color:#66cc66;">{</span><br /><br /> <span style="color:#0066cc;">super</span><span style="color:#66cc66;">(</span>aModel,aController<span style="color:#66cc66;">)</span>;<br /><br /> <span style="color:#66cc66;">}</span><br /><br /><br /><br /> override <span style="color:#0066cc;">public</span> <span style="FONT-WEIGHT: bold;color:#000000;" >function</span> update<span style="color:#66cc66;">(</span>event:Event=<span style="FONT-WEIGHT: bold;color:#000000;" >null</span><span style="color:#66cc66;">)</span>:<span style="color:#0066cc;">void</span> <span style="color:#66cc66;">{</span><br /><br /> <span style="FONT-STYLE: italic;color:#808080;" >// получить данные от Модели и обновление Представления</span><br /><br /> <span style="color:#0066cc;">trace</span><span style="color:#66cc66;">(</span>model.<span style="color:#006600;">getKey</span><span style="color:#66cc66;">(</span><span style="color:#66cc66;">)</span><span style="color:#66cc66;">)</span>;<br /><br /> <span style="color:#66cc66;">}</span><br /><br /><br /><br /> <span style="color:#66cc66;">}</span><br /><br /><span style="color:#66cc66;">}</span></pre></div><br /><br /><i>Пример 12-11. AsciiCharLeafView.as</i><br /><br /><br /><div style="PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px"><pre class="actionscript">package <span style="color:#66cc66;">{</span><br /><br /> <span style="color:#0066cc;">import</span> flash.<span style="color:#006600;">events</span>.<span style="color:#006600;">Event</span>;<br /><br /><br /><br /> <span style="color:#0066cc;">public</span> <span style="FONT-WEIGHT: bold;color:#000000;" >class</span> AsciiCharLeafView <span style="color:#0066cc;">extends</span> ComponentView <span style="color:#66cc66;">{</span><br /><br /><br /><br /> <span style="color:#0066cc;">public</span> <span style="FONT-WEIGHT: bold;color:#000000;" >function</span> AsciiCharLeafView<span style="color:#66cc66;">(</span>aModel:IModel,aController:<span style="color:#0066cc;">Object</span>=<span style="FONT-WEIGHT: bold;color:#000000;" >null</span><span style="color:#66cc66;">)</span> <span style="color:#66cc66;">{</span><br /><br /> <span style="color:#0066cc;">super</span><span style="color:#66cc66;">(</span>aModel,aController<span style="color:#66cc66;">)</span>;<br /><br /> <span style="color:#66cc66;">}</span><br /><br /><br /><br /> override <span style="color:#0066cc;">public</span> <span style="FONT-WEIGHT: bold;color:#000000;" >function</span> update<span style="color:#66cc66;">(</span>event:Event=<span style="FONT-WEIGHT: bold;color:#000000;" >null</span><span style="color:#66cc66;">)</span>:<span style="color:#0066cc;">void</span> <span style="color:#66cc66;">{</span><br /><br /> <span style="FONT-STYLE: italic;color:#808080;" >// получить данные от Модели и обновление Представления</span><br /><br /> <span style="color:#0066cc;">trace</span><span style="color:#66cc66;">(</span><span style="color:#0066cc;">String</span>.<span style="color:#0066cc;">fromCharCode</span><span style="color:#66cc66;">(</span>model.<span style="color:#006600;">getKey</span><span style="color:#66cc66;">(</span><span style="color:#66cc66;">)</span><span style="color:#66cc66;">)</span><span style="color:#66cc66;">)</span>;<br /><br /> <span style="color:#66cc66;">}</span><br /><br /><br /><br /> <span style="color:#66cc66;">}</span><br /><br /><span style="color:#66cc66;">}</span></pre></div><br /><br />Оба класса компонентного Представления — CharCodeLeafView (Пример 12-10) и AsciiCharLeafView (Пример 12-11) — расширяют класс ComponentView (Пример 12-8). Обратите внимание, что они не получают пользовательского ввода. Поэтому этим двум Представлениям не требуется принимать ссылку на Контроллер в конструкторе. Ссылка на Контроллер в данном случае будет иметь значение по умолчанию null.<br /><br />Все что теперь осталось, это построить триаду MVC с вложенными Представлениями. Мы позволим клиенту строить вложенные Представления и зарегистрировать корневой узел в Модели для получения уведомлений об обновлении<br /><br /><br /><b>Построение структуры вложенных Представлений</b><br /><br />Построение структуры вложенных Представлений идентично разработке составной структуры с использованием шаблона Компоновщик. Мы можем представить себе Предсталение как дерево (расширяющееся сверху вниз) и использовать метод add() для добавление в составное Представление дочерних Представлений.<br /><br /><br /><div style="PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; WIDTH: 527px"><pre class="actionscript"><span style="FONT-WEIGHT: bold;color:#000000;" >var</span> model:IModel = <span style="FONT-WEIGHT: bold;color:#000000;" >new</span> Model<span style="color:#66cc66;">(</span> <span style="color:#66cc66;">)</span>;<br /><br /><br /><br /><span style="FONT-WEIGHT: bold;color:#000000;" >var</span> controller:IKeyboardInputHandler = <span style="FONT-WEIGHT: bold;color:#000000;" >new</span> Controller<span style="color:#66cc66;">(</span>model<span style="color:#66cc66;">)</span>;<br /><br /><br /><br /><span style="FONT-STYLE: italic;color:#808080;" >// составное Представление</span><br /><br /><span style="FONT-WEIGHT: bold;color:#000000;" >var</span> rootView:CompositeView = <span style="FONT-WEIGHT: bold;color:#000000;" >new</span> RootNodeView<span style="color:#66cc66;">(</span>model,controller, <span style="color:#0066cc;">this</span>.<span style="color:#0066cc;">stage</span><span style="color:#66cc66;">)</span>;<br /><br /><br /><br /><span style="FONT-STYLE: italic;color:#808080;" >// добавление дочерних Представлений</span><br /><br />rootView.<span style="color:#0066cc;">add</span><span style="color:#66cc66;">(</span><span style="FONT-WEIGHT: bold;color:#000000;" >new</span> CharCodeLeafView<span style="color:#66cc66;">(</span>model<span style="color:#66cc66;">)</span><span style="color:#66cc66;">)</span>;<br /><br />rootView.<span style="color:#0066cc;">add</span><span style="color:#66cc66;">(</span><span style="FONT-WEIGHT: bold;color:#000000;" >new</span> AsciiCharLeafView<span style="color:#66cc66;">(</span>model<span style="color:#66cc66;">)</span><span style="color:#66cc66;">)</span>;<br /><br /><br /><br /><span style="FONT-STYLE: italic;color:#808080;" >// подписка на получение уведомлений от Модели</span><br /><br />model.<span style="color:#006600;">addEventListener</span><span style="color:#66cc66;">(</span>Event.<span style="color:#006600;">CHANGE</span>, rootView.<span style="color:#006600;">update</span><span style="color:#66cc66;">)</span>;</pre></div><br /><br />Заметьте, что только корневое Представление регистрируется у Модели для получения событий обновления. Это объясняется тем, что корневое Представление является составным, и событие пробегает по каждой из его веток. Теперь, когда нажимается клавиша на клавиатуре, одна «дочка» выведет код символа, а другая — соотвествующий ASCII-символ. Такая много-компонентная структура будет работать при увеличении числа компонентов так же хорошо, как и в этом нашем простом минималистичном примере.<br /><br />В нашем минималистичном примере клиент строит структуру вложенных Представлений. Однако, операторы построения вложенных Представлений могли бы быть внедрены в класс RootNodeView, еще больше инкапсулируя реализацию. Сейчас корневое Представление может динамически добавлять и удалять дочерние Представления, основываясь на режиме работы приложения или пользовательских настройках. Это позволяет элементам пользовательского интерфейса приложения приобрести некоторые очень продвинутые возможности.<br /><br /><br /><b>Основные преимущества шаблона MVC</b><br /><br />Главная польза от применения шаблона MVC — это гибкость, которая упрощает построение приложений, имеющих пользовательский интерфейс. Шаблон разделяет Модель, Представление и Контроллер и прибегает к шаблонам Обозреватель, Стретегия и Компоновщик для их декомпозиции.<br /><ul><br /><li>MVC состоит из трех элементов, называемых Модель, Представление и Контроллер, которые распределяют участки ответственности в приложениях с графическим интерфейсом.<br /><br /><li>Взаимоотношение между Моделями и Представлениями представляет собой выделение Конкретного Субъекта и Конкретного Обозревателя в шаблоне Обозреватель.<br /><br /><li>Взаимоотношения между Представлениями и Контроллерами представляют собой Контекст и Конкретную Стратегию в шаблоне Стратегия.<br /><br /><li>Множественные Представления могут регистрироваться в Модели.<br /><br /><li>Представления могут быть вложенными с использованием шаблона Компоновщик для создания сложного пользовательского интерфейса, упрощая процесс обновления.</li></ul><br /><br /><br /><br /><b><i>Продолжение следует...</i></b> </div></div>Anonymoushttp://www.blogger.com/profile/13778770709453656580noreply@blogger.com1tag:blogger.com,1999:blog-393213624811119199.post-86106006632278467972008-11-09T11:38:00.000-08:002008-11-09T12:03:33.626-08:00Что такое шаблон Модель-Представление-Контроллер?<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8Dsch1vpB6obHpgk4NqXn0btazBvgNdk21FNJbaAAOXh9FfXrhofnWM9T71YzDHoGEi5DYXuVWqcUj2NOL4BRoScBJx7AHRuGhKObvrtGXkAYmne7MA7GaePOG4pHkmfGO8CbJRuYl3g/s1600-h/mvc_scheme.gif"><img id="BLOGGER_PHOTO_ID_5266748337340347202" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: hand; HEIGHT: 168px; TEXT-ALIGN: center" alt="" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8Dsch1vpB6obHpgk4NqXn0btazBvgNdk21FNJbaAAOXh9FfXrhofnWM9T71YzDHoGEi5DYXuVWqcUj2NOL4BRoScBJx7AHRuGhKObvrtGXkAYmne7MA7GaePOG4pHkmfGO8CbJRuYl3g/s400/mvc_scheme.gif" border="0" /></a><br /><div>Заимствую эту статью лишь по той причине, что на работе LJ закрыт для доступа.<br /><a href="http://fla-master.livejournal.com/3972.html">Шаблон Модель-Представление-Контроллер</a>. <a href="http://www.livejournal.com/userinfo.bml?user=fla_master"></a><a href="http://www.livejournal.com/users/fla_master/">fla_master</a><br /><br /><div class="entrycontent"><br /><div style="FONT-SIZE: 12px; WIDTH: 450px; FONT-FAMILY: 'Trebuchet MS'"><br />SRC:<br />O’Rеillу. ActionScript 3.0 Design Patterns.<br />Глава 12. Model-View-Controller Pattern.<br /><br />Начало.<br /><br /><a name="cutid1"></a><br /><b><span style="font-size:78%;">Что такое шаблон Модель-Представление-Контроллер?</span></b><br /><br />«Модель—Представление—Контроллер» (Model-View-Controller, MVC) — это составной шаблон, или несколько шаблонов, работающих совместно для реализации сложных приложений. Наиболее часто этот шаблон используется для создания интерфейсов приложений, и как следует из названия, состоит из трех элементов:<br /><br /><i>Модель</i> (Model)<br />Содержит данные и логику приложения для управления состоянием этого приложения<br /><br /><i>Представление</i> (View)<br />Реализует пользовательский интерфейс и состояние приложения, наблюдаемые на экране<br /><br /><i>Контроллер</i> (Controller)<br />Обрабатывает действия пользователя, влияющие на состояние приложения.<br /><br />Мощь шаблона MVC напрямую обуславливается разделением этих трех элементов с целью избежать пересечений зон ответственности каждого из них. Давайте посмотрим, за что отвечает каждый из элементов.<br /><br /><br /><b>Модель</b><br /><br />Модель отвечает за управление состоянием приложения. Логика приложения в модели представлена двумя важными задачами: модель отвечает на запросы относительно состояния приложения, и выполняет действия в ответ на запрос об изменении состояния.<br /><br /><b>Представление</b><br /><br />Представление — это внешний облик приложения. Пользователь взаимодействует с приложением через Представление. Приложение может содержать несколько Представлений, которые могут быть как механизмом ввода, так и механизмом вывода. Например, в портативном цифровом плеере, таком как iPod, экран устройства будет Представлением. Кнопки плеера также считаются Представлением. Экран показывает название и продолжительность песни, изображение обложки альбома, и прочее, что соотносится с текущим состоянием устройства. Представление не обязательно должно быть видимым. В портативном плеере музыка, которая играет в наушниках, также является Представлением. Например, нажатие кнопки может вызвать некоторую слышимую ответную реакцию в виде щелчка в наушниках. Изменение громкости также отражается по каналу аудио-выхода. Слышимая ответная реакция связана с состоянием приложения.<br /><br /><b>Контроллер</b><br /><br />Хотя термин Контроллер неявно подразумевает интерфейс, посредством которого управляется приложение, в шаблоне MVC Контроллер не содержит никаких элементов пользовательского интерфейса. Как говорилось выше, элементы пользовательского интерфейса, которые обеспечивают ввод, относятся к компоненту Представление. Контроллер же определяет, как Представления отзываются на ввод пользователя.<br /><br />Допустим, наш цифровой плеер имеет кнопки <i>Громче</i> и <i>Тише</i> в Представлении. Громкость звука является переменной состояния. Модель будет отслеживать эту переменную, чтобы менять значение этой переменной в соответствии с логикой приложения. Если значение громкости звука проградуировать от 0 до 10, Контроллер определит, насколько нужно прибавить или убавить звук при одиночном нажатии на одну из этих кнопок. Поведение может сообщить Модели, что нужно увеличить громкость на 0,5 или на 0,1, или любое другое значение, как задано программно. В таком ключе, Контроллер — это специфичные реализации, которые определяют, каким образом приложение ответит на ввод пользователя.<br /><br /><br />Хотя каждый элемент в триаде MVC имеет отдельную и уникальную зону ответственности, они не функционируют в изоляции. На самом деле, с тем чтобы составить шаблон MVC, каждому элементу следует коммуницировать с остальными. Что это значит, мы рассмотрим ниже.<br /><br /><br /><b><span style="font-size:78%;">Взаимодействие элементов MVC</span></b><br /><br />Каждый элемент в шаблоне MVC общается с остальными весьма специфичными способами. Коммуницирование реализуется последовательностью событий, которые обычно запускаются взаимодействием пользователя с приложением. Последовательность событий выглядит так:<br /><ol><br /><li>Пользователь взаимодействует с элементом интерфейса (например, нажимает на кнопку в Представлении).<br /><br /><li>Представление отсылает событие нажатия Контроллеру, чтобы решить, как это нажатие обработать.<br /><br /><li>Контроллер меняет Модель на основе того, что он решил относительно нажатия кнопки.<br /><br /><li>Модель информирует Представление о том, что состояние Модели изменилось.<br /><br /><li>Представление читает информацию о состоянии в Модели и самостоятельно видоизменяется.</li></ol><br /><br /><br /><i>Рисунок 12-1. Направления коммуницирования между элементами MVC</i><br /><br />Это очень простая схема того, как взаимодействуют элементы MVC. В некоторых случаях Контроллер может просто указать Представлению чтобы оно изменилось. Это единственный случай, когда изменения в Представлении становятся необходимыми из-за действий пользователя и не требуют изменений в Модели, а просто приводят к одним только визуальным изменениям. Например, вспомните о том, как пользователь выбирает песню на цифровом плеере. Он выбирает песню из списка кнопками прокрутки. Представление должно сообщить Контроллеру, что нажаты кнопки Листать вверх или Листать вниз, но Контроллеру не нужно информировать об этом Модель. Он напрямую говорит Представлению прокрутить список песен в нужном направлении. Такое действие пользователя не требует изменений в Модели. Однако, когда пользователь выберет песню из списка и запустит её на воспроизведение, Контроллер изменит Модель, чтобы отразить это изменение в значении воспроизводимой в данный момент песни.<br /><br />Кроме того, изменения в Модели не всегда инициируются действиями пользователя. Модель может обновиться сама, основываясь на неких событиях. Возьмем, например, индикатор стоимости акций. Модель не связана с текущей стоимостью акций. Однако, стоимость сама по себе меняется, и Модель может установить таймер, чтобы периодически получать обновленные данные от веб-сервиса. И тогда, всякий раз, как только Модель обновит свои данные о стоимости акций, она проинформирует Представление о том, что состояние изменилось.<br /><br />Другой особенностью шаблона MVC является то, что каждая такая Модель может иметь более одного Представления, ассоциированного с ней. Например, в нашем портативном плеере установки громкости могут быть отображены на дисплее с помощью индикатора уровня. А кроме того, уровень звука на аудио-выходе соотносится с громкостью звука в наушниках. И дисплей, и звук в наушниках являются Представлениями состояния устройства.<br /><br />Взгляните на Рисунок 12-1 и обратите внимание на направление стрелок. Они показывают, кто инициирует взаимодействие между элементами. Для того, чтобы один MVC-элемент смог сообщаться с другим, ему нужно знать о нем и владеть ссылкой на этот элемент.<br /><br />Думайте о Модели, Представлении и Контроллере как о трех разных классах. Давайте посмотрим, каким классам нужно иметь ссылки на остальные классы:<br /><br /><i>Модель</i><br />Ей нужно иметь ссылку на Представление<br /><br /><i>Представление</i><br />Ему нужно иметь ссылку и на Модель, и на Контроллер<br /><br /><i>Контроллер</i><br />Ему необходимо владеть ссылкой на Модель<br /><br />Мы начали с того что заявили, что MVC – это составной шаблон, который объединяет несколько шаблонов. Вам, должно быть, интересно, какие шаблоны вошли в данный составной шаблон. Или, точнее, чем они могут быть представлены? Главным преимуществом использования шаблона MVC является возможность разъединять его на составляющие три элемента. Это позволяет нам увязать несколько Представлений с одной Моделью, заменять Модели и Контроллеры, не затрагивая другие элементы. Но некоторые элементы в триаде MVC должны поддерживать ссылки на остальные элементы, а также поддерживать активный обмен данными между ними. Как мы можем назвать такое разделение? Это имеет отношение к паттернам <a href="http://ooad.asf.ru/Pattern.aspx?IdKat=7&IdPat=38">Observer (Обозреватель)</a>, <a href="http://ooad.asf.ru/Pattern.aspx?IdKat=7&IdPat=47">Strategy (Стратегия)</a> и <a href="http://ooad.asf.ru/Pattern.aspx?IdKat=7&IdPat=41">Composite (Компоновщик)</a>.<br /><br /><br /><b><span style="font-size:78%;">Внедрение шаблонов в MVC</span></b><br /><br />Как мы уже рассмотрели, Модель может быть ассоциирована с несколькими Представлениями. В MVC Модели нужно информировать все связанные с ней Представления о происходящих изменениях. К тому же, это нужно делать без знания специфичных подробностей относительно Представлений, и даже без информации о том, скольким Представлениям следует измениться. Эта задача лучше всего решается применением реализации шаблона Обозреватель (см. Главу 8).<br /><br />Каждая Модель может иметь несколько Представлений, с ней связанных. Так же, Представления могут быть сложными, с несколькими окнами или панелями, внутри которых находятся другие элементы пользовательского интерфейса. Например, такие элементы интерфейса как кнопки, текстовые поля, списки, ползунки и т.п. могут быть сгруппированы в панель с закладками, а панель в свою очередь может быть частью окна наравне с другими панелями. Каждая кнопка или группа кнопок может быть Представлением. То же самое с коллекцией текстовых полей. Представляется полезным обращаться с панелью или окошком, которые содержат коллекции простых Представлений, таким же образом, как мы обращаемся с любыми другими Представлениями. Именно здесь использование шаблона Компоновщик сэкономит нам много сил (см. Главу 6). Почему реализация шаблона Компоновщик столь полезна в данном контексте? Если Представления могут быть вложенными, а они таковы, если созданы с применением шаблона Компоновщик, процесс обновления упрощается. Событие обновления автоматически обойдет все потомственные Представления. Создание сложных Представлений становится проще, когда нет необходимости рассылать индивидуальные сообщения об обновлении каждому вложенному Представлению.<br /><br />Представления ограничивают свою деятельность лишь внешним представлением состояния Модели. Они передают события пользовательского интерфейса Контроллеру. Поэтому, Контроллер – это в большей степени алгоритм того, как обработать пользовательский ввод в конкретном Представлении. Такое делегирование инкапсулирует реализацию того как конкретный элемент пользовательского элемента ведет себя в условиях изменения Модели. Мы может довольно просто заменить один Контроллер для одного и того же Представления, чтобы получить другое поведение. Это идеальный контекст для реализации щаблона Стратегия.<br /><br />Далее мы рассмотрим, как эти шаблоны реализованы в MVC, на примере разработки минималистичного примера.<br /><br /><br /><b><span style="font-size:78%;">Минималистичный пример шаблона MVC</span></b><br /><br />Этот простой пример отслеживает нажатия клавиш. Когда нажимается очередная клавиша, это приводит к изменению Модели и информированию Представления о необходимости обновиться. Представление задействует стандартное окно вывода Output во Flash, чтобы поместить туда код символа, который ввел пользователь. Код символа — это числовое значение символа в кодовой таблице текущей раскладки. Этот пример объясняет, каким образом шаблоны Обозреватель, Стратегия и Компоновщик интегрированы в MVC.<br /><br /><br /><b>Модель как Конкретный Субьект в шаблоне Обозреватель</b><br /><br />Взаимоотношения между Моделью и Представлением — это связь между Субъектом и Обозревателем (См. Главу 8). Модель должна реализовать интерфейс Субъекта, который является частью шаблона Обозреватель. К счастью, ActionScript 3.0 имеет встроенные классы, уже реализующие этот принцип, используя модель событий ActionScript чтобы информировать Обозревателей об изменениях.<br /><br /><b>Класс EventDispatcher в ActionScript 3.0</b><br /><br />Класс EventDispatcher снабжен интерфейсом IEventDispatcher. Наравне с другими методами, интерфейс IEventDispatcher определяет следующие методы, необходимые для субъекта в шаблоне Обозреватель. (См. документацию по AS3 для подробной информации о всех параметрах методов).<br /><br /><br /><div style="PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px"><pre class="actionscript">addEventListener<span style="color:#66cc66;">(</span><span style="color:#0066cc;">type</span>:<span style="color:#0066cc;">String</span>,<br /><br /> listener:<span style="FONT-WEIGHT: bold;color:#000000;" >Function</span>,<br /><br /> useCapture:<span style="color:#0066cc;">Boolean</span> = <span style="FONT-WEIGHT: bold;color:#000000;" >false</span>,<br /><br /> priority:<span style="color:#0066cc;">int</span> = <span style="color:#cc66cc;">0</span>,<br /><br /> useWeakReference:<span style="color:#0066cc;">Boolean</span> = <span style="FONT-WEIGHT: bold;color:#000000;" >false</span><span style="color:#66cc66;">)</span>:<span style="color:#0066cc;">void</span><br /><br /><br /><br />removeEventListener<span style="color:#66cc66;">(</span><span style="color:#0066cc;">type</span>:<span style="color:#0066cc;">String</span>,<br /><br /> listener:<span style="FONT-WEIGHT: bold;color:#000000;" >Function</span>,<br /><br /> useCapture:<span style="color:#0066cc;">Boolean</span> = <span style="FONT-WEIGHT: bold;color:#000000;" >false</span><span style="color:#66cc66;">)</span>:<span style="color:#0066cc;">void</span><br /><br /><br /><br />dispatchEvent<span style="color:#66cc66;">(</span>event:Event<span style="color:#66cc66;">)</span>:<span style="color:#0066cc;">Boolean</span></pre></div><br /><br />Чтобы Модель могла выступить в качестве Конкретного Субъекта в шаблоне Обозреватель, необходимо реализовать интерфейс IEventDispatcher. Однако, самый простой способ для определенного пользовательского класса заполучить способность распространять события – это наследовать от класса EventDispatcher.<br /><br />Обозреватель регистрирует методы слушателя, чтобы получать уведомлении от объектов EventDispatcher, методом addEventListener( ).<br /><br /><b>Модель</b><br /><br />Наша Модель сохраняет код символа, соответствующий нажатой клавише, в свойстве. Необходимо реализовать сеттер и геттер, чтобы стало возможным Представлению и Контроллеру получить доступ к этому свойству и изменять его. Давайте определим <a href="http://fla-master.livejournal.com/4470.html">интерфейс</a> для нашей Модели (Пример 12-1).<br /><br /><i>Пример 12-1. IModel.as</i><br /><br /><br /><div style="PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px"><pre class="actionscript">package <span style="color:#66cc66;">{</span><br /><br /> <span style="color:#0066cc;">import</span> flash.<span style="color:#006600;">events</span>.<span style="color:#006600;">*</span>;<br /><br /><br /><br /> <span style="color:#0066cc;">public</span> <span style="color:#0066cc;">interface</span> IModel <span style="color:#0066cc;">extends</span> IEventDispatcher <span style="color:#66cc66;">{</span><br /><br /> <span style="FONT-WEIGHT: bold;color:#000000;" >function</span> setKey<span style="color:#66cc66;">(</span><span style="color:#0066cc;">key</span>:uint<span style="color:#66cc66;">)</span>:<span style="color:#0066cc;">void</span>;<br /><br /> <span style="FONT-WEIGHT: bold;color:#000000;" >function</span> getKey<span style="color:#66cc66;">(</span><span style="color:#66cc66;">)</span>:uint;<br /><br /> <span style="color:#66cc66;">}</span><br /><br /><span style="color:#66cc66;">}</span></pre></div><br /><br />Интерфейс IModel, показанный в Примере 12-1, расширяет интерфейс IEventDispatcher и определяет пару методов для прочтения и установки кода символа последней нажатой клавиши. Поскольку интерфейс IModel расширяет IEventDispatcher, любой класс, реализующий его, должен реализовать все методы, определенные в обоих интерфейсах. Класс Model, показанный в Примере 12-2, реализует интерфейс IModel.<br /><br /><i>Пример 12-2. Model.as</i><br /><br /><br /><div style="PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px"><pre class="actionscript">package <span style="color:#66cc66;">{</span><br /><br /> <span style="color:#0066cc;">import</span> flash.<span style="color:#006600;">events</span>.<span style="color:#006600;">*</span>;<br /><br /><br /><br /> <span style="color:#0066cc;">public</span> <span style="FONT-WEIGHT: bold;color:#000000;" >class</span> Model <span style="color:#0066cc;">extends</span> EventDispatcher <span style="color:#0066cc;">implements</span> IModel <span style="color:#66cc66;">{</span><br /><br /><br /><br /> <span style="color:#0066cc;">private</span> <span style="FONT-WEIGHT: bold;color:#000000;" >var</span> lastKeyPressed:uint=<span style="color:#cc66cc;">0</span>;<br /><br /><br /><br /> <span style="color:#0066cc;">public</span> <span style="FONT-WEIGHT: bold;color:#000000;" >function</span> setKey<span style="color:#66cc66;">(</span><span style="color:#0066cc;">key</span>:uint<span style="color:#66cc66;">)</span>:<span style="color:#0066cc;">void</span> <span style="color:#66cc66;">{</span><br /><br /> <span style="color:#0066cc;">this</span>.<span style="color:#006600;">lastKeyPressed</span>=<span style="color:#0066cc;">key</span>;<br /><br /> dispatchEvent<span style="color:#66cc66;">(</span><span style="FONT-WEIGHT: bold;color:#000000;" >new</span> Event<span style="color:#66cc66;">(</span>Event.<span style="color:#006600;">CHANGE</span><span style="color:#66cc66;">)</span><span style="color:#66cc66;">)</span>;<span style="FONT-STYLE: italic;color:#808080;" > // распространяется событие</span><br /><br /> <span style="color:#66cc66;">}</span><br /><br /><br /><br /> <span style="color:#0066cc;">public</span> <span style="FONT-WEIGHT: bold;color:#000000;" >function</span> getKey<span style="color:#66cc66;">(</span><span style="color:#66cc66;">)</span>:uint <span style="color:#66cc66;">{</span><br /><br /> <span style="color:#b1b100;">return</span> lastKeyPressed;<br /><br /> <span style="color:#66cc66;">}</span><br /><br /> <span style="color:#66cc66;">}</span><br /><br /><span style="color:#66cc66;">}</span></pre></div><br /><br />Класс Model расширяет класс EventDispatcher, который уже реализовал интерфейс IEventDispatcher. Обратите внимание, что функция dispatchEvent() вызывается внутри метода setKey(). Она отсылает событие CHANGE всем зарегистрированным обозревателям, как только значение lastKeyPressed изменится внутри метода setKey().<br /><br /><br /><b>Контроллер как Конкретная Стратегия в шаблоне Стратегия.</b><br /><br />Отношения между Контроллером и Представлением можно представить как стратегию и контекст в шаблоне Стратегия. Каждый Контроллер будет конкретной стратегией, реализующей требуемое поведение в рамках интерфейса Стратегии.<br /><br /><br /><b>Контроллер</b><br /><br />В нашем минималистичном примере поведение, требуемое от Контроллера, это всего лишь принятие события о нажатии клавиши. IKeyboardInputHandler — это интерфейс Стратегии (Пример 12-3), где определен единственный метод keyPressHandler( ).<br /><br /><i>Пример 12-3. IKeyboardInputHandler.as</i><br /><br /><br /><div style="PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px"><pre class="actionscript">package <span style="color:#66cc66;">{</span><br /><br /> <span style="color:#0066cc;">import</span> flash.<span style="color:#006600;">events</span>.<span style="color:#006600;">*</span>;<br /><br /><br /><br /> <span style="color:#0066cc;">public</span> <span style="color:#0066cc;">interface</span> IKeyboardInputHandler <span style="color:#66cc66;">{</span><br /><br /> <span style="FONT-WEIGHT: bold;color:#000000;" >function</span> keyPressHandler<span style="color:#66cc66;">(</span>event:KeyboardEvent<span style="color:#66cc66;">)</span>:<span style="color:#0066cc;">void</span>;<br /><br /> <span style="color:#66cc66;">}</span><br /><br /><span style="color:#66cc66;">}</span></pre></div><br /><br />Конкретным Контроллером будет класс Controller (Пример 12-4), который реализует интерфейс IKeyboardInputHandler.<br /><br /><i>Пример 12-4. Controller.as</i><br /><br /><br /><div style="PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px"><pre class="actionscript">package <span style="color:#66cc66;">{</span><br /><br /> <span style="color:#0066cc;">import</span> flash.<span style="color:#006600;">events</span>.<span style="color:#006600;">*</span>;<br /><br /><br /><br /> <span style="color:#0066cc;">public</span> <span style="FONT-WEIGHT: bold;color:#000000;" >class</span> Controller <span style="color:#0066cc;">implements</span> IKeyboardInputHandler <span style="color:#66cc66;">{</span><br /><br /><br /><br /> <span style="color:#0066cc;">private</span> <span style="FONT-WEIGHT: bold;color:#000000;" >var</span> model:IModel;<br /><br /><br /><br /> <span style="color:#0066cc;">public</span> <span style="FONT-WEIGHT: bold;color:#000000;" >function</span> Controller<span style="color:#66cc66;">(</span>aModel:IModel<span style="color:#66cc66;">)</span> <span style="color:#66cc66;">{</span><br /><br /> <span style="color:#0066cc;">this</span>.<span style="color:#006600;">model</span>=aModel;<br /><br /> <span style="color:#66cc66;">}</span><br /><br /><br /><br /> <span style="color:#0066cc;">public</span> <span style="FONT-WEIGHT: bold;color:#000000;" >function</span> keyPressHandler<span style="color:#66cc66;">(</span>event:KeyboardEvent<span style="color:#66cc66;">)</span>:<span style="color:#0066cc;">void</span> <span style="color:#66cc66;">{</span><br /><br /> model.<span style="color:#006600;">setKey</span><span style="color:#66cc66;">(</span>event.<span style="color:#006600;">charCode</span><span style="color:#66cc66;">)</span>;<span style="FONT-STYLE: italic;color:#808080;" > // изменяем модель</span><br /><br /> <span style="color:#66cc66;">}</span><br /><br /> <span style="color:#66cc66;">}</span><br /><br /><span style="color:#66cc66;">}</span></pre></div><br /><br />Обратите внимание, что Контроллер имеет конструктор, который в качестве параметра принимает экземпляр Модели. Это необходимо для того, чтобы Контроллер смог установить связь с Моделью, как это показано на Рисунке 12-1. Поэтому необходимо хранить ссылку на Модель.<br /><br />Метод keyPressHandler( ) принимает событие пользовательского интерфейса (в данном случае KeyboardEvent) как параметр, и потом решает как его обработать. В нашем примере он просто устанавливает код нажатой клавиши в Модели.<br /><br /><br /><b>Представление как Конкретный Обозреватель в шаблоне Обозреватель и Контекст в шаблоне Стратегия</b><br /><br />Представление, возможно, наиболее сложный элемент в шаблоне MVC. Он играет роль интегрирующей части в реализации шаблонов как Обозревателя, так и Стратегии, что формирует основу его взаимоотношения с Моделью и Контроллером. Класс View, показанный в Примере 12-5, реализует Представление в минималистичном примере.<br /><br /><i>Пример 12-5. View.as</i><br /><br /><br /><div style="PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px"><pre class="actionscript">package <span style="color:#66cc66;">{</span><br /><br /> <span style="color:#0066cc;">import</span> flash.<span style="color:#006600;">events</span>.<span style="color:#006600;">*</span>;<br /><br /> <span style="color:#0066cc;">import</span> flash.<span style="color:#006600;">display</span>.<span style="color:#006600;">*</span>;<br /><br /><br /><br /> <span style="color:#0066cc;">public</span> <span style="FONT-WEIGHT: bold;color:#000000;" >class</span> View <span style="color:#66cc66;">{</span><br /><br /><br /><br /> <span style="color:#0066cc;">private</span> <span style="FONT-WEIGHT: bold;color:#000000;" >var</span> model:IModel;<br /><br /><br /><br /> <span style="color:#0066cc;">private</span> <span style="FONT-WEIGHT: bold;color:#000000;" >var</span> controller:IKeyboardInputHandler;<br /><br /><br /><br /> <span style="color:#0066cc;">public</span> <span style="FONT-WEIGHT: bold;color:#000000;" >function</span> View<span style="color:#66cc66;">(</span>aModel:IModel,oController:IKeyboardInputHandler,<span style="color:#0066cc;">target</span>:<span style="color:#0066cc;">Stage</span><span style="color:#66cc66;">)</span> <span style="color:#66cc66;">{</span><br /><br /> <span style="color:#0066cc;">this</span>.<span style="color:#006600;">model</span>=aModel;<br /><br /> <span style="color:#0066cc;">this</span>.<span style="color:#006600;">controller</span>=oController;<br /><br /><br /><br /> <span style="FONT-STYLE: italic;color:#808080;" >// подписывается на получение уведомлений от Модели</span><br /><br /> model.<span style="color:#006600;">addEventListener</span><span style="color:#66cc66;">(</span>Event.<span style="color:#006600;">CHANGE</span>,<span style="color:#0066cc;">this</span>.<span style="color:#006600;">update</span><span style="color:#66cc66;">)</span>;<br /><br /><br /><br /> <span style="FONT-STYLE: italic;color:#808080;" >// подписывается на получение нажатий клавиш от сцены</span><br /><br /> <span style="color:#0066cc;">target</span>.<span style="color:#006600;">addEventListener</span><span style="color:#66cc66;">(</span>KeyboardEvent.<span style="color:#006600;">KEY_DOWN</span>,<span style="color:#0066cc;">this</span>.<span style="color:#006600;">onKeyPress</span><span style="color:#66cc66;">)</span>;<br /><br /><br /><br /> <span style="color:#66cc66;">}</span><br /><br /><br /><br /> <span style="color:#0066cc;">private</span> <span style="FONT-WEIGHT: bold;color:#000000;" >function</span> update<span style="color:#66cc66;">(</span>event:Event<span style="color:#66cc66;">)</span>:<span style="color:#0066cc;">void</span> <span style="color:#66cc66;">{</span><br /><br /> <span style="FONT-STYLE: italic;color:#808080;" >// получение данных от Модели и обновление Представления</span><br /><br /> <span style="color:#0066cc;">trace</span><span style="color:#66cc66;">(</span>model.<span style="color:#006600;">getKey</span><span style="color:#66cc66;">(</span><span style="color:#66cc66;">)</span><span style="color:#66cc66;">)</span>;<br /><br /> <span style="color:#66cc66;">}</span><br /><br /><br /><br /> <span style="color:#0066cc;">private</span> <span style="FONT-WEIGHT: bold;color:#000000;" >function</span> onKeyPress<span style="color:#66cc66;">(</span>event:KeyboardEvent<span style="color:#66cc66;">)</span>:<span style="color:#0066cc;">void</span> <span style="color:#66cc66;">{</span><br /><br /> <span style="FONT-STYLE: italic;color:#808080;" >// обработка передается в Контроллер (Стратегия) на обработку</span><br /><br /> controller.<span style="color:#006600;">keyPressHandler</span><span style="color:#66cc66;">(</span>event<span style="color:#66cc66;">)</span>;<br /><br /> <span style="color:#66cc66;">}</span><br /><br /> <span style="color:#66cc66;">}</span><br /><br /><span style="color:#66cc66;">}</span></pre></div><br /><br /><br />Представление нуждается в ссылках на Модель и на Контроллер для взаимодействия с ними, как показано на Рисунке 12-1. И экземпляр Модели, и экземпляр Контроллера передаются Представлению в его конструкторе. К тому же, Представление в нашем примере нуждается в ссылке на сцену (Stage), чтобы зарегистрировать себя как получателя событий нажатия клавиш.<br /><br />Кроме того что класс View рисует пользовательский интерфейс, он выполняет еще пару важных задач. Он регистрируется у Модели для получения событий об обновлении, и делегирует Контроллеру обработку ввода пользователя. В нашем примере Представление не имеет внешнего видимого присутствия на сцене, но отображает состояние Модели в окне вывода Output. Ему нуждается в получении события нажатия клавиши, и регистрирует метод onKeyPress( ) для получения события KEY_DOWN от сцены. Вторая задача – это зарегистрировать метод слушателя update( ) для получения события CHANGE от модели. При получении уведомления об изменении, метод update() прочитывает код последней нажатой клавиши из Модели и печатает его в окне вывода, используя функцию trace().<br /><br /><br /><b>Построение триады MVC</b><br /><br />Мы рассмотрели реализацию каждой из трех составляющих шаблон MVC частей по отдельности. Однако, должен существовать клиент, который инициализирует каждый элемент и построит модель MVC. На самом деле, никакого сложного построения не будет — все что нужно уже сделано при написании классов Модели, Представления и Контроллера. В Примере 12-6 приводится класс Flash-документа, который иллюстрирует элементы MVC.<br /><br /><i>Пример 12-6. Main.as (основной класс минималистичного примера)</i><br /><br /><br /><div style="PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px"><pre class="actionscript">package <span style="color:#66cc66;">{</span><br /><br /><br /><br /> <span style="color:#0066cc;">import</span> flash.<span style="color:#006600;">display</span>.<span style="color:#006600;">*</span>;<br /><br /> <span style="color:#0066cc;">import</span> flash.<span style="color:#006600;">events</span>.<span style="color:#006600;">*</span>;<br /><br /><br /><br /> <span style="FONT-STYLE: italic;color:#808080;" >/**<br /><br /> * Main Class<br /><br /> * @ purpose: Document class for movie<br /><br /> */</span><br /><br /><br /><br /> <span style="color:#0066cc;">public</span> <span style="FONT-WEIGHT: bold;color:#000000;" >class</span> Main <span style="color:#0066cc;">extends</span> Sprite <span style="color:#66cc66;">{</span><br /><br /><br /><br /> <span style="color:#0066cc;">public</span> <span style="FONT-WEIGHT: bold;color:#000000;" >function</span> Main<span style="color:#66cc66;">(</span><span style="color:#66cc66;">)</span> <span style="color:#66cc66;">{</span><br /><br /> <span style="FONT-WEIGHT: bold;color:#000000;" >var</span> model:IModel=<span style="FONT-WEIGHT: bold;color:#000000;" >new</span> Model ;<br /><br /> <span style="FONT-WEIGHT: bold;color:#000000;" >var</span> controller:IKeyboardInputHandler=<span style="FONT-WEIGHT: bold;color:#000000;" >new</span> Controller<span style="color:#66cc66;">(</span>model<span style="color:#66cc66;">)</span>;<br /><br /> <span style="FONT-WEIGHT: bold;color:#000000;" >var</span> view:View=<span style="FONT-WEIGHT: bold;color:#000000;" >new</span> View<span style="color:#66cc66;">(</span>model,controller,<span style="color:#0066cc;">this</span>.<span style="color:#0066cc;">stage</span><span style="color:#66cc66;">)</span>;<br /><br /> <span style="color:#66cc66;">}</span><br /><br /> <span style="color:#66cc66;">}</span><br /><br /><span style="color:#66cc66;">}</span></pre></div><br /><br />После того как Модель, Контроллер и Представление инициализированы, они установят связь друг с другом и начнут работать. Нажатие клавиши на клавиатуре приведет к выводу кода соответствующего символа в окне Output.<br /><br />Вам нужно запретить шорткаты для тестирования нажатий клавиш. В противном случае пользовательский интерфейс Flash перехватит события нажатия клавиш, которые соответствуют шорткатам. Чтобы запретить шорткаты, выберите Disable Keyboard Shortcuts из меню Control во время выполнения ролика.<br /><br />Обратите внимание, что экземпляр Модели передается Контроллеру. Подобным образом экземпляры Модели и Контроллера передаются Представлению. Мы можем просто заместить существующие Модель и Контроллер другими, при условии, что они реализуют интерфейсы IModel и IKeyboardInputHandler. Дополнительные Представления также могут быть безболезненно добавлены прямо в отношения Субъект-Обозреватель между Моделью и Представлением. Модель ничего не знает о Представлениях, так как это забота Представления — зарегистрировать себя в качестве слушателя уведомлений об изменении Модели. Это большой плюс шаблона MVC; Модель, Представление и Контроллер разделены, слабо связаны, что придает гибкости в их использовании.<br /><br /><br /><b>Вложенные Представления и узлы шаблона Компоновщик</b><br /><br />Как вы помните, Представление, возможно, самый сложный элемент в триаде MVC, поскольку в контексте MVC он задействован как в реализации шаблона Обозреватель, так и в Стратегии. Наши элементы Представления способны быть более сложными, поскольку могут реализовать третий шаблон — Компоновщик (см. примеры шаблона Компоновщик в Главе 6). Реализация Представлений как элементов шаблона Компоновщик позволяет разобраться со сложными пользовательскими интерфейсами, которые содержат множественные Представления. Вложение Представлений превносит некоторые преимущества в процесс обновления пользовательского интерфейса, так как обновления могут распространяться по ветвям структурного дерева составного Представления. Также составные Представления могут добавлять и удалять вложенные Представления, основываясь на режиме работы приложения и пользовательских настройках. Хорошим примером сложного интерфейса является панель Properties Inspector в среде разработки Flash. Содержимое Properties Inspector зависит от контекста, и элементы интерфейса появляются и исчезают в зависимости от того, какой объект выделен на сцене.<br /><br /><br /><b>Компонент и составное Представление</b><br /><br />Первым шагом будет создание компонента и составных классов для Представления. Эти классы должны быть описаны как абстрактные, должны быть подклассами и не должны порождать экземпляры, как показано в Примере 12-7.<br /><br /><i>Пример 12-7. ComponentView.as</i><br /><br /><br /><div style="PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px"><pre class="actionscript">package <span style="color:#66cc66;">{</span><br /><br /><br /><br /> <span style="color:#0066cc;">import</span> flash.<span style="color:#006600;">errors</span>.<span style="color:#006600;">IllegalOperationError</span>;<br /><br /> <span style="color:#0066cc;">import</span> flash.<span style="color:#006600;">events</span>.<span style="color:#006600;">Event</span>;<br /><br /> <span style="color:#0066cc;">import</span> flash.<span style="color:#006600;">display</span>.<span style="color:#006600;">Sprite</span>;<br /><br /><br /><br /> <span style="FONT-STYLE: italic;color:#808080;" >// АБСТРАКТНЫЙ класс (от него нужно наследовать, не создавая экземпляра данного класса)</span><br /><br /> <span style="color:#0066cc;">public</span> <span style="FONT-WEIGHT: bold;color:#000000;" >class</span> ComponentView <span style="color:#0066cc;">extends</span> Sprite <span style="color:#66cc66;">{</span><br /><br /> <span style="color:#66cc66;">{</span><br /><br /><br /><br /> protected <span style="FONT-WEIGHT: bold;color:#000000;" >var</span> model:<span style="color:#0066cc;">Object</span>;<br /><br /> protected <span style="FONT-WEIGHT: bold;color:#000000;" >var</span> controller:<span style="color:#0066cc;">Object</span>;<br /><br /><br /><br /> <span style="color:#0066cc;">public</span> <span style="FONT-WEIGHT: bold;color:#000000;" >function</span> ComponentView<span style="color:#66cc66;">(</span>aModel:<span style="color:#0066cc;">Object</span>,aController:<span style="color:#0066cc;">Object</span>=<span style="FONT-WEIGHT: bold;color:#000000;" >null</span><span style="color:#66cc66;">)</span> <span style="color:#66cc66;">{</span><br /><br /> <span style="color:#0066cc;">this</span>.<span style="color:#006600;">model</span>=aModel;<br /><br /> <span style="color:#0066cc;">this</span>.<span style="color:#006600;">controller</span>=aController;<br /><br /> <span style="color:#66cc66;">}</span><br /><br /><br /><br /> <span style="color:#0066cc;">public</span> <span style="FONT-WEIGHT: bold;color:#000000;" >function</span> <span style="color:#0066cc;">add</span><span style="color:#66cc66;">(</span>c:ComponentView<span style="color:#66cc66;">)</span>:<span style="color:#0066cc;">void</span> <span style="color:#66cc66;">{</span><br /><br /> <span style="color:#0066cc;">throw</span> <span style="FONT-WEIGHT: bold;color:#000000;" >new</span> IllegalOperationError<span style="color:#66cc66;">(</span><span style="color:#ff0000;">"add operation not supported"</span><span style="color:#66cc66;">)</span>;<br /><br /> <span style="color:#66cc66;">}</span><br /><br /><br /><br /> <span style="color:#0066cc;">public</span> <span style="FONT-WEIGHT: bold;color:#000000;" >function</span> remove<span style="color:#66cc66;">(</span>c:ComponentView<span style="color:#66cc66;">)</span>:<span style="color:#0066cc;">void</span> <span style="color:#66cc66;">{</span><br /><br /> <span style="color:#0066cc;">throw</span> <span style="FONT-WEIGHT: bold;color:#000000;" >new</span> IllegalOperationError<span style="color:#66cc66;">(</span><span style="color:#ff0000;">"remove operation not supported"</span><span style="color:#66cc66;">)</span>;<br /><br /> <span style="color:#66cc66;">}</span><br /><br /><br /><br /> <span style="color:#0066cc;">public</span> <span style="FONT-WEIGHT: bold;color:#000000;" >function</span> getChild<span style="color:#66cc66;">(</span>n:<span style="color:#0066cc;">int</span><span style="color:#66cc66;">)</span>:ComponentView <span style="color:#66cc66;">{</span><br /><br /> <span style="color:#0066cc;">throw</span> <span style="FONT-WEIGHT: bold;color:#000000;" >new</span> IllegalOperationError<span style="color:#66cc66;">(</span><span style="color:#ff0000;">"getChild operation not supported"</span><span style="color:#66cc66;">)</span>;<br /><br /> <span style="color:#b1b100;">return</span> <span style="FONT-WEIGHT: bold;color:#000000;" >null</span>;<br /><br /> <span style="color:#66cc66;">}</span><br /><br /><br /><br /> <span style="FONT-STYLE: italic;color:#808080;" >// АБСТРАКТНЫЙ метод(должен быть замещен в классе-потомке)</span><br /><br /> <span style="color:#0066cc;">public</span> <span style="FONT-WEIGHT: bold;color:#000000;" >function</span> update<span style="color:#66cc66;">(</span>event:Event=<span style="FONT-WEIGHT: bold;color:#000000;" >null</span><span style="color:#66cc66;">)</span>:<span style="color:#0066cc;">void</span> <span style="color:#66cc66;">{</span><br /><br /> <span style="color:#66cc66;">}</span><br /><br /><br /><br /> <span style="color:#66cc66;">}</span><br /><br /> <span style="color:#66cc66;">}</span><br /><br /><span style="color:#66cc66;">}</span></pre></div><br /><br />Класс ComponentView из Примера 12-7 определяет абстрактный интерфейс для Представления компонента. Это похоже на класс классического компонента из Главы 6, но с несколькими ключевыми отличиями. Класс ComponentView хранит ссылку на Модель и Представление, и содержит конструктор. Не все Представления обрабатывают ввод пользователя, и компонентное Представление может быть сконструировано с простой передачей экземпляра Модели. Поэтому параметр aController принимает в конструкторе значение null по умолчанию. Также обратите внимание, что класс ComponentView унаследован от класса Sprite. Это логично, поскольку большинство Представлений рисуют пользовательский интерфейс на сцене. Мы можем использовать свойства и методы, реализованные в классе Sprite, для рисования и добавления объектов в список отображения.<br /><br />Метод update( ) должен вести себя как абстрактный метод. Дочерние Представления, являющиеся потомками ComponentView, должны заместить и реализовать метод update( ), чтобы уметь обновлять свою часть пользовательского интерфейса. По этой причине методу передается параметр типа Event. Этот параметр также по умолчанию установлен в null, что позволяет вызывать update() без передачи события как параметра. Такой подход полезен, когда изначально отрисованный пользовательский интерфейс находится в своем состоянии по умолчанию, и наш следующий пример иллюстрирует это.<br /><br />Класс CompositeView расширяет ComponentView и замещает методы, которые отвечают за дочерние Представления.<br /><br /><i>Пример 12-8. CompositeView.as</i><br /><br /><br /><div style="PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; WIDTH: 432px"><pre class="actionscript">package <span style="color:#66cc66;">{</span><br /><br /><br /><br /> <span style="color:#0066cc;">import</span> flash.<span style="color:#006600;">events</span>.<span style="color:#006600;">Event</span>;<br /><br /><br /><br /> <span style="FONT-STYLE: italic;color:#808080;" >// АБСТРАКТНЫЙ класс (от него нужно наследовать, не создавая экземпляра данного класса)</span><br /><br /> <span style="color:#0066cc;">public</span> <span style="FONT-WEIGHT: bold;color:#000000;" >class</span> CompositeView <span style="color:#0066cc;">extends</span> ComponentView <span style="color:#66cc66;">{</span><br /><br /><br /><br /> <span style="color:#0066cc;">private</span> <span style="FONT-WEIGHT: bold;color:#000000;" >var</span> aChildren:<span style="color:#0066cc;">Array</span>;<br /><br /><br /><br /> <span style="color:#0066cc;">public</span> <span style="FONT-WEIGHT: bold;color:#000000;" >function</span> CompositeView<span style="color:#66cc66;">(</span>aModel:<span style="color:#0066cc;">Object</span>,aController:<span style="color:#0066cc;">Object</span>=<span style="FONT-WEIGHT: bold;color:#000000;" >null</span><span style="color:#66cc66;">)</span> <span style="color:#66cc66;">{</span><br /><br /> <span style="color:#0066cc;">super</span><span style="color:#66cc66;">(</span>aModel,aController<span style="color:#66cc66;">)</span>;<br /><br /> <span style="color:#0066cc;">this</span>.<span style="color:#006600;">aChildren</span>=<span style="FONT-WEIGHT: bold;color:#000000;" >new</span> <span style="color:#0066cc;">Array</span> ;<br /><br /> <span style="color:#66cc66;">}</span><br /><br /><br /><br /> override <span style="color:#0066cc;">public</span> <span style="FONT-WEIGHT: bold;color:#000000;" >function</span> <span style="color:#0066cc;">add</span><span style="color:#66cc66;">(</span>c:ComponentView<span style="color:#66cc66;">)</span>:<span style="color:#0066cc;">void</span> <span style="color:#66cc66;">{</span><br /><br /><br /><br /> aChildren.<span style="color:#0066cc;">push</span><span style="color:#66cc66;">(</span>c<span style="color:#66cc66;">)</span>;<br /><br /> <span style="color:#66cc66;">}</span><br /><br /><br /><br /> override <span style="color:#0066cc;">public</span> <span style="FONT-WEIGHT: bold;color:#000000;" >function</span> update<span style="color:#66cc66;">(</span>event:Event=<span style="FONT-WEIGHT: bold;color:#000000;" >null</span><span style="color:#66cc66;">)</span>:<span style="color:#0066cc;">void</span> <span style="color:#66cc66;">{</span><br /><br /> <span style="color:#b1b100;">for</span> each <span style="color:#66cc66;">(</span><span style="FONT-WEIGHT: bold;color:#000000;" >var</span> c:ComponentView <span style="color:#b1b100;">in</span> aChildren<span style="color:#66cc66;">)</span> <span style="color:#66cc66;">{</span><br /><br /> c.<span style="color:#006600;">update</span><span style="color:#66cc66;">(</span>event<span style="color:#66cc66;">)</span>;<br /><br /> <span style="color:#66cc66;">}</span><br /><br /> <span style="color:#66cc66;">}</span><br /><br /><br /><br /> <span style="color:#66cc66;">}</span><br /><br /><span style="color:#66cc66;">}</span></pre></div><br /><br />Обратите внимание на замещаемую (override) функцию update( ) класса CompositeView в Примере 12-8. Она вызывает метод update у всех дочерних классов. Поэтому, вызов функции update() в корне структуры составного Представления приведет к распространению обновления по структуре и обойдет дерево компонента, обновляя все Представления. Давайте расширим классы CompositeView и ComponentView, и создадим структуру Представлений, чтобы посмотреть как это работает </div></div></div>Anonymoushttp://www.blogger.com/profile/13778770709453656580noreply@blogger.com0tag:blogger.com,1999:blog-393213624811119199.post-39827503075946976262008-10-21T05:54:00.000-07:002008-10-21T05:58:36.405-07:00Application.application.url in Flash AS3 //Доступ к информации загрузчика<a href="http://renaun.com/blog/2008/10/16/264/">Application.application.url in Flash AS3</a>, <a style="COLOR: #444444" href="http://renaun.com/blog">renaun.com</a><br /><br />The solution to accessing the loader information url property is quite easy in Flash ActionScript 3. But when you Google for the solution its not obvious. Hence I am creating a post about it.<br /><br />In Flex you can access the url of the SWF by accessing Application.application.url. What this value represents is the root.loaderInfo.url property. So in Flash and AS3 you would do this:<br /><br /><div id="code" rows="15"><br />var tf:TextField = new TextField();<br />tf.autoSize = TextFieldAutoSize.LEFT;<br />tf.border = true;<br />addChild(tf);<br /><br />tf.appendText("params:" + "\n");<br />try {<br />var keyStr:String;<br />var valueStr:String;<br />tf.appendText(LoaderInfo(this.root.loaderInfo).url + "\n");<br />var paramObj:Object = LoaderInfo(this.root.loaderInfo).parameters;<br />for (keyStr in paramObj) {<br />valueStr = String(paramObj[keyStr]);<br />tf.appendText("\t" + keyStr + ":\t" + valueStr + "\n");<br />}<br />} catch (error:Error) {<br />tf.appendText(error.toString());<br />}<br /></div><br /><br />The important part is accessing the root's loaderInfo object. The above code also shows how to access the FlashVar parameters in ActionScript 3.<br /><br />Example code referenced from <a onclick="javascript:urchinTracker('/outbound/blogs.adobe.com');" href="http://blogs.adobe.com/pdehaan/2006/07/using_flashvars_with_actionscr.html">here</a>.Anonymoushttp://www.blogger.com/profile/13778770709453656580noreply@blogger.com0tag:blogger.com,1999:blog-393213624811119199.post-19926050126526502052008-09-24T07:49:00.000-07:002008-09-24T07:56:27.618-07:00Компилятор флеша на флешеФинал обсуждения "Собрать <a href="http://groups.google.com/group/ruFlash/browse_thread/thread/97bcc35623b1b7b9#">MovieClip</a>" приводит к очень важному ресурсу:<br /><a href="http://eval.hurlant.com/">http://eval.hurlant.com/</a><br />Здесь есть некая <a href="http://eval.hurlant.com/demo/srcview/">библиотечка</a>, которая позволит откомпилировать код "налету" и отправить готовый SWF на сервер!Anonymoushttp://www.blogger.com/profile/13778770709453656580noreply@blogger.com1tag:blogger.com,1999:blog-393213624811119199.post-5444152112601553202008-09-11T05:37:00.000-07:002008-09-11T06:29:17.400-07:00Обзоры фреймворковСерия статей про Cairngorm от <a href="http://flexpower.in.ua/">another Flex blog</a>:<br /><a title="Permanent Link to Нужен ли мне Cairngorm?" href="http://flexpower.in.ua/2008/08/07/5" rel="bookmark">Нужен ли мне Cairngorm?</a><br /><a title="Permanent Link to Перевод статьи Стивена Вебстера" href="http://flexpower.in.ua/2008/08/11/6" rel="bookmark">Перевод статьи Стивена Вебстера</a><br /><a title="Permanent Link to Разработка Flex RIA с помощью микроархитектуры Cairngorm. Часть 1: Введение в Cairngorm" href="http://flexpower.in.ua/2008/08/23/8" rel="bookmark">Разработка Flex RIA с помощью микроархитектуры Cairngorm. Часть 1: Введение в Cairngorm</a><br />(Ждем продолжения!)<br /><br />Про Mate Flex Framework:<br /><a href="http://tearaway-tea.com/blog/2008/09/5-%d0%ba%d0%be%d0%bf%d0%b5%d0%b5%d0%ba-%d0%be-mate-flex-framework/">5 копеек о Mate Flex Framework</a> от <a href="http://tearaway-tea.com/blog">Go!Verla Flex блог</a>.<br /><a href="http://www.slideshare.net/Constantiner/mate-flex-framework-presentation?src=embed">Обзорная презентация Constantiner'а</a>.<br /><br />Про PureMVC от<br /><a title="Permanent Link to Что представляет собой фреймворк PureMVC?" href="http://zzzend.wordpress.com/2008/07/24/%d1%87%d1%82%d0%be-%d0%bf%d1%80%d0%b5%d0%b4%d1%81%d1%82%d0%b0%d0%b2%d0%bb%d1%8f%d0%b5%d1%82-%d1%81%d0%be%d0%b1%d0%be%d0%b9-%d1%84%d1%80%d0%b5%d0%b9%d0%bc%d0%b2%d0%be%d1%80%d0%ba-puremvc/" rel="bookmark">Что представляет собой фреймворк PureMVC?</a> от <a href="http://zzzend.wordpress.com/">Zzzend’s Weblog</a>.Anonymoushttp://www.blogger.com/profile/13778770709453656580noreply@blogger.com1tag:blogger.com,1999:blog-393213624811119199.post-26268138120767385662008-08-14T12:20:00.000-07:002008-08-14T12:26:13.647-07:00Пробуем haxeVideo. //Обзор HaxeVideo<a title="'Permanent" href="http://flash-santer.com/?p=25" rel="bookmark">Пробуем haxeVideo.</a> <a accesskey="1" href="http://flash-santer.com/">Flash. Flex. AIR. Haxe.</a> <br />Хорошо написано о том, где скачать, куда распаковать, рабочий пример (на AS3).<br /><br />Ключевые фразы:<br /><em>Компилируем приложение и запускаем. В директории установки haxeVideo, в папке videos можно увидеть файл temp.flv, медленно увеличивающего свой размер по мере поступления потока на сервер. </em><br /><em>В итоге мы запустили сервер haxeVideo и написали простейшее приложение для него, которое передает поток для записи его на сервере. Также в директории установки haxeVideo можно найти исходники сервера и пример клиентского приложения, написанные на haxe.</em>Anonymoushttp://www.blogger.com/profile/13778770709453656580noreply@blogger.com1tag:blogger.com,1999:blog-393213624811119199.post-63233729276665042142008-08-14T01:48:00.000-07:002008-08-14T01:51:15.712-07:00Как сделать заливку фона повторяющимся (тайленым) изображением. //Пример кода<a href="http://renaun.com/blog/2006/12/08/165/">Flex 2 Application Repeating BackgroundImage Style (updated)</a>. <a style="COLOR: #444444" href="http://renaun.com/blog"><renaun.com:flexblog text="{ ModelLocator.myThoughts }"></a></renaun.com:flexblog><br /><br />В кратце - класс экстендит RectangularBorder и осуществляет программную заливку.<br /><br />Код прилагается:<br /><a href="http://renaun.com/flex2/posts/repeatedbackground/index.html">http://renaun.com/flex2/posts/repeatedbackground/index.html</a><br /><?xml:namespace prefix = renaun.com /><renaun.com:flexblog text="{ ModelLocator.myThoughts }"></renaun.com:flexblog>Anonymoushttp://www.blogger.com/profile/13778770709453656580noreply@blogger.com1tag:blogger.com,1999:blog-393213624811119199.post-43139053693350933052008-08-14T00:50:00.000-07:002008-08-14T00:53:18.069-07:00Стандарты кодирования в AS3. //Полезно<p><a title="'Permanent" href="http://flash-santer.com/?p=54" rel="bookmark">Стандарты кодирования в AS3</a>. <a accesskey="1" href="http://flash-santer.com/">Flash. Flex. AIR. Haxe.</a></p><p>Статья посвящена систематизации стиля кодирования AS3. </p><p><a href="http://flash-santer.com/docs/Coding%20Standards.doc">http://flash-santer.com/docs/Coding%20Standards.doc</a> - документ, описывающий систему.</p>Anonymoushttp://www.blogger.com/profile/13778770709453656580noreply@blogger.com1tag:blogger.com,1999:blog-393213624811119199.post-46469901389104159312008-06-19T23:21:00.000-07:002008-06-19T23:30:07.974-07:00Как узнать параметры компиляции во Flex Builder.<a href="http://flashimp.ru/2008/06/flex-builder.html">Оригинал</a>. <a href="http://flashimp.ru/">Flashimp</a><br /><br />Всё просто:<br />Открываем файл ".actionScriptProperties" в папке вашего проекта и смотрим:<br />строчка ноды "‹compiler›" как раз содержит все параметры помпилятора<br /><br />‹compiler<br />additionalCompilerArguments="-load-config ../flex-config.xml"<br />copyDependentFiles="true"<br />enableModuleDebug="true"<br />flexSDK="Flex 3"<br />generateAccessible="false"<br />htmlExpressInstall="true"<br />htmlGenerate="true"<br />htmlHistoryManagement="false"<br />htmlPlayerVersion="9.0.28"<br />htmlPlayerVersionCheck="false"<br />outputFolderPath="bin-debug"<br />sourceFolderPath="src"<br />strict="true"<br />useApolloConfig="false"<br />verifyDigests="true"<br />warn="true"›<br /><br />Создаём в папке проекта файл "flex-config.xml".<br />За основу берём его же из sdk (flexSDK\frameworks\flex-config.xml).<br />Убиваем/изменяем что лично вам необходимо.<br />Не забываем указать используемые библиотеки, но лучше это сделать не конкретно указав каждую, а указать только папки с ними, а компилятор уж сам пусть разбирается, какие юзать:<br />‹library-path›<br />‹path-element›libs‹/path-element><br />‹path-element›../../frameworks/libs‹/path-element›<br />‹path-element›../../frameworks/libs/player‹/path-element›<br />‹path-element›../../frameworks/locale/{locale}‹/path-element›<br />‹/library-path›<br /><br />Далее открываем cmd и пишем:<br />‹url_to_mxmlc.exe› ‹url_to_Main.as› -load-config ‹url_to_flex-config.xml›<br /><br />Собственно всё :)<br />Подробнее узнать как писать flex-config.xml и вообще работать с компилятором mxmlc можно узнать из справки к Flex Builder'у.Anonymoushttp://www.blogger.com/profile/13778770709453656580noreply@blogger.com0tag:blogger.com,1999:blog-393213624811119199.post-4432315901935324222008-05-14T23:13:00.000-07:002008-05-14T23:38:43.986-07:00Повышение производительности AS3 приложений //Очень полезные советы<a href="http://gorbatov.blogspot.com/2008/03/as3.html">Оригинал</a>. <a href="http://gorbatov.blogspot.com/">Flex 2 & Co</a><br /><br /><p>Здесь представлены некоторые приемы, которые помогут повысить производительность наших приложений:<br /><br /><span style="FONT-WEIGHT: bold">1) Создавайте константы для часто используемых объектов типа new Point(0,0) или new Rectangle(0,0,320,240):</span><br /><br /><code>//вызов 100000 раз: 75мс<br />new Point(0,0);<br />//или<br />private static const POINT:Point = new Point(0,0);<br />//8мс<br />POINT;</code><br /><br />Быстрее на 838%<br /><br /><span style="FONT-WEIGHT: bold">2) Сократите указания на статические члены классов. Вместо этого старайтесь использовать переменные пакета:</span><br /><code>//15мс<br />SomeClass.somevar;<br />package somepackage{<br />public const somevar:int;<br />}<br />//8мс<br />somevar;</code><br />на 66% быстрее<br /><br /><span style="FONT-WEIGHT: bold">3) Сохраняйте getter свойства в локальных переменных при их использовании более одного раза.</span><br /><br /><code>somesprite.graphics.clear();<br />somesprite.graphics.beginFill(0x000000);<br />somesprite.graphics.drawRect(0,0,10,10);<br />somesprite.graphics.endFill();<br /><br />// лучше заменить на<br /><br />var n:Graphics = somesprite.graphics;<br />n.clear();<br />n.beginFill(0x000000);<br />n.drawRect(0,0,10,10);<br />n.endFill();</code><br /><br /><span style="FONT-WEIGHT: bold">4) Создавайте собственные reflection-методы вместо использования getDefinitionByName(getQualifiedClassName(object))</span><br /><code>utils reflection<br />// 503мс<br />var someclass:Class = getDefinitionByName(getQualifiedClassName(someObject));<br />// getter reflection<br />public class SomeClass {<br />public function get reflect():Class {<br /> return SomeClass;<br />}<br />}<br />// 9мс<br />var someclass:Class = object.reflect();</code><br />быстрее на 5489%<br /><br /><span style="FONT-WEIGHT: bold">5) Страрайтесь использовать строгое типизирование</span><br /><br /><span style="FONT-WEIGHT: bold">6) Приводите к нужным типам, например, при чтении из массива.</span><br />Быстрее будет обращаться к image<br /><br /><code>var image: BitmapData = images[index];<br />image.getPixel(x,y)<br />//чем к<br />images[index].getPixel(x,y);</code><br /><br /><span style="FONT-WEIGHT: bold">7) Где возможно, используйте int вместо Number</span><br /><br /><span style="FONT-WEIGHT: bold">8) Операторы побитового сдвига работают быстрее:</span><br /><br />Побитовый сдвиг влево быстрее на 300% при умножении на любую степень двойки:<br /><br /><code>x = x * 2;<br />x = x * 64;<br />//равно:<br />x = x << 1;<br />x = x << 6;<br /></code><br /><br />Побитовый сдвиг вправо быстрее на 350% при делении на любую степень двойки:<br /><br /><code>x = x / 2;<br />x = x / 64;<br />//равно:<br />x = x >> 1;<br />x = x >> 6;</code><br /><br />Извлечение компонентов цвета:<br /><br /><code>//24bit<br />var color:uint = 0x336699;<br />var r:uint = color >> 16;<br />var g:uint = color >> 8 & 0xFF;<br />var b:uint = color & 0xFF;<br />//32bit<br />var color:uint = 0xff336699;<br />var a:uint = color >>> 24;<br />var r:uint = color >>> 16 & 0xFF;<br />var g:uint = color >>> 8 & 0xFF;<br />var b:uint = color & 0xFF;</code><br /><br />Объединение компонентов цвета:<br /><br /><code>//24bit<br />//24bit<br />var r:uint = 0x33;<br />var g:uint = 0x66;<br />var b:uint = 0x99;<br />var color:uint = r << 16 | g << 8 | b;<br /><br />//32bit<br />var a:uint = 0xff;<br />var r:uint = 0x33;<br />var g:uint = 0x66;<br />var b:uint = 0x99;<br />var color:uint = a << 24 | r << 16 | g << 8 | b;<br /></code><br /><br /><span style="FONT-WEIGHT: bold">9) Обмен значениями численных переменных без использования временной переменной:</span><br /><br /><code>var t:int = a;<br />a = b;<br />b = t;<br />//равно:<br />a ^= b;<br />b ^= a;<br />a ^= b;</code><br /><br />Быстрее на 20%.<br /><br /><span style="FONT-WEIGHT: bold">10) Инкремент/декремент.</span><br /><span style="FONT-WEIGHT: bold">Внимание:</span> это пример понижения производительности, но зато есть возможность понизить читабельность кода для врагов:)<br /><br /><code>i = -~i; // i++<br />i = ~-i; // i--</code><br /><br /><span style="FONT-WEIGHT: bold">11) Смена знака с помощью NOT или XOR (говорят на 300% быстрее):</span><br /><br /><code>i = -i;<br />//равно:<br />i = ~i + 1;<br />//или<br />i = (i ^ -1) + 1;</code><br /><br /><span style="FONT-WEIGHT: bold">12) Подсчет остатка</span><br /><br />Если делитель является степенью двух, то остаток можно подсчитать быстрее на 600% следующим образом:<br />остаток = делимое & (делитель - 1);<br /><br /><code>x = 131 % 4;<br />//равно:<br />x = 131 & (4 - 1);</code><br /><br /><span style="FONT-WEIGHT: bold">13) Проверка на четность/нечетность:</span><br /><br /><code>isEven = (i % 2) == 0;<br />//равно:<br />isEven = (i & 1) == 0;</code><br /><br />Быстрее на 600%.<br /><br /><span style="FONT-WEIGHT: bold">14) Абсолютное значение. Версия 1 быстрее на 250%, чем Math.abs(), а версия 2 быстрее на 20%, чем версия 1.</span><br /><br /><code>//версия 1<br />i = x < 0 ? -x : x;<br />//версия 2<br />i = (x ^ (x >> 31)) - (x >> 31);<br /></code><br /><br /><span style="FONT-WEIGHT: bold">15) Сравнение двух числе на равенство знаков</span><br /><br /><code>eqSign = a * b > 0;<br />//равно:<br />eqSign = a ^ b >= 0;</code><br /><br />На 35% быстрее.<br /><br /><span style="FONT-WEIGHT: bold">16) Быстрое конвертирование цвета из R5G5B5 в R8G8B8</span><br /><br /><code><br />R8 = (R5 << 3) | (R5 >> 2)<br />G8 = (R5 << 3) | (R5 >> 2)<br />B8 = (R5 << 3) | (R5 >> 2)<br /></code><br /><br /><span style="FONT-WEIGHT: bold">17) a++ быстрее, чем a = a + 1 и т.п.</span><br /><br /><span style="FONT-WEIGHT: bold">18) Умножение быстрее деления. </span><br /><br />Лучше использовать a = b*.5 вместо a = b / 2<br /><br /><span style="FONT-WEIGHT: bold">19) int(1.5) быстрее, чем Math.floor(1.5)</span><br /><span style="FONT-WEIGHT: bold">Аналогично int(1.5) + 1 быстрее, чем Math.ceil(1.5)</span><br /><br /></code><p></p><br /></code><code></code>Anonymoushttp://www.blogger.com/profile/13778770709453656580noreply@blogger.com0tag:blogger.com,1999:blog-393213624811119199.post-21137906807872629312008-04-03T23:44:00.000-07:002008-04-03T23:49:28.111-07:00Презентации с Флэш-потрошителяНиже приводятся две презентации, позаимствованные с <a title="Flash, Flex, Adobe AIR, флэш игры, бесплатно вакансии, компоненты, уроки flash. Документация по продуктам Adobe Flash, Flex и AIR." href="http://flash-ripper.com/">Флэш Потрошителя</a>.<br /><br /><a title="Эльдар Прилуцкий: Событийная модель AS3.0, доклад c UAFPUG-1" href="http://flash-ripper.com/archives/002298.php">Эльдар Прилуцкий: Событийная модель AS3.0, доклад c UAFPUG-1 </a><br /><a title="Ростислав Сирык: PureMVC в картинках, доклад c UAFPUG-1" href="http://flash-ripper.com/archives/002300.php">Ростислав Сирык: PureMVC в картинках, доклад c UAFPUG-1 </a><br /><br />Модифицировать сообщения, посланные в блог через функцию <strong>SlideShare </strong>"<em>Embed</em>" не представляется возможным, поэтому, из соображений полит-корректности постю это сообщение.Anonymoushttp://www.blogger.com/profile/13778770709453656580noreply@blogger.com0tag:blogger.com,1999:blog-393213624811119199.post-88472957506269651622008-04-03T23:42:00.001-07:002008-04-03T23:42:52.630-07:00PureMVC в картинках - часть 1<div style="width:425px;text-align:left" id="__ss_320960"><object style="margin:0px" height="355" width="425"><param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=puremvc-for-lazy-dev-1206461765894766-3"/><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=puremvc-for-lazy-dev-1206461765894766-3" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object><div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"><a href="http://www.slideshare.net/?src=embed"><img src="http://static.slideshare.net/swf/logo_embd.png" style="border:0px none;margin-bottom:-5px" alt="SlideShare"/></a> | <a href="http://www.slideshare.net/rost/puremvc-for-lazy-dev" title="View this slideshow on SlideShare">View</a> | <a href="http://www.slideshare.net/upload">Upload your own</a></div></div><embed height="0" width="0" src="http://counters.gigya.com/wildfire/CIMP/JnB*PTEyMDcyMDY3NDY*NjgmcD*xMDE5MSZkPSZuPWJsb2dnZXI=.swf" flashvars="" type="application/x-shockwave-flash" > </embed>Anonymoushttp://www.blogger.com/profile/13778770709453656580noreply@blogger.com0tag:blogger.com,1999:blog-393213624811119199.post-27355650796717646532008-04-03T23:41:00.000-07:002008-04-03T23:42:07.641-07:00Событийная модель Action Script 3.0 //www.flash-ripper.com<div style="width:425px;text-align:left" id="__ss_321132"><object style="margin:0px" height="355" width="425"><param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=action-script-30-1206468189142589-5"/><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=action-script-30-1206468189142589-5" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object><div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"><a href="http://www.slideshare.net/?src=embed"><img src="http://static.slideshare.net/swf/logo_embd.png" style="border:0px none;margin-bottom:-5px" alt="SlideShare"/></a> | <a href="http://www.slideshare.net/pirrest/action-script-30" title="View this slideshow on SlideShare">View</a> | <a href="http://www.slideshare.net/upload">Upload your own</a></div></div><embed height="0" width="0" src="http://counters.gigya.com/wildfire/CIMP/JnB*PTEyMDcyMDczNDk4NTkmcD*xMDE5MSZkPSZuPWJsb2dnZXI=.swf" flashvars="" type="application/x-shockwave-flash" > </embed>Anonymoushttp://www.blogger.com/profile/13778770709453656580noreply@blogger.com0tag:blogger.com,1999:blog-393213624811119199.post-48229158853536881732008-03-25T00:06:00.000-07:002008-03-25T00:11:23.664-07:00Что мы знаем о 3D-движках во Flash? //Обзор 3D Flash-технологий<a href="http://flash-ripper.com/archives/002293.php">Оригинал</a>. <a title="Flash, Flex, Adobe AIR, флэш игры, бесплатно вакансии, компоненты, уроки flash. Документация по продуктам Adobe Flash, Flex и AIR." href="http://flash-ripper.com/">Флэш Потрошитель</a><br /><br />Трехмерные миры во флэше растут не по годам, а по часам. Что у нас есть сегодня?<br /><br /><a href="http://blog.papervision3d.org/">Papervision3D</a><br />Отец большинства современных трехмерных движков для Flash. Довольно быстро развивается, имеет экспериментальные ветви разработки. Куча демок (по первой ссылке). Open Source.<br /><br /><a href="http://www.away3d.com/">Away3D</a><br />Полностью самостоятельный движок, хотя изначально базировался на коде Papervision3D, но по ходу проекта был переписан практически заново. Создан <a href="http://away.kiev.ua/away3d/">Александром Задорожным</a> из Киева (код, насколько я знаю, редактировался в FAR'е). Содержит массу уникальных возможностей, в т. ч. для текстурирования, освещения и придания рельефа поверхностям. Признан настолько хорошим, что авторы самого Papervision3D решили включить наработки Away3D в свой основной проект. К работе над Away3D уже <a href="http://away3d.com/team">подключилось</a> несколько талантливых разработчиков. Open Source.<br /><br /><a href="http://www.flashsandy.org/blog/">Sandy</a><br />Известен тем, что в использовании еще проще, чем Papervision3D (не базируясь на нем ни в коей мере), хотя и не имеет такой популярности. В общем, я не очень много знаю про Sandy, но демки у него тоже красивые. Open Source.<br /><br /><a href="http://www.ffilmation.org/website/demos/example-1/">FFilmation AS3 Flash Isometric Engine</a><a href="http://drawlogic.com/2008/03/11/as3-isometric-engine/">Многообещающий изометрический движок</a> (<a href="http://blog.wbsv.ru/?p=329">на русском</a>),<br />показывающий очень неплохую производительность. Open Source.<br /><br /><a href="http://blog.alternativagame.com/ru/">Игровая платформа Alternativa Platform</a><br />Платформа для трехмерных игр, разрабатываемая <a href="http://www.grtov.ru/ru/">Группой Товарищей</a> из Перми. За флэш отвечает <a href="http://antonvolkov.com/">Антон Волков</a>. Движок впечатляет уникальными возможностями и перфекционистской проработкой всего на свете, имеет продуманную схему интеграции с сервером.<br /><br /><a href="http://www.zenbullets.com/isometric/">ZenBullets Flash Isometric 3D Game Engine</a><br />Про этот движок я знаю еще меньше, позиционируется как изометрическая игровая платформа, но демки пока весьма скромные.<br /><br /><a href="http://www.custommedia.co.nz/category/swfz/">SWFZ</a><br />... кажись, единственный честный рейтрейсер (отрисовка по-пиксельно)Anonymoushttp://www.blogger.com/profile/13778770709453656580noreply@blogger.com0tag:blogger.com,1999:blog-393213624811119199.post-44667538268264130022008-03-24T23:56:00.000-07:002008-03-25T00:05:22.049-07:00Создание кастомного Design-time View для своего Flex 3 компонента //Важно<a href="http://flash-ripper.com/archives/002294.php">Оригинал</a>. <a title="Flash, Flex, Adobe AIR, флэш игры, бесплатно вакансии, компоненты, уроки flash. Документация по продуктам Adobe Flash, Flex и AIR." href="http://flash-ripper.com/">Флэш Потрошитель </a><br /><br />Иногда необходимо сделать кастомный Design-time Preview для компонента (это его вид в "Design View" Flex Builder-а). Для этих целей в Adobe Flex 3 SDK есть недокументированый класс <em>mx.core.UIComponentGlobals</em>. В этом волшебном классе лежит не менее волшебное поле <em>designMode:Boolean</em>.<br />В Design View среда Flex Builder пытается "выполнить" код и отобразить что-либо, следовательно можно прописать проверку на designMode и делать то, что хотим.<br />Итак:1. Возьмем ActionScript-компонент для Flex Bulder 3.2. Заоверрайдим метод <em>createChildren()</em>:<br /><div id="code" rows="6">override protected function createChildren():void {<br />super.createChildren();<br />if (UIComponentGlobals.designMode) {<br />//здесь мы создаем child-ы, которые будут в design mode<br />}<br />}</div><br />3. Заоверрайдим метод <em>updateDisplayList()</em>:<br /><div id="code" rows="6">override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void {<br />super.updateDisplayList(unscaledWidth, unscaledHeight);<br />if (UIComponentGlobals.designMode) {<br />//здесь мы рисуем то, что будет видно в design mode<br />}else {<br />//а здесь то, что в runtime<br />}<br />}<br /></div><br />Вуаля! Пример компонента можно взять <a href="http://anychart.com/tips_and_tricks/designMode/DesignModeComponent.zip">здесь</a>.Anonymoushttp://www.blogger.com/profile/13778770709453656580noreply@blogger.com0tag:blogger.com,1999:blog-393213624811119199.post-67086828424749875602008-03-09T13:10:00.000-07:002008-03-10T13:21:03.078-07:00AS2 автоматическая сборка компонентов без Flash IDE, с помощью FlashDevelop //Инструкция<a href="http://groups.google.com/group/ruFlash/browse_thread/thread/5b02887db455d78b/706095620bf0feee?hl=ru#706095620bf0feee">Оригинал</a>.<br /><br />Да-да стоят перед некоторыми и такие задачи :)<br /><br /><p>Итак, надо:<br />собрать swc, включающий swf компонента, catalog.xml, asi-файлы классов. </p><p>swf должен содержать клип, ассоциированный с классом компонента и все<br />графические ассеты в библиотеке. </p><p>здесь помогает swfmill - пишем xml собираем swf. ( :) предварительно<br />пришлось поразбирать несколько swf, компиленных во FLASH IDE чтоб<br />понять как писать xml) </p><p><... редакция класса ... > </p><p>компилим mtasc - с инъекцией кода (проще говоря обновляем классы в ролике) </p><p>для генерации asi используем igen из тулзов flashdevelop'a<br />(оказывается asi это intrinsic :) ) </p><p>пишем bat-файл (запускаем его как post-build команду), нечто вроде: </p><p>rem установка переменных </p><p>set tools="C:\Documents and Settings\ddns\Local Settings\Application<br />Data\FlashDevelop\Tools\" </p><p>rem вызываем igen </p><p>%tools%\igen\igen -clean src bin</p><p>rem переименовываем получившиеся *.as файлы в *.asi </p><p>for /R bin\ %%A in (*.as) do if exist %%A (<br />erase /q bin\%%~nA.asi // если такой файлик есть то стираем его.<br />rename %%A %%~nA.asi<br />) </p><p>erase bin\3d.swc </p><p>rem архивируем winrar'ом в zip </p><p>C:\Progra~1\winrar\winrar a -afzip bin\3d -r -ep1 -m5 -x*.bat -x*.exe bin\</p><p>rem изменяем расширение на *.swc<br />rename bin\3d.zip 3d.swc </p><p>rem :) опционально подкладываем файлик в папку компонентов флеша. </p><p>copy /Y /B bin\3d.swc "C:\Documents and Settings\ddns\Local<br />Settings\Application Data\Adobe\Flash<br />CS3\en\Configuration\Components\"<br /></p><p>/////////////////////<br /><br /></p><br /><p>Остается нерешенным вопрос, а как бы сгенерировать автоматически catalog.xml<br />для компонента?<br />Кто-нибудь что-нибудь посоветует? </p><p>xml вида: </p><p><componentPackage xmlns="<a href="http://www.macromedia.com/flash/swccatalog/7" target="_blank" rel="nofollow">http://www.macromedia.com/flash/swccatalog/7</a>"><br /><component id="myComponent" class="ComponentClass"<br />implementation="libc.swf" iconFile="libc.png"<br />src="Component3Dworks.asi" modified="1204586771"><br /><movieBounds xmin="0" xmax="11000" ymin="0" ymax="8000" /><br /><include id="boundingBox_mc"/><br /><include id="activity"/><br /><exportAfter id="__Packages.ComponentClass"/><br /><class id="ComponentClass" ><br /></class><br /><class id="MovieClip" ><br /></class><br /><asset id="boundingBox_mc" modified="1204576209"><br /></asset><br /><asset id="activity" modified="1204578626"><br /></asset><br /><asset id="__Packages.ComponentClass" src="ComponentClass.asi"<br />modified="1204586020"><br /></asset><br /></component><br /></p>Anonymoushttp://www.blogger.com/profile/13778770709453656580noreply@blogger.com0tag:blogger.com,1999:blog-393213624811119199.post-69324277951330657422008-02-24T11:24:00.000-08:002008-02-24T11:29:15.180-08:00AIR Applications Ext. Updating //Приложение к статье RAFPUG 3<a href="http://flashimp.ru/2008/02/air-applications-ext-updating.html">Оригинал</a>. <a href="http://flashimp/">Flashimp.ru</a><br /><br />Переписал com.codeazur.utils.AIRRemoteUpdater и вот что получилось: <a href="http://flashimp.ru/files/projects/UpdaterExample.zip">UpdaterExample</a> Чтоб увидеть в работе выполните вследующие действия:<br />-- импортируйте во флекс скачанный проект<br />-- откройте конфигурационный файл проекта «UpdaterExample-app.xml»<br />-- измените в нём значение в ноде «» на 1 Получится так «1»<br />-- скомпилите проект<br />-- установите только что созданное приложение<br />-- найдите в «Program Files» наше приложение и в его корневую директорию скопируйте (если её нет) папку «assets» , которая лежит у Вас в импортированном проекте в папке «src». В этой папке должен лежать дистрибутив AIR-приложения с тем же ApplicationID и большим значением версии в «UpdaterExample-app.xml». Имя дистрибутива я «гвоздями» забил: Открываем в проекте «scripts/update.as» и смотрим восьмую строку.<br />-- идём на «рабочий стол» и запескаем наше приложение<br />-- давим кнопку «Alert applicationDescriptor»<br />-- давим кнопку «Update» и радуемся жизни :)Anonymoushttp://www.blogger.com/profile/13778770709453656580noreply@blogger.com0tag:blogger.com,1999:blog-393213624811119199.post-76404691875126816432008-02-19T04:12:00.000-08:002008-02-19T04:20:27.460-08:00Как настроить правильную выдачу AIR-файлов с сервера //Строчка к конфигурации Apache<a href="http://flash-ripper.com/archives/002232.php">Оригинал</a>. <a title="Flash, Flex, Adobe AIR, флэш игры, бесплатно вакансии, компоненты, уроки flash. Документация по продуктам Adobe Flash, Flex и AIR." href="http://flash-ripper.com/">Флэш Потрошитель</a><br /><br />Чтобы сервер давал пользователям скачать с него AIR-файлы, нужно указать ему их MIME-тип:<br /><br /><code>AddType application/vnd.adobe.air-application-installer-package+zip .air</code><br /><br />Если вам повезет, тип указывать не придется. Если не повезет, или везение закончится при обновлении серверного ПО, то пользователи вместо AIR-файлов будут получать не AIR-файлы.<br /><br />Я внедрил эту информацию в Apache через файл .htaccess в соответствующем каталоге — и все.<br />Если вы решите поступить так же, то учтите, что предпочтительнее добавить MIME-тип в конфигурацию сервера (а не в .htaccess) и сохраните производительность, ведь конфигурация читается один раз на старте, а файлы .htaccess запрашиваются значительно чаще — при доступе к файлам.Anonymoushttp://www.blogger.com/profile/13778770709453656580noreply@blogger.com0tag:blogger.com,1999:blog-393213624811119199.post-78815714692435594032008-02-18T05:30:00.000-08:002008-02-18T05:35:42.790-08:00Средства программной анимации: где взять, что и получить за это. //Твинеры разных сортов<a href="http://the33cows.com/actionscript-30/2008/02/01/36/">Оригинал</a>. <a href="http://the33cows.com/">33 коровы.</a><br /><br />Большинство наверое использовала в своих проектах для программной анимации класс mx.transitions.Tween, так знайте он не одинок в своем роде). Кто его не видел — исправляетесь, прочитав <a href="http://www.actionscript.org/resources/articles/170/1/Flash-MX-2004-Undocumented-TweenEasing-Classes-Documented/Page1.html" target="_blank">его описание с примерами</a>.<br /><br />Всего существует несколько проектов, которые помогают программировать анимацию, в начале классы от “родного” производителя:<br /><ul><li>mx.transitions.Tween, есть как и в CS3 так и МХ-8 флешах ) </li><li>mx.effects.Tween есть в как и в AS2 так и AS3 вариантах, AS3 примечателен тем, что лежит в основе всех эффектов используемых во Flex, в использовании не очень удобен, но терпим, он единственный доступен, по умолчанию, во флексе. </li></ul><p>Оба класса имеют недостатки: если экземпляр класса описан как локальная переменная то мусорщик свободно может его убить и эффект не до играет до конца.</p><p>И классы от стороннего производителя:</p><ul><li>Tweener (caurina.transitions.Tweener), <a href="http://code.google.com/p/tweener/" target="_blank">домашняя страничка</a>Радует поддержкой ActionScript 2.0, for Flash 7 and Flash Lite 2.0 ActionScript 2.0, for Flash 8, ActionSctipt 3.0, также портирован для JavaScript и haXe. <a href="http://flash-ripper.com/">Рост</a> тоже очень <a href="http://flash-ripper.com/archives/002022.php">радовался</a> за него. </li><li>TweenLite, обещают быструю производительность и дополнительные настройки уравнений движения. Есть версия для <a href="http://blog.greensock.com/tweenliteas2">ActionScript 2.0</a> и <a href="http://blog.greensock.com/tweenliteas3">ActionScript 3.0</a>, Страницы содержат описание, примеры кода и использования данного класса </li><li><a href="http://www.boostworthy.com/blog/?p=170">AS3 Animation System v2.0</a> — много очень много разных плюшек, заточеных под AS3, нужно просто полистать документацию (лежит в архиве с исходниками<a href="http://www.boostworthy.com/code_shared/boostworthy_animation_v2_1.zip"> лежит в архиве с исходниками</a> ) </li><li><a href="http://www.goasap.org/index.html">GOASAP</a>. Самый шустрый из твинов. Ребятки чтобы доказать это наваяли <a href="http://www.goasap.org/info.html#benchmarks">тесты производительности</a> </li></ul><p>Как видно из этой диаграммы cтандартный твин просто отдыхает, что есть обидно( а если учитывать ресурсоемкость флекс-фреймворка то это вобще плохо.<br />В данной статье я не рассматривал классы которые имею только AS2 версию, потому что это уже не актуально!</p>Anonymoushttp://www.blogger.com/profile/13778770709453656580noreply@blogger.com0