Как лучше всего читать таблицу спрайтов на Java?

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

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

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
6 021
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

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

что вы имеете в виду под "обычай"? Большинство из них - ванильные растровые изображения. Если у меня есть лист спрайтов в формате .jpg или .png, как вы можете закодировать в него метаданные, не используя стеганографию или что-то в этом роде?

ninesided 18.11.2008 06:28

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

John Gardner 31.12.2008 06:59
Ответ принят как подходящий

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

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

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

@Artifact Это просто пользовательский инструмент .Net, который я написал. Вы можете найти это здесь

Firas Assaad 02.02.2014 12:21

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

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

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

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

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

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

Найдите в Google изображение java TYPE_INT_ARGB

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

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

Другие вопросы по теме