Elite Games - Свобода среди звезд!

Уроки для программистов - Динамическое освещение

ДИНАМИЧЕСКОЕ ОСВЕЩЕНИЕ

Время работы: 20 мин.
Требуются знания GM`а: выше средних
Версия GM`а: 6.0 – 7.0

Если вы хотите быстро и легко сделать динамическое освещение в игре, то вам сюда.

Сохраняем спрайт под названием 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`ов.

Вот, собственно и всё.

Примечание: Этот способ не оптимизирован. Оптимизировать его не тяжело для продвинутых пользователей.
ZEUStiger
К началу раздела | Наверх страницы Сообщить об ошибке
Уроки для программистов - Динамическое освещение
Все документы раздела: Для тех, кто хочет писать игры | Движок на OpenGL | Создание игр в Game Maker | Bump mapping | Использование Direct Input | XNA framework |


Дизайн Elite Games V5 beta.18
EGM Elite Games Manager v5.17 02.05.2010