Цвет в игре
|
|
XsmileX | Дата: Среда, 25 Июля 2012, 20:21 | Сообщение # 1 |
Добряк И Весельчак
Сейчас нет на сайте
| Как заменить цвет один цвет на спрайте, при этом не трогая другие? Примерно как надо сделать: у одного спрайта, зелёный цвет кожи и синяя рубашка и когда мы на него нажмём рубашка станет красной.
http://rghost.ru/47688462
|
|
| |
Rean | Дата: Среда, 25 Июля 2012, 20:36 | Сообщение # 2 |
участник
Сейчас нет на сайте
| В данном случае, лучшим вариантом будет создание набора различных спрайтов (сколько необходимо цветов - столько и спрайтов). Пример: спрайт с красной рубашкой, спрайт с синей и т.д. Изменение цвета пикселей спрайта возможно, если я не ошибаюсь, только через Surface (Поверхности). Придется создавать цикл и уже в цикле проверять каждый пиксель Поверхности на определенный цвет и заменять его на другой. Последний вариант менее предпочтителен, так как является более ресурсозатратным.
|
|
| |
|
Rean | Дата: Четверг, 26 Июля 2012, 00:43 | Сообщение # 4 |
участник
Сейчас нет на сайте
| XsmileX, куда уж проще? Есть еще один вариант, но как мне кажется, он будет уместен лишь в том случае, если спрайт рубашки находится в отдельном спрайте. Сам же способ заключается в использовании свойства image_blend. Данное свойство принимает значение цвета, с которым должен быть смешан спрайт. Как именно это работает точно не скажу, но есть предположение, что для нужного эффекта стоит использовать спрайт белого цвета (именно в тех местах, где нужно сменить цвет). Фон спрайта должен быть прозрачным.
Сообщение отредактировал Rean - Четверг, 26 Июля 2012, 00:43 |
|
| |
TimKruz | Дата: Четверг, 26 Июля 2012, 01:20 | Сообщение # 5 |
старожил
Сейчас нет на сайте
| XsmileX, вообще есть простой (эээ... если программировать на Delphi/C++ и т.п., а не GML) и быстрый способ - использовать маску. Она чёрно-белая (с оттенками серого, конечно), и раскрашивается нужным цветом, а потом дорисовываются неизменяемые части. Точно алгоритм не помню... Скорость метода определяется тем, что не нужно обрабатывать каждый пиксель, можно просто логически сложить маску с закрашенным прямоугольником с помощью WinAPI функции BitBlt, эта функция работает очень быстро. А получается всё так, что чёрный цвет (000000) в маске принимает 100% соответствующего цвета, а белый (FFFFFF) остаётся белым, ну и серые оттенки соответственно располагаются... Получается экономия - не нужно создавать несколько разноцветных картинок, достаточно двух (основной спрайт и маска), обработанный цветом спрайт нужно сохранить в оперативной памяти (операция, конечно, быстрая, но делать её каждый раз невыгодно, будет существенная потеря скорости). Но вот можно ли и как можно сделать это в GM - не знаю... Вроде бы в GM можно подключать dll, так почему бы не попробовать подключить что-то из WinAPI? Функция BitBlt содержится в c://windows/system32/gdi32.dll, только, правда, она требует указатели (handle) на обрабатываемые картинки, уж не знаю, как их в GM добыть, наверное, стандартными средствами нельзя (разве что с помощью отдельной библиотеки)...
Сообщение отредактировал TimKruz - Четверг, 26 Июля 2012, 01:22 |
|
| |
Rean | Дата: Четверг, 26 Июля 2012, 09:40 | Сообщение # 6 |
участник
Сейчас нет на сайте
| TimKruz, в данном случае понадобится маска рубашки, которую необходимо менять, ведь так? А если это так, то не надо никаких dll, достаточно будет использования свойства image_blend у спрайта "с белой рубашкой".
|
|
| |