+183.33
52 читателя, 99 топиков

Как избежать путаницы id, или что делать если от int нельзя наследоваться.

Проблема путающихся IDЭта статья будет полезна людям делающим большие клиент-серверные приложения или игры. Для остальных она тоже может представлять интерес, предоставляя новый взгляд на привычные методы программирования на ActionScript3.

Вступление


Трудно представить себе игру в которой бы не использовалось ни единого id, «айдишки» — члена класса используемого для хранения уникального идентификатора любой игровой сущности, например врагов, пуль, предметов инвентаря, городов и тп. Если же говорить об игре взаимодействующей с сервером то важность id там еще более велика, так как при любых действиях со стороны игрока именно id уходит на сервер в одном из параметров вызванного серверного метода чтобы указать что именно сделал игрок.

Проблема

В последнее время я столкнулся с тем что начали путаться id от разных сущностей, что вызвало проблемы. Например есть армия, у нее свой id, а так же в ней есть герой у которого тоже id. Метод который дергаем на сервере чтобы армия отправилась в путь содержит id армии, а метод который надевает экипировку на героя содержит айди героя. И таких соседствующих айди в проекте довольно много. Начали возникать ситуации когда ошибочно в метод который отправляет данные на сервере вместо id героя начали попадать id армии и тп. Думаю понятно что обращение к серверу с несуществующим или чужим айди не может не вызвать ошибок. Потому встала задача разделить id каким то образом и возложить обязанности контроля за этим разделением на компилятор.

Читать дальше →

Удобная вставка текста в текстовые поля кнопки

Это первый пост, потому хочется начать с чего-нибудь простого. Расскажу о функции, которая сильно упрощает мне жизнь при создании GUI.

Лирическое вступление

Для формирования сложного GUI (например игрового) я почти всегда использую следующий способ: GUI формируется в fla файле (каждое окно — отдельный класс), всем кнопкам, текстовым полям и тп прописываются instance name, а затем окно или несколько экспортируется в swc, которые подключаются к проекту (например FlashDevelop), пишутся классы наследованные от классов втянутых из swc в которых я уже вношу текст на кнопки, привязываю обработчики событий, и вообще из шаблона делаю собственно GUI. Делая так я имею возможность импортировать макеты окон прямо из PSD файлов и быстро подключать их к проекту. Уверен что этот прием известен большинству flash-разработчиков, потому продолжим (если есть необходимость в статье об этом — скажите).

Первая проблема

В процессе написания класса окна унаследованного от класса из swc часто возникает необходимость просто и быстро вписать текст в текстовое поле, являющее дочерним объектом не для самого окна, а например обернутое в один или несколько MovieClip-ов. Обычно такая ситуация решается одним из трех способов:
Читать дальше →

Применение класса hq3x или вращаем pixel art

Давным-давно, я поднимал тему про вращение растрового изображения без порождения эффекта лестницы.
Наконец-то я достиг максимальных результатов в этом деле, т.к. постоянно работаю с pixel art'ом и мне хотелось избавиться от этого ужасного проклятия — «лесенки».

Объяснить мне это тяжело, поэтому буду все показывать в картинках:


Эффект лесенки
Читать дальше →
  • +24

Фабричный метод

Раз тут такая пьянка пошла, то и я внесу свою лепту :)

В этой статье я кратко расскажу о таком порождающем паттерне проектирования как «фабричный метод», а также приведу пример того, где его можно использовать касательно игр.


Читать дальше →

Паттерн Singleton

А давайте расскажу интересное — про паттерн проектирования Синглтон. Кто-то знает и пользуется, а кому-то вдруг и пригодится.

forever singleton

Согласно одному из определений, паттерн проектирования — это пример наиболее удачного проектного решения в области объектно-ориентированного программирования, описание взаимодействия объектов и классов для решения стандартной задачи проектирования. Другими словами — это наиболее удачный подход к построению структуры классов и взаимосвязи между ними для решения некой стандартной задачи в проектировании программы.

Синглтон («Singleton» — одиночка) используется в случае, если на все приложение необходим только один экземпляр определенного класса, доступ к которому можно будет иметь из любого места.

Предположим, что мы имеем некий класс SoundManager, который отвечает за воспроизведение всех звуков в игре. Скажем, есть у него публичный метод playExplosionSound(). До того, как мне стало известно о синглтоне, для того, чтобы вызвать этот метод из какого-нибудь глубоко упрятанного класса, приходилось делать что-то вроде myParent.myParent.soundManager.playExplosionSound(), а то и ещё померзостней.

При помощи синглтона это всё делается проще. Мы создадим статическую переменную instance в классе SoundManager, и при инициализации класса будем, во-первых, сохранять в неё свежесозданный экземпляр класса, а если эта переменная непуста, то выдавать ошибку, т.к. кто-то явно пытается создать второй экзепляр SoundManager.

Существует стопицоттыщмильёнов реализаций синглтона и, похоже, каждый программист считает долгом придумать свою. Я опишу пару очень простых, без изысков.
Читать дальше →

Update: Растеризация MovieClip в последовательность BitmapData

Пост для тех, кто использует метод, описанный мной в Растеризация MovieClip в последовательность BitmapData — я его обновил.
Советую заглянуть туда и обновить код у себя в играх, ибо будет вам ускорение.

Суть в следующем: getColorBoundsRect оказался излишне медленным, когда он работает на большой битмапе (спасибо Эду Рыжову, который это заметил). То-есть, когда черновая битмапа становится, скажем 1024 на 1024, из-за какой-то большой картинки, а последующие картинки рендерятся маленькие, то сильно теряется время. Но без getColorBoundsRect обойтись нельзя, если вы используете маски. Я попробовал просто каждый раз пересоздавать черновую битмапу и оказалось, что выделение памяти настолько быстро, что общее время теперь не сильно отличается от времени без использования getColorBoundsRect вообще. На моем текущем проекте старый вариант занимал 2400ms, новый 700ms, без использования черновой битмапы и getColorBoundsRect 685ms. Обновил код и инструкцию.

Честный таймер

На днях у меня возникла резко возникла необходимость в «правильном» таймере для генерации событий. Когда затестировал стандартный Timer на маленьких временных интервалах я пришел в тихий ужас, например, на величине тика 125мс я получил колоссальное расхождение между реальными шагами порядка 30 процентов или около того. И вот я стал думать, а что же мне вообще делать?
Читать дальше →

CPMStar: решение проблемы криворуких рекламщиков

Маленькая заметочка для тех, кого бесят баннеры цпмстар, ломающие флешку.
Читать дальше →

Плавное вращение камеры в Alternativa3d + multiple загрузка Embed ресурсов

В моем варианте используется небeзызвестный TweenLite, смотрим под кат
Читать дальше →

MouseOver и MouseOut для линка в тексте. Часть2: Стили

Данный пост является продолжением моей первой публикации и будет более кратким. Напомню, в предыдущей раз я показал как можно получить события MouseOver и MouseOut для ссылки в htmlText. Возьмем для примера TLFTextField. Наши ссылки выглядят в нем просто ужасно, они мерзкого синюшного цвета да еще и underline(((

Давайте это лечить
Читать дальше →