07/12/2009

Tips & Tricks 3

Опубликовано в: Опыт — Тэги: , — Nicolas Prof @ 22:05
  1. Papervision: При использовании 3Д на сайте, в 90% случаев необходимы 3D объекты в масштабе 1:1 к 2D объектам. В последнем проекте необходимо было сделать куб как элемент навигации, при этом текстуры на гранях не должны были масштабироваться:

    Actionscript:
    1. _camera.z = (_camera.zoom - 1) * _camera.focus + _cubeSide * 0.5;

    куб находится в нулевых координатах.

  2. Если есть XML дерево, в котором, одно и тоже XML property может присутствовать не во всех элементах дерева. И при применении фильтра:

    Actionscript:
    1. myXML..item.(@id == someID)

    вы получаете ReferenceError о том, что переменная @id не определена. Используйте другой фильтр:

    Actionscript:
    1. myXML..item.(attribute('id') == someID)

  3. При разработке сайта, на котором будет функционал требующий работы с SharedObject, приходится поверять логику работы, когда человек впервые на сайте, и не только. Самый простой способ, это удалить файл .sol. Если вы думаете, что очистка кэша в браузере поможет вам, то вы ошибаетесь. Так же вы конечно можете сделать программную кнопку, при нажатии на которую, будет происходить удаление SharedObject. Но все же, пару раз удалить файл из системы, как по мне, проще. Более подробно, где их искать в различных системах, можно почитать в Wikipedia
  4. Timer отрабатывает не сразу после вызова метода start(), а лишь через значение delay, которое вы указали в конструкторе. Что бы заставить отработать сразу, правильнее всего сделать вот так:

    Actionscript:
    1. _someTimer.dispatchEvent(new TimerEvent(TimerEvent.TIMER));
    2. _someTimer.start();

    Actionscript:
    1. this.someTimerListener(null);

    Вызвать сразу listener, плохо тем, что вы не сможете использовать updateAfterEvent

  5. Маска с поддержкой прозрачности с помощью BlendMode. Хорошая вещь, как для программистов, когда требуется создать полупрозрачную маску, и при этом контент под маской анимируется, так и для аниматоров, так как не нужно никакого кода.
    Техника очень проста:
    есть контейнер в котором все объекты, маска и содержимое, которое нужно поместить под маску. Для этого контейнера устанавливаем BlendMode.LAYER.

    Actionscript:
    1. _container.blendMode = BlendMode.LAYER;

    Все размещается по слоям. Маска обязательно находится выше содержимого. Для маски устанавливаем BlendMode.ALPHA.

    Actionscript:
    1. _gradMask.blendMode = BlendMode.ALPHA;

    Если необходимо маскировать содержимое выходящее за пределы маски, создается еще одна маска, и уже привычным способом применяется к содержимому

    Actionscript:
    1. _content.mask = _mask;

    В итоге, все будет выглядеть где то так:

    Actionscript:
    1. _container.addChild(_content);
    2. _container.addChild(_gradMask);
    3. _container.addChild(_mask);
    4.            
    5. _gradMask.mouseEnabled = false;
    6. _gradMask.blendMode = BlendMode.ALPHA;
    7. _container.blendMode = BlendMode.LAYER;
    8. _content.mask = _mask;

    P.S.
    Более подробно для аниматоров. Создаем Movieclip, меняем ему BlendMode на Layer, помещаем в него 3 Movieclip'a: Нижний слой - Содержимое, Средний слой - маска, делаем ее маской для содержимого, Верхний слой - полупрозрачная маска, меняем ей BlendMode на Alpha (не нужно полупрозрачную маску совать под маску, или пытаться ее тоже сделать маской).

    P.P.S.
    Если кто то всю жизнь пользовался только таким способом с помощью BlendMode, то для вас есть более простой способ, который отлично подходит для статического содержимого, к примеру текст.

    Actionscript:
    1. _mask.cacheAsBitmap = true;
    2. _content.cacheAsBitmap = true;
    3. _content.mask = _mask;

    Те же кто думал, что нужно BlendMode + cacheAsBitmap, то исправляйте код. Разве что вы могли использовать cacheAsBitmap для сложного вектора.

02/07/2009

Tips & Tricks 2

Опубликовано в: Опыт — Тэги: , , — Nicolas Prof @ 17:00

1. Быстрое получение значения после запятой.

Actionscript:
  1. public function getDecimal($value : Number) : Number {
  2.     return $value - ($value>> 0);
  3. }

2. Что бы не было проблем с получением DisplayObject'а после использования myMovieClipHolder.gotoAndStop(). Используйте Event.ENTER_FRAME, до того как событие отработает один раз. Использование MovieClip распространено в многоязычных версиях сайтов, сделав лэйблы: ru, en, ua.

