Показаны сообщения с ярлыком код. Показать все сообщения
Показаны сообщения с ярлыком код. Показать все сообщения

пятница, 4 мая 2012 г.

Компонент для работы с растровыми шрифтами

Продолжая работу над портом движка Flixel на Haxe, столкнулся с необходимостью оптимизации работы с текстом. Проблема заключается в следующем: стандартный класс движка FlxText сильно завязан на использование метода draw(), и при обновлении текста создается новый экземпляр класса BitmapData, еще одним недостатком является то, что для каждого такого текстового объекта создается свой экземпляр класса TileSheet (если в качестве целевой платформы установлен c++, neko или android). В общем видно, что такая реализация класса для отображения текста довольно неудачна и нужно искать другие решения. И тут на сцену выходят растровые шрифты -- каждый символ такого шрифта представляет собой по-сути простое изображение и работать с ними можно точно также, как и с обыкновенными изображениями. В наборе классов Flixel Power Tools как раз есть такой класс FlxBitmapFont и я его уже давно портировал, но в нем также присутствует довольно раздражающее меня ограничение -- он поддерживает только моноширинные шрифты (все символы таких шрифтов должны иметь одинаковую ширину), а мне же хотелось чего-нибудь более универсального. И недавно мне на глаза попался движок Pixelizer (упоминал его в одном из предыдущих сообщений), в котором очень понравилась реализация такого компонента: в нем уже был такой функционал, как изменение цвета шрифта, обводка и тени, поддержка многострочного текста и др. Встала задача по переводу этого добра на другие рельсы:
  1. Реализация в виде отдельного компонента, не завязанного ни на какой из движков -- такой класс нужен был для того, чтобы наконец-то закончить портирование прелоадера Flixel.
  2. Реализация в виде плагина для Flixel, которую можно использовать непосредственно в играх.
Самая первая версия порта была готова через 1-2 дня, но сразу же вылезли проблемы с производительностью: для отрисовки текста использовался метод draw(), позволяющий задавать тексту цветовую трансформацию и прочие параметры. Нужно было искать другой способ отрисовки. Подумав немного и посмотрев на реализацию спрайтов в Flixel, пришел к следующему решению: на входе имеем набор растровых изображений, представляющих собой исходные изображения символов растрового шрифта, а для того, чтобы отображать масштабированный и "окрашенный" текст создается дополнительный массив трансформированных изображений символов, таким образом, мы можем использовать уже гораздо быстрый метод copyPixels() (после такого преобразования нагрузка на процессор при отрисовке текста снизилась в 2-4 раза).
Завершив с оптимизацией, я приступил к реализации дополнительных "фишек":
  • настройка размера шрифта
  • настройка расстояний как между символами, так и между строками текста
  • настройка переноса слов
На это ушло еще несколько дней, скачать и посмотреть что получилось можно со странички репозитория - https://github.com/Beeblerox/BitmapFont [...]
Читать дальше: Компонент для работы с растровыми шрифтами

четверг, 5 апреля 2012 г.

Динамическая генерация текстурных атласов

