Смешивание сурфейсов в GML
|
|
FYgames | Дата: Среда, 01 Июля 2020, 13:38 | Сообщение # 1 |
был не раз
Сейчас нет на сайте
| Здравствуйте, недавно начал изучать сурфейсы, и возникла одна проблема.
У меня есть два сурфейса, отвечающие за темноту: один (S1) движется за игроком и постоянно меняется, другой (S2) статичный. Оба чёрного цвета, я просто меняю прозрачность. Сама проблема заключается в том, что когда S1 наезжает на S2, они смешиваются, в итоге становясь темнее. Как мне сделать так, чтобы в их общей зоне общее значение альфа было равно значению самого тёмного сурфейса? По возможности прошу лучше объяснить смешивание сурфейсов друг с другом.
P.S. я пытался смешивать через draw_set_blend_mode с разными константами и вставляя его туда же, где отрисовываются все сурфейсы, и туда, где происходит действие в самих сурфейсах (то есть внутри системы surface_set_target → surface_reset_target).
Сообщение отредактировал FYgames - Среда, 01 Июля 2020, 13:39 |
|
| |
AlexanderBekker | Дата: Среда, 01 Июля 2020, 16:03 | Сообщение # 2 |
BekkerDev Studio
Сейчас нет на сайте
| Создай отдельный сюрфейс и рисуй в него два других с режимом смешивания bm_substract, подставляя разные константы, и смотри на результат. Или подобным образом рисуй сюрфейс S2 в сюрфейс S1 с определённым режимом смешивания, а потом S1 рисуй на экран. Я не помню, какие именно нужны константы, потому что комбинаций куча и каждая из них даёт разный результат, но копать нужно именно в этом направлении: путём накладывания одного сюрфейса на другой.
Разработчик, композитор и издатель инди-игр в Steam. Редактор карт: BekkerDev Level Editor 4 Страница разработчика в Steam Паблик ВК: BekkerDev Studio
|
|
| |
FYgames | Дата: Среда, 01 Июля 2020, 18:15 | Сообщение # 3 |
был не раз
Сейчас нет на сайте
| Методом проб и ошибок, я нашёл нужную комбинацию.
1. Отрисовываем все сурфейсы в событии Draw. 2. В фоновом сурфейсе S1 (будь он светлее или темнее) пишем
draw_set_blend_mode_ext(bm_normal, bm_normal)
и после этого рисуем второй, видимый глазу, сурфейс S2. Таким образом мы приравниваем прозрачность общей части к прозрачности S2.
Таким же образом, мы можем вырезать прямоугольник из S1, достаточно просто не рисовать S2 в Draw.
Вот код:
surface_set_target(S1) // Рисуем фоновый сурфейс draw_clear_alpha(c_black, alpha1)// Чистим, рисуем чёрный цвет прозрачности alpha draw_set_blend_mode_ext(bm_normal, bm_normal) // настраиваем смешивание
draw_surface(S2, x, y) // Рисуем S2 внутри S1.
draw_set_blend_mode(bm_normal) // Возвращаемся к обычному смешиванию draw_reset_target();// Заканчиваем работу с S1
surface_set_target(S2) // Рисуем нужный сурфейс draw_clear_alpha(c_black, alpha2)// Чистим, рисуем чёрный цвет прозрачности alpha, такую же прозрачность будет иметь общая часть draw_reset_target();// Заканчиваем работу с S2
|
|
| |