Продолжаем тему Flash разработки. Сегодня на очереди три маленькие хитрости, которыми я поделюсь. Если кто не знает, то мы решили стартовать серию сообщений вопрос-ответ по флеш... у нас полная демократия - кто угодно может спросить что-то интересующее его из мира флеш, а я постараюсь ответить :)
Сегодня в номере:
| ![]() |
BlendMode - будьте аккуратны с этим зверем
Начну с того, что расскажу, что графические объекты могут по-разному накладываться и смешиваться на экране. Режимов много: Add, Alpha, Darken, Difference, Erase, Hardlight, Invert, Layer, Lighten, Multiply, Normal, Overlay, Screen, Shader, Subtract. И каждый служит для своих целей.
Особенно этими штуками часто пользуются художники, добиваясь потрясающих цветов и переходов.
Но я из этих всех способов наложения объектов при программировании использую лишь Normal и Layer. Выставляется это дело просто:
MyDisplayObject.blendMode = BlendMode.LAYER;
Название "нормальный" говорит само за себя, и я в основном этим режимом и пользуюсь, однако есть у него один недостаток. Накладываем несколько объектов, а затем изменяем прозрачность у их родителя... ба-бах, и вылезают артефакты, которые совсем не хотелось бы, чтобы они вылезали. Выглядит это так:
Видите? На средней картинке объекты стали прозрачными "по отдельности" и выглядит это надо сказать ужасно. Перехлест тайлов травы стал очень темным, а через голову девочки можно увидеть травинки, да и вообще цвет лица теперь с зеленцой! А вот режим Layer (справа) лишен вышеописанного недостатка, все выглядит как надо, зато у него есть другой недостаток :)
Итак, плавное появление диалогов и элементов уровня я делал через Layer, а затем обнаружил катастрофическое падение производительности при таком режиме. Я показывал целый уровень, со всякими объектами, анимациями, кнопками и прочим. И обнаружил слайдшоу, всего 5-7 фпс. На самом деле я довольно долго ломал голову, что же я такое натворил, а потом отключил Layer и обнаружил, что этот зверь оказался прожорливее, чем я мог себе представить. В итоге - оставил везде режим Normal, и просто увеличил скорость перехода от одного экрана к другому, чтобы игрок не успел заметить артефакты прозрачного наложения.
Как я храню несколько анимаций в одном мувике
Совсем недавно в своих играх мы начали применять покадровую анимацию. Зверушка моргает глазами, прыгает, кушает и так далее - все это рисуется по кадрам, и при воспроизведении зверек оживает.
Так вот при создании анимации всяких игровых элементов возникает вопрос о том, как всем этим барахлом манипулировать. Сейчас я расскажу о способе, которым пользуюсь на данный момент, затрону плюсы и минусы.
Итак, анимация одного персонажа полностью лежит в одном мувике. Первые десять кадров - прыжок, следующие пятнадцать кадров бег, затем карабкается, еще двадцать кадров стреляет и так далее. Ставим текстовые метки на кадрах и вуаля - теперь мы можем легко найти первый кадр нужной анимации! В итоге остается один вопрос - как осуществлять навигацию по кадрам? Да все просто:
var fSuperMan = new mcSuperMan; fSuperMan.gotoAndPlay('fly');
На последнем кадре каждой анимации ставлю stop(), что обеспечит остановку проигрывания анимации. Также номер кадра можно и вручную отслеживать по значению fSuperMan.currentFrame.
Итог:
- можно хранить все анимации героя в одном клипе
- насколько я понял, так намного проще анимировать художникам
- все-таки текстовые метки довольно удобны, можно, к примеру, рандомно выбирать анимацию из текстового списка
всякие полезные параметры stage'а
Как-то раз один из спонсоров попросил, чтобы игра нормально скейлилась, сохраняя пропорции и вообще свой игровой вид. Оказалось, есть параметр scalable, который как раз отвечает за это все безобразие. Примеры:
stage.scaleMode = StageScaleMode.EXACT_FIT; // искажает пропорции, но масштабируется до окна stage.scaleMode = StageScaleMode.NO_SCALE; // ничего не скейлится :)
Наверняка многие видели надоедливый желтый прямоугольник, который появляется при нажатии клавиши tab? Он раздражает не только игроков, но и многих спонсоров... Отключается легко:
stage.stageFocusRect = false;
При добавлении в игру всяких окошек, менюшек и тому подобных интерактивных кнопок, клавиатурные клавиши перестают работать, сталкивались? На самом деле просто фокус ввода уходит с элемента, для которого был привязан слушатель KeyboardEvent'а. Чтобы вернуть все как было, достаточно выполнить:
stage.focus = MyInteractiveObject;
сразу после пропадания вышеназванных менюшек, ставших причиной бага.
При переносе проектов с FlashDevelop на FlashBuilder и обратно, у меня иногда возникают проблемы во всяких там настройках, таких как разрешение флешки и фреймрейте. Чтобы постоянно не лазить в настройки проекта, для установки фреймрейта я пользуюсь такой строчкой, дописав ее, допустим, в самое начало прелоадера:
stage.frameRate = 35;
В общем-то и все, что мне приходит на ум сейчас, наверно :)
На этом сегодняшний выпуск завершен, ждите продолжения в ближайшее время! Не скучайте, товарищи и приятного вам дня!