Как я могу работать со спрайт-листами с неоднородными размерами спрайтов?

14

Как можно получить ограничивающие прямоугольники для каждого отдельного спрайта для таблицы спрайтов с неоднородными размерами спрайтов (т.е. синие прямоугольники на следующем рисунке / я нарисовал только несколько примеров)?

Что я хотел бы определить: offset_x, offset_y, width, height

введите описание изображения здесь

До сих пор я использовал только спрайт-листы, на которых все спрайты имеют одинаковые размеры. В этом случае просто нужно указать смещение по x и y, чтобы получить конкретный спрайт. Однако для спрайт-листов неоднородных размеров это не работает.

РЕДАКТИРОВАТЬ: прочитав комментарии и ответы, я перефразировал мой вопрос, чтобы сделать его более инклюзивным по отношению к. фактический процесс использования таблицы спрайтов в игре. Ранее этот вопрос содержал вопросы, почему люди создают спрайт-листы неоднородных размеров и как я могу с этим справиться.

Бен
источник
1
Мне кажется, все они имеют одинаковые размеры, пространство, которое не заполняется цветом, это просто пиксели с альфа-каналом, установленным на ноль.
Дерек

Ответы:

8

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

Если у вас нет этих метаданных, вы должны сами их создать. Самый точный способ - тот, который вы сказали в своем вопросе, а именно, сделать это вручную. Это может занять некоторое время, но это, вероятно, быстрее, чем создание новых спрайтов.

тетрада
источник
Это - хотя подходы, основанные на автоопределении, имеют свое применение, на практике они привередливы и подвержены ошибкам. Вам уже нужны метаданные для происхождения спрайта (у ваших спрайтов действительно есть источник, верно?), Поэтому дополнительные данные вряд ли являются слишком большой нагрузкой. Художник всегда должен лучше, чем ваше приложение, знать размер отдельных спрайтов.
Стивен Стадницки
+1, Предоставление метаданных со спрайтами гарантированно решит их разумно .
Бартек Банахевич
5

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

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

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


источник
1
+1. Я согласен, что для нахождения правильных границ спрайтов потребуются некоторые навыки компьютерного восприятия / манипулирования изображениями. Иногда это может быть даже невозможно, например, если вы посмотрите на анимацию «черепаха в раковину». Будет трудно определить правильную позицию для этого относительно других кадров анимации. А что касается того, почему : это, скорее всего, из-за оптимального использования пространства текстур. И обычно файл с координатами должен поставляться с такой таблицей спрайтов, но если вы просто берете его из поиска картинок Google, ему может не хватать этой информации.
bummzack
Вы подняли хороший вопрос: мой ответ не касается вопроса происхождения спрайтов; это просто привело бы к нахождению плотно прилегающих ограничивающих прямоугольников, а для листа с неоднородными спрайтами знание происхождения каждого кадра довольно важно. Это будет трудно сделать автоматически, если вы не сделаете некоторые (вероятно, предметно-ориентированные) предположения, например, что источник всегда будет (ширина / 2, максимальный Y) или что-то в этом роде.
4

Я сделал свой собственный инструмент для такого рода неоднородных таблиц. Это позволяет редактировать смещения и так далее. Вот скриншот, чтобы дать вам идею:

введите описание изображения здесь

Anonymouse
источник
Похоже, вы создаете единую таблицу спрайтов, содержащую только одну анимацию из неоднородной? Или я неправильно это понимаю?
Бен
нет, я открываю неравномерную таблицу спрайтов и рисую прямоугольник вокруг спрайтов (который автоматически сжимается до нужного размера). Однажды я создал анимацию, повторяя, что я могу воспроизводить каждую анимацию и корректировать смещение в соответствии с моими потребностями.
Anonymouse
Похоже, очень аккуратный инструмент, который вы сделали там. Хотите поделиться инструментом?
Eckyputrady
@eckyputrady, извините, но это далеко не завершено, но я рекомендую другой инструмент (который в основном вдохновил меня). Вы можете найти его здесь: colourclash.com/sprite_buddy/sprite_buddy.html
Anonymouse
0

Проверьте пакет текстуры

http://www.texturepacker.com/

Это выводит файл как это (в зависимости от ваших предпочтительных настроек)

    {
    "filename": "image_front_1",
    "frame": {"x":1,"y":160,"w":34,"h":52},
    "rotated": false,
    "trimmed": false,
    "spriteSourceSize": {"x":0,"y":2,"w":36,"h":40},
    "sourceSize": {"w":36,"h":40}
},
{
    "filename": "image_front_2.png",
    "frame": {"x":36,"y":160,"w":34,"h":52},
    "rotated": false,
    "trimmed": false,
    "spriteSourceSize": {"x":0,"y":0,"w":36,"h":42},
    "sourceSize": {"w":36,"h":42}
},
{
    "filename": "image_front_3.png",
    "frame": {"x":71,"y":160,"w":34,"h":52},
    "rotated": false,
    "trimmed": false,
    "spriteSourceSize": {"x":0,"y":0,"w":34,"h":52},
    "sourceSize": {"w":36,"h":42}
},
{
    "filename": "image_front_4.png",
    "frame": {"x":106,"y":160,"w":34,"h":52},
    "rotated": false,
    "trimmed": false,
    "spriteSourceSize": {"x":0,"y":0,"w":34,"h":52},
    "sourceSize": {"w":36,"h":42}
}

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

omgnoseat
источник
Это не то, какую технологию использовать вопрос. По моему мнению, простого ответа со ссылкой на инструмент и примером его вывода недостаточно.
MichaelHouse
-1

spritebuddy.com отлично сработал для меня. Не удалось найти никакой помощи на самом сайте, но этот пост группы Google объясняет это очень хорошо. Он автоматически угадывает границы для ваших спрайтов, позволяет вам их настраивать и позволяет упорядочивать их в последовательности анимации. Затем он выдает файл метаданных для всего этого в формате JSON или XML. Затем все, что вам нужно сделать, это проанализировать этот файл данных в вашей игре, чтобы получить правильные ограничивающие прямоугольники.

CletusW
источник
1
Это не то, какую технологию использовать вопрос. Кроме того, этот инструмент уже был предложен в одном из комментариев.
MichaelHouse
Я обновил свой ответ, но я не согласен с тем, что он не отвечает на вопрос ОП: «Я хотел бы определить следующее: offset_x, offset_y, width, height». Должно ли это происходить во время выполнения игры (что было бы ужасно неэффективным) или раньше, не указано. Что касается «РЕДАКТИРОВАТЬ: [...] Я перефразировал мой вопрос, чтобы сделать его более инклюзивным по отношению к фактическому процессу использования таблицы спрайтов в игре», это мой процесс. Я генерирую соответствующий файл JSON с помощью spritebuddy, а затем анализирую его в своей игре, чтобы получить нужные мне данные.
CletusW
1
@CletusW: хорошие ответы объяснят, почему этот инструмент так хорошо работает для вашего процесса, что он делает и как это помогает и т. Д. Я должен быть в состоянии прочитать ваш ответ и затем узнать, как выбрать инструмент или написать свой собственный. Если вы ссылаетесь на ваш любимый пример, это просто бонус, а не суть ответа.
Шон Мидлдич