Давно задумываюсь: "А не попытаться ли перевести Flixel на Stage3D?" Сам автор движка обещал, что когда новая версия flash-плеера с аппаратной поддержкой 3D получит достаточно широкое распространение, то он добавит эту фичу. Но новостей от него пока не слышно; тема на форуме фликселя, посвященная планам по разработке новой версии, тоже довольно давно не обновлялась. Поэтому и мысли такие. Кроме того, в сети появилось несколько очень хороших уроков по stage3D, в которых рассматривается использование нового API для разработки двумерных игр. Из них можно вынести очень полезные сведения, связанные с оптимизацией графики:
  • необходимо минимизировать количество вызовов метода drawTriangles(), т.к. он довольно ресурсоемок;
  • также следует использовать как можно меньше текстур, т.к. размеры текстур могут иметь строго определенные значения (64х64, 128х128, 256х256, 512х512, 1024х1024 или 2048х2048). И если в Вашей игре используется множество маленьких изображений, для каждого из которых Вы будете создавать новую текстуру, то видеопамять будет расходоваться нерационально (в каждой такой текстуре будет много "пустого места") и довольно быстро закончится.
 Для решения этих проблем рекомендуется использовать "пакетный рендеринг" (не знаю, правильный ли я использую термин, на английском он пишется batch-rendering), при котором мы за один вызов метода drawTriangles() пытаемся отрисовать все полигоны, использующие одну и ту же текстуру. Для этого нам и понадобится генерация текстурных атласов, вынесенная в заголовок статьи и позволяющая значительно уменьшить количество текстур (о пакетном рендеринге я скорее всего напишу в следующей статье). Суть его в следующем: на входе мы имеем множество мелких изображений, а на выходе -- одно (это в идеале) большое. На русском языке уже есть, по крайней мере, одна статья от flash-сообщества, посвященная этому вопросу -- класс для генерации текстурных атласов, в ней дается исходник класса, использующий рекурсивный метод построения атласа. Данный класс мне показался не слишком понятным, а так хотелось самому разобраться в алгоритме, благо что в статье приведена ссылка на англоязычную статью по данному вопросу, из которой и становится ясен общий принцип.
Читать дальше: Динамическая генерация текстурных атласов

четверг, 29 марта 2012 г.

Alternativa3D 8 вышла в Open Source!

Друзья, 29 марта 2012 года произошло важное для компании AlternativaPlatform и, надеемся, для многих из вас событие! После шести лет развития в закрытом состоянии графический Flash 3D движок Alternativa3D 8 выходит в Open Source. Исходный код опубликован на портале GitHub. С открытием исходного кода в истории Alternativa3D начинается новый период. Мы рассчитываем, что силами сообщества технология будет развиваться быстрее, а также станет понятнее и доступнее благодаря росту числа учебных и аналитических материалов от разных авторов на разных языках. Публиковать их, кстати, можно в нашей Базе знаний. Со своей стороны мы не прекращаем развитие и поддержку движка, так что идеи и предложения приветствуются — вы всегда можете оставить их на нашем форуме.
Согласно обновленной лицензии, любая организация или частное лицо может свободно использовать технологию в своих целях. При этом размещать в созданных на движке проектах логотипы и иные упоминания об AlternativaPlatform как разработчике Alternativa3D более не требуется. Тем не менее, мы будем признательны за такие упоминания.
Перейти к исходникам
Обсудить на форуме
Читать дальше: Alternativa3D 8 вышла в Open Source!

суббота, 24 марта 2012 г.

Фиксим утечки памяти в box2d(2.1a)

Данная тема уже подымалась ранее и там я описал простейший способ обойти этот баг - это пересоздать мир. Теперь хочу описать способ который полностью фиксит этот баг. Заключается он в изменении кода в box2d. Изменений мало, даже очень мало.

Добавим в класс b2Body, функцию Destroy с таким содержанием: [...]
Читать дальше: Фиксим утечки памяти в box2d(2.1a)

пятница, 23 марта 2012 г.

TheMiner и FlashDevelop

В этом руководстве речь пойдёт о TheMiner‘е (отличный Flash профайлер) и о FlashDevelop‘е (лучшая и бесплатная среда разработки для Action Script / haXe), соответственно подразумевается, что вы с ними знакомы и желаете использовать их совместно. Если не знакомы — рекомендую ознакомиться.
Всего есть два пути использования TheMiner во FlashDevelop:
- Используя TheMiner SWC, как любую другую внешнюю библиотеку.
- Добавляя TheMiner SWF в список профайлеров FlashDevelop.
Почему существует два пути? Потому что у каждого есть сови преимущества и недостатки, и, в зависимости от обстановки, тот или иной путь может оказаться наиболее подходящим.
Итак, давайте попробуем оба пути шаг-за-шагом. Пожалуйста запустите FlashDevelop и откройте \ создайте в нём as3 проект чтобы продолжить.

