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 для сложного вектора.

Оставить комментарий

 

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