SGDK. Импорт палитры.

Предисловие.

Благодаря уроку SGDK. Создание изображения, мы уже знаем как импортировать изображение в SGDK. Сначала рисуем изображение в paint.net, затем урезаем палитру до 16-ти цветов. У данного способа есть существенный минус, а именно, для каждой картинки создается отдельная палитра. А, количество палитр ограничено 4-мя палитрами, поэтому нужно умело использовать одни и те же палитры в разных изображениях.

Для работы нам потребуется Aseprite.

Рисуем изображение в Aseprite для SGDK.

Создайте новое изображение, в графе Color Mode выберите Indexed и нажмите OK.

Теперь, выберите любую 16-ти цветовую палитру. Я выбрал PICO-8, потому-что она яркая.

И начните рисовать. Обратите внимание, 1-ый цвет палитры, полностью прозрачный. В сеге, он тоже будет прозрачным.

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

Подгоняем изображение под палитру.

Перетащите изображение в окно Aseprite

Открывшееся изображение, выделите и скопируйте.

И перенесите его в изображение с 16-ти цветной палитрой, созданной ранее.

Палитра изображения уменьшиться до 16-ти цветов.

Автоматизируем процесс урезания палитры.

Aseprite может урезать палитру и может подгонять изображение под палитру.

А еще, он может запускаться из консоли, не открывая окно программы. Этим мы и воспользуемся.

Но сначала, нужно прописать путь до aseprite.exe в переменную PATH. Что-бы можно было открыть Aseprite из любого места, через консоль.

  1. В проводнике, нажмите ПКМ по Этот компьютер->Свойства
  2. Далее, Дополнительные параметры среды.
  3. Потом, Параметры среды.
  4. И Path -> Изменить.

Создайте новую переменную среды, прописав в неё путь до папки с Aseprite.

Нажмите OK, что-бы сохранить результат.

Теперь, введите Aseprite в консоли, и нажмите ENTER. Если вы все сделали правильно, Aseprite запустится.

Ниже я привел полезную комманду.

Переводим изображение в режим indexed.

aseprite -b путь_до_изображения --dithering-algorithm ordered --color-mode indexed --save-as путь_до_изображения

путь_до_изображения — замените на свой.

-b — значит что окно программы открываться не будет.

Подробно про аргументы aseprite тут.

Данная комманда, переводит изображение в режим indexed, что необходимо для сохранения прозрачности. Используйте её тогда, когда вам нужна уникальная палитра и когда вы уверены что палитра изображения содержит меньше 16-ти цветов.

Подобную операцию, можно провести в Python, тем самым, автоматизировав данное действие.

image_url = "путь_до_изображения"
process = subprocess.Popen(["aseprite", "-b", image_url, "--dithering-algorithm", "ordered", "--color-mode", "indexed", "--save-as", image_url])
process.wait()

Уменьшаем палитру изображения до 16-ти цветов.

Установите библиотеки Pillow и libimagequant, введя в консоли следующие комманды.

pip install Pillow
pip install libimagequant

Далее, скачайте скрипт урезания палитры с MEGA.

Внутри скрипта, замените image_url на свой путь до изображения. И запустите скрипт.

Удивительно качественная картинка, для 16-ти цветного изображения. Достигается такое за счет dithering, подробнее здесь.

Я, в скрипте его выставил на максимум, но если его отключить.

result.dithering_level = 0.0

То, картинка лишится множества деталей, что не очень хорошо.

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

Подгоняем изображение под палитру.

Если хотите подогнать изображение под свою палтиру, используйте эту комманду.

aseprite -b путь_до_картинки --palette путь_до_картинки_палитра --color-mode indexed --save-as путь_до_картинки

Данная комманда, урезает палитру изображения путь_до_картинки до палитры путь_до_картинки_палитра. Используйте её для entity, т.к. их много на экране, и под каждого entity заводить свои палитру, попросту не выйдет.

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

Итоговый результат.

Фрагмент из моей игры на SGDK. Кружка и монетки, используют одну и ту же палитру PICO-8, когда как BG_A и BG_B, используют уникальную палитру.