TheMiner в качестве внешней SWC

1. Для начала, купите TheMiner или скачайте бесплатную версию для некоммерческого использования.
2. Распакуйте скачанный архив, зайдите в папку «SWCs» и выберите подходящую версию (в зависимости от требуемого языка), например TheMiner_en.swc [...]
Читать дальше: TheMiner и FlashDevelop

воскресенье, 11 сентября 2011 г.

Создание своего Java Socket Server. Первый контакт

Итак, пришло время того самого момента, для чего мы все это затеяли — сделать соединение между клиентом и сервером.

В этой части мы создадим сервер при помощи библиотеки Netty, сделаем библиотеку на AS3 и проверим её. Чтобы понять процесс остановимся на простой реализации — клиент будет отправлять серверу сообщение, а сервер будет отправлять его обратно (это называется echo-сервер).

Делать мы это будем путем расширения кода, написанного в предыдущих частях.

Создаем java-socket сервер.

Создание сервера на Netty – процесс очень простой. Достаточно раз понять архитектуру этой библиотеки. Подробно с работой этой библиотеки можно познакомиться на сайте проекта.

Создаем новый канал.

Первым делом создаем фабрику для создания и управления Каналами и связанными ресурсами. Она будет обрабатывать все I/O запросы и генерировать ChannelEvent, которые мы уже будем обрабатывать [...]

Создание своего Java Socket Server. Первый контакт

суббота, 3 сентября 2011 г.

Создание своего Java Socket Server. Создание заготовки. Код в студию!

Написание сервера работа довольно объемная, поэтому описание функций я планирую делать методом добавления новой функциональности в демо-версию сервера.

Начнем с небольшой заготовки, которая будет содержать:

  • логгер
  • считывание параметров
public class JavaServer extends BaseJavaServerLoggedClass {

	public static JavaServerProperties properties;

	public static void main(String[] args) {
		prepare();
		info("String server...");
	}

	private static void prepare() {
		try {
			loadProperties();
			initLogger();
		} catch (Exception e) {
			System.out.println(e.getMessage());
			System.exit(-1);
		}
	}

	private static void loadProperties() throws Exception {
		properties = new JavaServerProperties();
		properties.loadProperties();
	}

	private static void initLogger() {
		org.apache.log4j.PropertyConfigurator.configure(properties.getProperty("log4j.propertyFileName"));
	}
}

Тут все предельно просто:
1. в методе initLogger() мы инициализируем логгер. Сами методы логера спрятаны в классе BaseJavaServerLoggedClass, чтобы не отвлекать от основного [...]

Читать дальше: Создание своего Java Socket Server. Создание заготовки. Код в студию!

вторник, 30 августа 2011 г.

Создание своего Java Socket Server. Теория. Из ActionScript3 в Java.

Введение

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

Я флеш-программист, и мой опыт работы с явой исчисляется где-то месяцем. Эта статья типа «написание Java Socket сервера глазами флеш-программиста».

Предыстория.

До того, как мы написали свой сервер в нашем проекте Doom Forge Game мы использовали готовое решение для мультиплеерных игр — Smart Fox Server. Сервер сделан хорошо, в нем много возможностей, но нам пришлось столкнуться с некоторыми проблемами в его работе, которые решались тяжелым общением с безинициативной службой поддержки и решение проблемы могло занимать не меньше месяца (если проблема вообще решалась). Так что опыт использования Smart Fox Server у меня был печальный.

Из ActionScript3 в Java

На самом деле, перейти из флеша на яву было очень просто. В java и флеше есть несколько отличий, которые запомнились лично мне (конечно, это не все отличия), но в общем они очень схожи.

Читать дальше: Создание своего Java Socket Server. Теория. Из ActionScript3 в Java.

вторник, 16 августа 2011 г.

PHP скрипт для закачки списков видео с youtube.com

Недавно в Facebook’е Павел Забелин кинул ссылку на каналы с видео туториалами, выложенными на youtube.com. Покопавшись я нашёл ещё много других каналов, которые меня заинтересовали, но время смотреть их есть, в основном тогда, когда нет доступа в интернет, поэтому написал скрипт, который скачивает всё видео канала или пользователя в форматах MP4, FLV, WEBM(по приоритету), чтоб [...]

Читать дальше: PHP скрипт для закачки списков видео с youtube.com

четверг, 28 апреля 2011 г.

Achievements engine

А вот ещё класс от меня. Точнее даже не класс, а система классов плюс визуальный компонент… короче для краткости будем называть движком ачивок :)
И нужен, как вы уже наверно догадались, для менеджмента ачивок, хранения их значений между сессиями игры, отображение взятых ачивок и т.д.

Для всего этого безобразия нам потребуется куча классов которые я навыкладывал в предыдущих сериях, а именно Cookie.as, ageMath.as, ageVector.as, sounds.as, alphaFader.as. Все они уже есть в исходниках примера, так что отдельно качать ничего не надо.

Да я знаю что практика таскания кучи библиотек многим не по душе, однако я хочу отметить – я даю готовые решения, а не делаю уроки :) так что этот беспредел будет и дальше продолжаться. Я вообще подумываю собрать все наработки в какое-то подобие фреймворка, точнее даже темплейта, который можно будет загрузить и уже на основе него ваять новую игрушку :)

Ну ладна, от лирики к нашим баранам, то есть ачивкам.

Сразу смотрим как это работает [...]

Читать дальше: Achievements engine

среда, 13 апреля 2011 г.

Вода

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

Читать дальше: Вода

пятница, 8 апреля 2011 г.

Системы частиц для спецэффектов в играх. Мантра вторая

Системы частиц для спецэффектов в играх. Мантра вторая.:

Возвращаемся к теме систем частиц. Сегодня мы будем разбираться с эмиттерами и создадим несколько интересных эффектов.
Итак, эмиттер - это излучатель частиц. Место, где все начинается, происходит и заканчивается. Эмиттеры создают новые частицы и обрабатывают существующие. Когда мы хотим добавить в нашу программу новый эффект на основе частиц, мы должны создать для этого новый эмиттер.

Системы частиц для спецэффектов в играх. Мантра первая

Системы частиц для спецэффектов в играх. Мантра первая.:

Я затеял небольшой цикл статей о системах частиц. В течении нескольких частей вы узнаете что такое системы частиц, как они реализуются на ActionScript 3 и какие требования к ним предъявляются. Мы разработаем собственный набор классов для работы с системами частиц и в качестве бонуса создадим несколько интересных эффектов, с помощью этих классов.

Пишем match-3

Пишем match-3:

Всем привет. Очень давно не писал. Дело в том что игра практически готова, и сейчас художник, с которым я работаю, дорисовывает последние моменты. Обо всем этом расскажу когда все будет закончено.
А пока попробую свои силы в переводе урока из книги 'ActionScript 3.0 Game Programming University'. О ней говорилось в прошлом посте. Мне понравился урок по созданию игры на механике match-three. Сам урок я понял с первого раза, а для чего же я сделал перевод? Во-первых, надеюсь это поможет кому-то, кто не силен в инглише. Во-вторых, перевод позволил мне разобрать весь код по косточкам, очень тщательно.

Перед тем как я начну, выдам пару соглашений. Перевод может показаться немного деревянный, но уж примите, такой какой есть. Некоторые слова, выражения могут иметь более подходящие аналоги в русском языке. Если это будет критично, исправлю. В программе используется дополнительный класс PointBurst. Я не буду его сейчас описывать, а скорее всего сделаю это в следующем посте, т.к. это довольно интересный класс. Просто пока будем знать, что этот класс выдает эффект всплывающих очков в определенном месте.
И последнее, я не придумывал ничего нового, а просто сделал перевод, т.е. все благодарности автору книги Gary Rosenzweig.

Match3

[...] читать дальше

четверг, 31 марта 2011 г.

Как добавить практически любой шрифт в ваш Flash-проект - бесплатная утилита от MotoCMS

Как добавить практически любой шрифт в ваш Flash-проект - бесплатная утилита от MotoCMS:

Пишет Николай Внимательный:

Проблема использования большого количества разнообразных шрифтов, в одном флэш-проекте стоит достаточно остро. Нам всем хочется, чтоб создаваемые нами сайты радовали своих посетителей многообразием шрифтовой палитры.

Font embedding

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

Продолжение - Как добавить практически любой шрифт в ваш Flash-проект [...]

Быстрое внедрение шрифтов [Embed]

Быстрое внедрение шрифтов [Embed]:

Уже ни раз писалось о встраивании шрифтов, поэтому я не буду описывать весь процесс а покажу лишь простой и удобный прием на примере кода.

package assets {
 import flash.display.Sprite;
 import flash.system.Security;
 import flash.text.Font;
 import flash.utils.describeType;
 
 public class FontsAsset extends Sprite {
  [Embed(source="../../../res/fonts/MyriadPro-Semibold.otf", mimeType="application/x-font-truetype", fontName="MyriadSemibold", unicodeRange="U+0020-U+002F,U+0030-U+0039,U+003A-U+0040,U+0041-U+005A,U+005B-U+0060,U+0061-U+007A,U+007B-U+007E,U+02C6,U+02DC,U+2013-U+2014,U+2018-U+201A,U+201C-U+201E,U+2020-U+2022,U+2026,U+2030,U+2039-U+203A,U+20AC,U+2122,U+0401,U+0410-U+044F", embedAsCFF="false")]
  // Uppercase [A..Z] ; Lowercase [a..z] ; Numerals [0..9] ; Punctuation [!@#%...] ; Basic Latin ; chars="АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя"
  public static var MyriadSemibold : Class;
 
  [Embed(source="../../../res/fonts/MyriadPro-Regular.otf", mimeType="application/x-font-truetype", fontName="MyriadRegular", unicodeRange="U+0020-U+002F,U+0030-U+0039,U+003A-U+0040,U+0041-U+005A,U+005B-U+0060,U+0061-U+007A,U+007B-U+007E,U+02C6,U+02DC,U+2013-U+2014,U+2018-U+201A,U+201C-U+201E,U+2020-U+2022,U+2026,U+2030,U+2039-U+203A,U+20AC,U+2122,U+0401,U+0410-U+044F", embedAsCFF="false")]
  // Uppercase [A..Z] ; Lowercase [a..z] ; Numerals [0..9] ; Punctuation [!@#%...] ; Basic Latin ; chars="АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя"
  public static var MyriadRegular : Class;
 
  public function FontsAsset() {
   Security.allowDomain("*");
   var xml : XML = describeType(this);
   for (var i : uint = 0; i < XMLList(xml["variable"]).length(); i++) {
    Font.registerFont(this[XMLList(xml["variable"])[i].@name]);
   }
  }
 }
}

Собственно встроить шрифтов можно сколько угодно, в коде ничего менять не придется кроме добавления строк описывающих само встраивание.
Чтобы шрифты отображались в самом приложении достаточно будет в конструкторе создать новый экземпляр FontsAsset.

new FontsAsset();

Конечно не стоит забывать о использовании textField.embedFonts.

[...]

вторник, 22 марта 2011 г.

Биндинг в ActionScript проектах. Часть 2

Биндинг в ActionScript проектах. Часть 2:

Рамки использования метатега [Bindable] значительно шире указнных в статье Биндинг в ActionScript проектах. Часть 1. В данной статье расскажу о том куда можно применить данный метатег и о возможностях биндинга в случае использования собственных событий.

Куда можно воткнуть метатег [Bindable]?

Метатег [Bindable] можно использовать в следующих местах:

1. Перед свойством.

Свойство может быть как public, так и protected или private.

Например:

1
2
[Bindable]
public var text:String;

О биндинге применительно к свойствам уже говорилось в первой части. Компилятор автоматически преобразует свойство, помеченное тегом [Bindable] к геттеру/сеттеру с отсылкой события.

2. Перед определением класса

1
2
[Bindable]
public class SomeClass extends EventDispatcher

Это равносильно тому, что мы бы проставили метатег [Bindable] для каждого из public свойств этого класса. Private и protected или свойства из другого пространства имен автоматически не будут помечены как [Bindable]. Если нужно забиндить не public свойства к ним нужно дописывать метатег [Bindable] самостоятельно.

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

3. Перед get или set методом

Метатег [Bindable] так же можно использовать если свойства у класса оформленны в виде get/set методов:

1
2
3
4
5
6
7
8
private var _text:String;
[Bindable]
public function get text():String{
    return _text;
}
public function set text(value:String):void{
    _text = value;
}

Компилятор позволит вам поставить его как возле геттера, так и возле сеттера. Но! Как изветсно если мы для свойства напишем только сеттер то оно будет доступно только для записи (write only), если же напишем только геттер то только для чтения (read only). С помощью BindingUtils “забиндиться” на свойство доступное только для записи невозможно, но сделать это для свойства, доступного только для чтения – вполне.  Я настоятельно рекомендую всегда писать тег [Bindable] только рядом с геттером, это позволит видеть событие (см. ниже) и избежать путаницы и ошибок.

Если указан только геттер и свойство доступно только для чтения, целесообразно использовать биндинг только совместно с событиями (см. раздел “Кастомные события”), иначе биндинг сработает только во время инициализации, а среда разработки будет выдавать предупреждения.

4. Перед методом

1
2
3
4
5
[Bindable(event="bindFunctionChange")]
public function bindFunction(prop:int):String{
    ...
    return someString;
}

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

Кастомные события

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

Итак о событиях. Рассмотрим их при использовании с геттером. Представим что нам необходимо задать в каких конкретно случаях будет срабатывать биндинг, или чтобы он сработал после того как мы выполним все необходимые оперции в сеттере. Для этого в нашем метатеге мы можем указать событие в результате которого сработает биндинг [...]

четверг, 17 марта 2011 г.

MultibyteStream – запись и чтение информации побитово

MultibyteStream – запись и чтение информации побитово:

На одном из UAFPUG’ов я коротко рассказал и показал этот проект, созданный в качестве 'proof of concept'. Проект позволяет сохранять данные динамической длины, используя бит, как единицу данных. Даёт возможность самому контролировать количество бит отводимых под хранение конкретных значений. Когда вы сохраняете данные, то всегда используете чётко определённые правила хранения информации. К примеру, для сохранения целочисленных значений используется всегда 8/16/32 бита, а для дробных(рациональных чисел) – 32 или 64 бита и т.д. Данный проект позволяет изменять эти правила в свою пользу и, таким образом, уменьшать количество данных, требуемых для сохранения значений. Так же, при сохранении данных, вы избавляетесь ссылок и контекстов, что приводит к ещё большей экономии бит/байт требуемых для хранения информации. Но это является и недостатком, т.к. требует строгого описания протокола хранения информации.

Для большего понимания, можно сравнить посмотреть на формат хранения данных JSON [...]

вторник, 15 марта 2011 г.

TowerDefence #7. Движение врагов

TowerDefence #7. Движение врагов:

В прошлых уроках мы подготовили все самое необходимое, чтобы наконец перейти к полноценной разработке игры. Сегодня мы реализуем полноценное движение врагов и доработаем редактор уровней, а так же добавим пару полезных математических классов в наш проект [...]

воскресенье, 27 февраля 2011 г.

Глобальное хранилище

Глобальное хранилище:

При разработке всегда хочется создать некий удобный сундучек, куда можно было бы складывать часто используемые вещи, то есть указатели на экземпляры классов или их методов для быстрого доступа к ним. И вот сегодня я хочу поделиться с вами таким сундучком [...]