Архив за марта, 2009

Альтернатива “Cache as bitmap” - разгружаем процессор

27.03.2009, автор: Stormit, рубрики: ActionScript

Наверное многие знают и умело используют такую замечательную возможность во флеше как “Cache as bitmap“. При этом, с клипа делается виртуальный снимок в виде картинки и вектор не пересчитывается для отрисовки каждый кадр. Можно рисовать графику в векторе прямо во флеше, потом в панели свойств включить кэширование и на выходе плеер получает растровую картинку. Очень удобно, можно быстро вносить изменения и сразу любоваться результатом минуя фазу экспорта/импорта в PNG. Плюс ко всему - экономия траффика.

Звучит приятно и обычно всё хорошо работает, но я столкнулся с тем, что с клипами больших размеров, тормоза частично остаются. В одной платформенной игре у меня был фон 1200х1200, который лежал на заднем плане и должен был просто смещаться, пока персонаж бегает по уровню. Так вот, анимация происходила с небольшими рывками. Такое впечатление, что флэш время от времени пересчитывает данные и делает “обновлённый” снимок с клипа. Так или иначе, но факт имел место и такие тормоза были. Это решалось заменой векторного фона растровым (PNG), но такая флешка весила очень много.

Но не зря мы все так любим флеш - у него в арсенале достаточно инструментов чтобы решить эту проблему. Мы снимаем с флеша ответственность по растеризации векторной графики и берём её на себя. Будем использовать BitmapData и маленькую функцию, приведённую  ниже.  В добавок мы получаем возможность обрабатывать нашу картинку как игре угодно: добавить следы от взрыва, осколки, пятна.

На примере ниже можно увидеть как это работает. Большое количество градиентов и  объектов нас больше не пугают, потому что пикселы отрисовать в разы быстрее чем рассчитать вектор по точкам. Так будет видеть flashPlayer наш клип:

Читать полностью »

35 Хитрых

Crimsonland 3: Выживание на практике

19.03.2009, автор: Stormit, рубрики: ActionScript, Flash игры, Игровые баннеры

Мне уже порядком поднадоела эта тема, но люди просят рассказать каким образом создаются монстры, летят пули и как определяется попадание. Надеюсь это многим поможет, тем более что поняв эти простые истины, можно создать много разных flash игр.

На самом деле о некоторых вещах я уже писал раньше. Например, монстры будут появляться таким же способом, как препятствия в баннере с мячиком (помните?). Для простоты изложения мы будем использовать процедурный способ программирования с разделением кода на слои :). Потом так будет удобнее ориентироваться в коде (это первый шаг к классам и ООП).

Итак, из предыдущих постов у нас есть главный герой, готовый ринуться на толпы врагов. Я заменил базуку на пулемёт и немного повысил его манёвренность (скорость ходьбы и поворота). Слайд 1.

Подробно о том, как теперь устроен клип body клипа hero показано на слайте 2. При щелчке мышью, начинает проигрываться анимация стрельбы и во втором кадре вызывается функция placeBullet(), которая добавляет пулю на сцену. Это единственное место в этом примере, где вызов функции идёт из клипа, а не с главной линейки. Обратите внимание, что появился вспомогательный клип dot - он нужен чтобы пересчитать по нему правильные координаты пули в момент вылета из ствола. Это идеальный способ, когда дуло не находится точно на осях X и Y. Внутри всех вспомогательных клипов я пишу _visible = false. Так они не заметны для глаза, но доступны для кода.

Дальше создаём клип для противника с именем spider и прочую атрибутику: пулю (bullet) и спецэффект для поражения (boom). Клип spider состоит из 2-х кадров (состояний). В первом клип с анимацией ходьбы (здесь же и клип hit, который нужен для проверки попадания), а во втором - клип а анимацией погибания (когда анимация доигрывается, в последнем кадре вызывается _parent.removeMovieClip() которая удаляет противника (в данном случае _parent - это клип spider). Клип пули bullet - просто рисунок снаряда (при _rotation = 0 смотрит вправо). Клип boom - имитация кровавого всплеска. Все эти клипы присутствуют на линейке, но лежат далеко за пределами сцены чтобы случайно не попали в кадр (или выполнить для них _visible = false). Потом с каждого будет создаваться дубликат и использоваться по необходимости.
Создаём прямоугольный клип ground который площадью должен покрыть всю сцену. Противники будут появляться, учитывая его границы, а пули будут удаляться (в смысле delete), когда вылетят за его пределы. Слайд 3.
Читать полностью »

58 Хитрых