Создание динамического освещения
|
|
kukinillo777 | Дата: Среда, 31 Декабря 2014, 12:15 | Сообщение # 1 |
частый гость
Сейчас нет на сайте
| Если вы хотите быстро и легко сделать динамическое освещение в игре, то вам сюда.
Сохраняем спрайт под названием light01 и с origin`ом в центре.
Создаем объект light (можно и без спрайта) и «мастер» объект light_main (спрайт по желанию). Он будет главным объектом ответственным за создание и рисование освещения. light будет рисовать источники света.
В Create к light_main пишем:
создаем площадь для рисования по размеру комнаты Код globalvar dlight_surface; ВНИМАНИЕ – Эту строку писать только если у вас Game Maker 7.0 и выше. Если нет – везде перед dlight_surface ставить global. . (т.е. global.dlight_surface) dlight_surface = surface_create(room_width,room_height)
В Begin Step(!):
Код заливаем площадь белым (!) цветом surface_set_target(dlight_surface) указываем цель для рисования draw_set_color(c_white) указываем цвет draw_rectangle(0,0,room_width,room_height,false) рисуем surface_reset_target() отменяем цель
Необходимы некоторые объяснения. Для начала – что такое surface. Это некоторая площадь (canvas/полотно) на котором можно рисовать, незаметно для пользователя, для последующего рисования её в игре. То есть, вы рисуете на ней как на экране, а потом рисуете её уже на экране как всего-навсего один спрайт. Согласитесь, удобно – нарисовать на одном полотне 100 спрайтов, а потом поместить полотно на экране всего одной строкой кода. В основном функция необходима для сложных эффектов и чтобы не затрачивать ресурсы компьютера для рисования одних и тех же неменяющихся спрайтов в каждом кадре (компьютеру гораздо легче нарисовать один спрайт, чем десятки). Обратите внимание, что на полотне можно рисовать в любом event`е, а не только в draw`е, как это происходит с рисованием на экране. Зачем мы заливаем всё полотно белым а не чёрным цветом? Узнаете позже. Зачем в begin step? Тоже позже.
В Draw:
Код draw_set_blend_mode(bm_subtract) draw_surface(dlight_surface,0,0) рисуем полотно draw_set_blend_mode(bm_normal)
Ну а теперь заходим в light и пишем в Step:
Код surface_set_target(dlight_surface) draw_set_blend_mode(bm_subtract) draw_sprite(light01,0,x,y) draw_set_blend_mode(bm_normal) surface_reset_target()
Ну а теперь объясняю. Существуют 3 различных event`а step`а. begin step – в нем находятся события, которые должны выполнятся в самом начале обработки кадра, в step – в середине, а в end step – в конце. Чтобы нарисовать спрайт light01 ПОВЕРХ белой заливки, нам нужно залить полотно в начале обработки, а уже потом, в середине, нарисовать спрайт. Теперь зачем белый. Как вы могли увидеть, мы используем bm_subtract – смешивание вычитыванием. Т.е. спрайт будет рисоваться полностью чёрным, а прозрачность точек будет зависеть от яркости точки в изначальном варианте. Но это лучше увидеть самому – поэкспериментируйте на каком-то другом файле (не в данном). При рисовании спрайтов вычитыванием на белой поверхности, в последней образуются чёрные «дырки». При рисовании вычитыванием полотна, экран зальётся черным цветом, в котором будут прозрачные дырки на месте тех чёрных дыр в поверхности.
Ставим в комнату один light_main и сколько хотите light`ов.
Вот, собственно и всё.
Примечание: Этот способ не оптимизирован. Оптимизировать его не тяжело для продвинутых пользователей.
Все свои желания можно воплотить в своей игре, если руки из нужного места растут. А если и мозга работает, то и в реальности все сделаешь :)
Сообщение отредактировал kukinillo777 - Среда, 31 Декабря 2014, 17:46 |
|
| |
Quad69 | Дата: Среда, 31 Декабря 2014, 12:21 | Сообщение # 2 |
заслуженный участник
Сейчас нет на сайте
| Урок так то помог, но указывай автора! За такое и минус можно поставить!
|
|
| |
kukinillo777 | Дата: Среда, 31 Декабря 2014, 12:28 | Сообщение # 3 |
частый гость
Сейчас нет на сайте
| maksim1221232, указал. Это была не моя статья. Я сам оттуда многое извлек.
Все свои желания можно воплотить в своей игре, если руки из нужного места растут. А если и мозга работает, то и в реальности все сделаешь :)
|
|
| |
aFriend | Дата: Среда, 31 Декабря 2014, 16:41 | Сообщение # 4 |
участник
Сейчас нет на сайте
| динамическое освещение - освещение, которое меняется время от времени, а это просто кружки вокруг обьектов
|
|
| |
kukinillo777 | Дата: Среда, 31 Декабря 2014, 17:46 | Сообщение # 5 |
частый гость
Сейчас нет на сайте
| aFriend, статья расчитана на новичков.
Все свои желания можно воплотить в своей игре, если руки из нужного места растут. А если и мозга работает, то и в реальности все сделаешь :)
|
|
| |
Anthem | Дата: Среда, 31 Декабря 2014, 18:56 | Сообщение # 6 |
Д'Артаньян
Сейчас нет на сайте
| kukinillo777, т.е. новичкам можно давать некорректные понятия? И имени автора не видно...
Текстовый контент для вашей игры (бесплатно) Сценарист, геймдизайнер для Вашей игры
|
|
| |
HiNuTo | Дата: Среда, 31 Декабря 2014, 19:01 | Сообщение # 7 |
частый гость
Сейчас нет на сайте
| Неплохо, но статьи вроде этой - гораздо более понятные. Их много, и ты выбрал не самую удачную...
И даже если без тебя я слаб, Сейчас для меня будто оргазм состояние зла.
Сообщение отредактировал HiNuTo - Среда, 31 Декабря 2014, 19:02 |
|
| |
kukinillo777 | Дата: Среда, 31 Декабря 2014, 19:28 | Сообщение # 8 |
частый гость
Сейчас нет на сайте
| Ну что теперь поделаешь.
Все свои желания можно воплотить в своей игре, если руки из нужного места растут. А если и мозга работает, то и в реальности все сделаешь :)
|
|
| |
rogueliker | Дата: Четверг, 01 Января 2015, 18:08 | Сообщение # 9 |
частый гость
Сейчас нет на сайте
| Цитата Anthem ( ) И имени автора не видно... Все это сплагиачено.
|
|
| |