КсиТехнология-02 — послойное рисование спрайтов в заданной палитре

GameMaker

Спойлер
показать

(анимация очень цветастая, большая и быстрая — осторожно! специально спрятал в спойлер)

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

В Shovel Knight для этого использовали пиксельные шейдеры. Но в ГМ8.1, который я использую сейчас для Castle of no Return 2, и тем более в ГМ6.0, который я использовал во время придумывания этой технологии в 2008 году, когда Дрейк делал уже третью часть своей фан-игры по Мегамену, шейдеров никаких нет. Думаете, я остался доволен? Думаете, они нужны? Нихрена подобного! Подробности — под катом.

Спрайт в GM8.1 можно красить, что называется blend — блендить в определённый цвет. Недостаток простой покраски в том, что цвет указывается только один. То есть, если мы уже указали синий, то мы этим уже забрали у спрайта половину красного и зелёного, и по частям он никак не красится. Поэтому просто выставление переменной image_blend тут не поможет (хотя полезно в более простых случаях, коих 90% в современном геймдеве, это мы тут из себя ретро строим).

Нам нужна функция draw_sprite_ext(спрайт, кадр, x, y, x_масштаб, y_масштаб, угол_поворота, цвет, альфа)

С её помощью мы всё ещё красим весь спрайт, но теперь задумаемся о том, что эта функция на самом деле делает. Эта функция берёт изображение и отрисовывает его из расчёта что белый цвет будет перекрашен чётко в указанный, а все остальные — в какую-то интерполяцию между чёрным и заданным, смотря насколько они яркие. Что, если разделить спрайты на слои, состоящие из одноцветных масок, и наносить их по порядку?

c0=make_color_rgb(0,0,0)
c1=make_color_rgb(244,208,180)
c2=make_color_rgb(0,136,252)
c3=make_color_rgb(84,84,84)

draw_sprite_ext(0,0,x,y,1,1,0,c0,1)
draw_sprite_ext(0,1,x,y,1,1,0,c1,1)
draw_sprite_ext(0,2,x,y,1,1,0,c2,1)
draw_sprite_ext(0,3,x,y,1,1,0,c3,1)

Бинго! Я опасался, что ГМ «зажуёт» цвета и полученный скомпонованный спрайт будет отличаться от исходного, но нет — соответствие один в один.

Радость радостью, а… ГМ умеет грузить только обычные спрайты. Итого я поделил сложность задачи на количество реколоров (что довольно много), но умножил на количество слоёв (что как минимум 4) для каждого кадра. Я получил численное преимущество, но лишился технического — ГМ знать не знает что такое послойный спрайт, и поэтому да здравствует новый модуль на коленке, свежеперемотанный изолентой.

Пришлось делать сразу три штуки:

  1. Сплиттер спрайтов на слои и отдельно палитру из этих слоёв. Выглядит он вот так:

  2. Загрузчик+менеджер послойных спрайтов и скрипт отрисовки этого в ГМ.
  3. Автоматический выгружатель спрайтов из нашего проекта, который нуждается в таком усовершенствовании.

Эта конкретная реализация послойного перекрашивания «приурочена» к опубликованному мной ранее стандарту на NES-палитру, основанному на оригинальном исследовании автора, доступного там по ссылке-источнику; хотя вообще она может использоваться для большего количества цветов, чем 4 на один спрайт.

Слава Мегамену!

Анимированные реколоры в начате поста взяты с блога it8bit, без разрешения, потому что там нет адреса для связи: http://www.it8bit.com/post/14177099314/mega Некий адрес brotherbrain.com, написанный в гифке, тоже не даёт никаких контактов.

Послойные «линографические» нарезки выполнены, сфотографированы и выложены в блог Allison Parrish, после чего, с её разрешения, взяты мной для этого поста. Ссылка на исходный пост доступна чуть ниже.

Примечательно, что и этот её пост, и моя технология, были созданы где-то в середине 2008 года. А хотя, я могу и ошибаться — возможно то был поздний 2007. Или ранний. Не важно, главное — держать связь своих времён в принципе.

 

