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




Что ж, поскольку большинство из них являются настраиваемыми, эти детали остаются на усмотрение разработчика. Обычно файл начинается с информации заголовка, которая содержит сведения о высоте / ширине, кодировке, прозрачности и т. д.
Часто все происходит в одном файле, потому что открытие / чтение нескольких файлов обходится очень дорого по сравнению с открытием / чтением одного файла. Многие игровые движки используют файлы zip или «ziplike» с нулевым сжатием для обработки отдельного файла как файловой системы.
они являются "индивидуальными" в том смысле, что они ваши, так что вы можете решить, что находится в файле. да, содержимое может быть простым растровым изображением, но вы можете создать собственный формат файла или настраиваемую информацию в растровом изображении, содержащем размер спрайтов.
В настоящее время я использую XML-файлы, сгенерированные простым редактором спрайтов, которые хранят спрайт как набор (необязательно анимированных) поз, которые, в свою очередь, представляют собой набор фреймов или ячеек. В кадрах хранится покадровая информация, такая как смещение кадра по осям x и y на листе, ширина и высота ячейки, а также любые преобразования (изменение размера / поворота / оттенка и т. д.). Позы хранят отдельные кадры и информацию об анимации (например, скорость), а также название позы, чтобы легко идентифицировать их в программе (hero.pose = sprite.pose ["Standing_right"]). Спрайты служат корнем документа для хранения нескольких поз, например позы для каждого направления взгляда.
Менее гибкая альтернатива, которую я использовал ранее, заключалась в том, чтобы указать фиксированные размеры для ячеек и листов и вычислить смещения и размеры кадров на основе этих значений (например, ширина всегда составляет 32 пикселя, поэтому третий спрайт имеет размер 32 * 2). Позже я начал указывать эти размеры в имени файла (например, sprite_name_32x64.png) для спрайтов, которые не соответствуют фиксированным размерам ячеек. Мне больше нравится новый подход, особенно с упрощенным редактором, который заполняет для меня большинство значений и позволяет мне использовать спрайты в качестве шаблонов для других спрайтов.
Я напрямую использую информацию об альфа-канале и прозрачности, хранящуюся в изображениях PNG, поэтому мне не нужно беспокоиться о ее хранении в другом месте, хотя другие подходы заключаются в том, чтобы выбрать фиксированное значение для каждого спрайта и где-то сохранить, используйте крайний левый пиксель в позе, если вы знайте, что он всегда пуст, используйте определенную запись палитры, если вы используете их, маски спрайтов или что-то еще.
@Artifact Это просто пользовательский инструмент .Net, который я написал. Вы можете найти это здесь
Сделайте свой лист спрайтов, зная размер и количество каждой последовательности.
Возьмите буферизованное изображение вашего листа и используйте что-то вроде этого:
currentframe=spritesheet.getSubimage(x, y, w, h);
Ваши x и y будут меняться в зависимости от кадра, в котором вы находитесь. Сохраняйте одинаковую ширину и высоту, чтобы облегчить себе жизнь.
Забудьте о попытках хранить всю игру на одном листе. Это безумие, и с этим сложно справиться Используйте новый png для каждой последовательности анимации. Если вам не нравится экономия места, создавайте только движущиеся вправо анимации и просто переворачивайте буферизованное изображение в реальном времени, чтобы двигаться влево.
Java будет читать файлы png с альфа-каналом, поэтому не беспокойтесь о цвете прозрачности. Нарисуйте все в png. Используйте Photoshop или GIMP.
Найдите в Google изображение java TYPE_INT_ARGB
Не о java, но, как правило, вы можете сделать все свои спрайты одинакового размера. Таким образом, вы сможете создавать свои спрайты в своей игре (или приложении) с помощью простых циклов for.
Но для спрайтов разного размера может возникнуть проблема с размером таблицы спрайтов (он может быть больше, чем ожидалось). Таким образом, вы должны определить файл xml или json для своей таблицы спрайтов, чтобы найти изображения спрайтов в коде. Вы можете использовать редакторы таблицы спрайтов (их много, я использую Мастер спрайтов) для быстрого и простого создания таблицы спрайтов и координатных данных.
что вы имеете в виду под "обычай"? Большинство из них - ванильные растровые изображения. Если у меня есть лист спрайтов в формате .jpg или .png, как вы можете закодировать в него метаданные, не используя стеганографию или что-то в этом роде?