Каков наилучший способ чтения спрайт-листа в Java? - PullRequest
0 голосов
/ 18 ноября 2008

Я пишу базовый движок спрайтов для собственного удовольствия и для лучшего знакомства с 2d API Java. В настоящее время я использую большое количество отдельных файлов .png с прозрачным фоном, чтобы представить различные спрайты и разные кадры анимации, которые мне нужны. Кажется, что в большинстве проектов по разработке игр «реального мира» используются «листы спрайтов», которые содержат несколько спрайтов или кадров анимации в одном файле. Кроме того, вместо того, чтобы использовать встроенную поддержку прозрачности изображения, люди часто назначают произвольный цвет, который не отображается в палитре спрайтов, как прозрачный цвет. Как управлять таким файлом программно?

  • откуда ты знаешь, где один спрайт начинается и начинается следующее
  • как вы справляетесь с прозрачностью

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

Ответы [ 4 ]

1 голос
/ 18 ноября 2008

В настоящее время я использую XML-файлы, сгенерированные простым редактором спрайтов, которые хранят спрайт как набор (необязательно анимированных) поз, которые, в свою очередь, представляют собой набор фреймов или ячеек. Кадры хранят информацию для каждого кадра, такую ​​как смещение x и y кадра в листе, ширину и высоту ячейки, а также любые преобразования (изменение размера / вращение / оттенок / и т. Д.). Позы хранят отдельные кадры и информацию об анимации (например, скорость) и имя позы, чтобы легко идентифицировать их в программе (hero.pose = sprite.pose ["stand_right"]). Спрайты служат корнем документа для хранения нескольких поз, например, позы для каждого направления.

Менее гибкая альтернатива, которую я использовал ранее, заключалась в том, чтобы задавать фиксированные размеры для ячеек и листов и рассчитывать смещения и размеры кадров на основе этих значений (например, ширина всегда составляет 32 пикселя, поэтому третий спрайт имеет размер 32 * 2). Позже я начал указывать эти измерения в имени файла (например, sprite_name_32x64.png) для спрайтов, которые не соответствуют фиксированным размерам ячеек. Мне больше нравится новый подход, особенно с упрощенным редактором, который заполняет большинство значений для меня и позволяет мне использовать спрайты в качестве шаблонов для других спрайтов.

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

0 голосов
/ 09 января 2012

Не о Java, но обычно вы можете сделать все свои спрайты одинакового размера. Таким образом, вы сможете создавать свои спрайты в своей игре (или приложении) с помощью простых циклов for.

Но для спрайтов разного размера могут возникнуть проблемы с размером листа спрайтов (он может быть больше ожидаемого). Поэтому вы должны определить файл xml или json для вашей таблицы спрайтов, чтобы найти изображения спрайтов в вашем коде. Вы можете использовать редакторы листов спрайтов (их много, я использую Sprite Master ) для быстрого и простого способа создания листов спрайтов и координатных данных.

0 голосов
/ 03 мая 2010

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

Возьмите буферизованное изображение вашего листа и используйте что-то вроде этого:

currentframe=spritesheet.getSubimage(x, y, w, h); 

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

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

Java будет читать файлы png с альфа-каналом, поэтому не беспокойтесь о цвете прозрачности. Нарисуйте все в pngs. Используйте Photoshop или Gimp.

Поиск в Google для изображения Java TYPE_INT_ARGB

0 голосов
/ 18 ноября 2008

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

Много времени находится в одном файле, потому что очень дорого открывать / читать несколько файлов по сравнению с открытием / чтением одного файла. Многие игровые движки используют zip или "ziplike" файлы со сжатием 0, чтобы рассматривать один файл как файловую систему.

...