Похожие статьи

12 комментариев
Esdeer

Castle of no Return 2

 

Теперь я убедился, что всё это время ты занимался разработкой какой-то левой игры, а не Castle of no Escape 2!

Xitilon
Дайо, какого % мне лезет это Return вместо Escape?! Ты понял короче! И вообще, где твоё мнение по новым фичам в конференции? Пойдём-ка выйдем!
DarkDes

А я знаю от чего Return у тебя ВОЛЬФЕНШТЕЙН   ты просто уже напридумывал приквелы, сиквелы и спин-оффы, а ещё пару пачек DLC!!!

(я уже придумал себе пару DLС, да )

---

А в новых OpenGL вроде убили индексируемый цвет — теперь только шейдеры, либо лихо вело-костыли. Но тут про ГМ конечно, но всё равно — теперь различные пиксельные игры «типа олдскул» станут ещё меньше олдскула, а я так хотел использовать индексы цвета в одной своей «стратежке».

Xitilon

Лол, Вольфенштейн… На самом деле так должна была называться первая часть, мы заспорили с Эсдиром, Escape или Return. С тех пор решили что Escape и это официальное название. Но нет-нет да я пишу «Return», когда отвлекаюсь на какие-то другие детали.

А что такое индексируемый цвет? Там можно было просто менять палитру?

DarkDes

Бывает и так, так сказать «родное» название.

Ну это цвет\байт от 0-255, где каждому значению определённый цвет задаётся, разве не знаешь? Знаешь ведь! Т.е. реально 255 цветов пволне достаточно может быть. Если не на всю игру (А Квейк-то справился! И не только он), то на спрайт\текстуру точно.
Вроде можно было, но на самом деле никогда не пользовался. Когда задумал использовать дак они говорят, что больше не поддерживается. По идее в видеопамяти они именно индексами хранились и следовательно можно было просто обновлять палитру, возможно, что и другие индекс-цветные текстуры тоже менялись бы.

Xitilon
Понятно. Ну короче моя «технология» делает это по-другому, по-современному.
DarkDes
Ага. Ну вот у меня одна идея возникала, где это через шейдеры делать (ты об этом написал в статье вроде). Только я ещё более жадный продуманный — хочу короче эффект glow сделать, но при этом это свечение писать только в один цвет (значение от 0 до 1.0), а потом БАЦ и брать это значение не просто как интенсивность, а ещё брать значение цвета из одномерной (всё же 1хN пикселей) текстуры и короче получится такое свечение, но при этом разноцветное (а не одноцветное, ежели «value * color»). Короче чего об этом говорить — надо бы сделать и показать, но чего-то некогда.
Xitilon

Как ни странно, вот в этом конкретном случае я всё в точности понял и представил что ты имеешь в виду.

Но пост был бы интересен другим людям, вполне возможно.

Kabob

Через шейдеры все это прекрасно делается (в GMS).

Вот блог на тему, например.

 

Xitilon

Хм, хорошая ссылка, спасибо. Что-то стало можно на ГМС эмулировать старые системы. В прошлый раз это был эмулятор Commodore 64, я об этом даже пост писал. Еле нашёл его, а всё потому что тэги не поставил.

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

Durbek
Твоя идея конечно интересная, но не легче просто перекрасить?: ])
Xitilon

Просто перекрашивать задолбаешься. В классическом Мегамене например 8 расцветок одного и того же тайлсета. Самое нудное — даже не перекрашивать, а укладывать спрайты в игру, так сказать «монтировать» — придумывать и реализовывать их подгрузку, либо втупую вручную грузить по 20 спрайтов на одну перекраску. А это уже 160 пр 8 перекрасках. А если больше?

Даже если меньше (вон на того Марио наверху поста посмотри) — кому это интересно в таком количестве отдельно подгружать?

А с моей системой можно красить любой слой во все цвета, в любой момент. Правда ещё не готово само API для того чтобы это делалось просто.

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.