Actionscript:
  1. private function onChangelanguage(e : Event) : void {
  2.     if(_k> 0){
  3.         this.removeEventListener(Event.ENTER_FRAME, onChangelanguage);
  4.         registerMC();
  5.     }
  6.     _k++;
  7. }

3. Являюсь ярым поклонником TweenLite разрабатываемого Jack Doyle. Не так давно, проект стал платформой для программной анимации, и легко расширяется плагинами. Я с вами поделюсь двумя плагинами, один из которых я использую в 40% всех программных анимаций - AutoDeletePlugin. ShortRadianRotationPlugin - позволяет работать с радианами, как это сделано в Alternativa 3D. AutoDeletePlugin - применяется только для DisplayObject. По завершению анимации, больше не нужно использовать onComplete, что бы удалить DisplayObject.

4. Быстрый и удобный, но не самый надежный способ убрать интерактивность с элементов интерфейса. Допустим есть некая форма, элементы которой содержатся в одном контейнере, пусть он будет называться formHolder.

Actionscript:
  1. private function toggleForm($state : Boolean) : void {
  2.     formHolder.mouseChildren = $state;
  3. }

Главный минус такой реализации, что необходимо следить за теми элементами интерфейса, которые требуют игнорирования событий от мыши. К примеру лейблы на кнопках, если таких элементов нет, то можете использовать этот метод смело. Так же можно дать понять пользователю, что форма действительно неактивная, добавив одну строчку кода:

Actionscript:
  1. private function toggleForm($state : Boolean) : void {
  2.     formHolder.mouseChildren = $state;
  3.     formHolder.alpha= ($state) ? 1 : 0.6;
  4. }

5. Разрабатывая Pure AS3 проект, вы не сможете использовать «плюшку» Flash Player 10 для работы с текстом. Так как новый фреймворк для работы с текстом использует совсем другой тип встроенного текста, обычный встроенный текст в проекте имеет тип EMBEDDED, когда необходим EMBEDDED_CFF. Решить эту проблему сможет лишь новый Flex SDK 4 версии с расширенным метатэгом Embbed. Но учтите, шрифт будет встроен дважды.

03/06/2009

Tips & Tricks 1

Опубликовано в: Опыт — Тэги: , , , — Nicolas Prof @ 19:17

Как и ранее обещал, начинаю рубрику полезных советов, наблюдений и уклонов от граблей. Поехали.

  1. Есть форма построенная на собственной разработки UI компонентах, очень любимых нами, или может даже с помощью стандартных компонентов, которые кстати очень даже качественно написаны. И при отправке формы, или при каких либо других действиях требующих от нас временного блокирования формы кто то возможно попробует перебрать список UI компонентов, и если это наши компоненты вызвать некий метод ui.active = false, или если стандартные, то ui.enabled = false. Но такая операция трудоемкая, совсем никому не нужный лишний цикл, плюс ко всему ошибки, если форма сложная, то еще и проверки. Так вот, делать это все не надо, потому как есть намного изящный и на порядок более быстрый подход, а так же из-за простоты реализации еще и снижающий вероятность ошибки. Для блокировки форм, и любых других интерактивных объектов, лучше всего использоваться Sprite. Если необходимо показать какое то модальное окно, то просто добавляем на Stage, наш блокирующий слой, у меня как правило он называется незамысловато _blockLayer. Блокирующий слой заливается посредством Graphics любым цветом с полной прозрачностью и не одно MouseEvent событие не пройдет сквозь блокирующий слой. А еще более быстрый способ, это не использовать Alpha, а использовать BlendMode. Так же закрашиваем блокирующий слой черным (кто не знает, это 0 или умнее 0х000000), и ставим _blockLayer.blendMode = BlendMode.ERASE.
  2. Отдавайте предпочтение маскам реализованным за счет Rectangle, т.е. anyDisObject.scrollRect = new Rectangle(0,0,100,50). Но не забывайте, для премущества от ScrollRect необходимо маскируемый объект кэшировать как изображение cacheAsBitmap = true. Есть несколько неудобств при использовании ScrollRect - при перемещении, необходимо постоянно обновлять прямоугольник anyDisObject.scrollRect = _dynamicRectangleRef, ну и естественно, что бы не создавать каждый раз новый объект, правильно изначально создать Rectangle, и менять нужные нам параметры: x, y, width, height.
  3. Перед удаление объекта с Display List, сделайте объект невидимым, objToDelete.visible = false. Освободите немного памяти, которой всегда нехватает.
  4. Если ссылке на объект типа Sound назначить null, то тяжелый объект будет сразу высвобожден с памяти.
 

Меню:
Twitter Updates:
    Архив:
    Управление:
    Flash & Flex знакомые: