![]() |
|
![]() |
![]() |
Новости | Конференция | Чат | База данных | Творчество | Сообщество | О сайте | English |
![]() |
Помощь сайту |
![]() |
![]() |
![]() |
![]() |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ДИНАМИЧЕСКОЕ ОСВЕЩЕНИЕ Время работы: 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`ов. Вот, собственно и всё. Примечание: Этот способ не оптимизирован. Оптимизировать его не тяжело для продвинутых пользователей.
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
![]() |
![]() |
![]() |
Дизайн Elite Games V5 beta.18 EGM Elite Games Manager v5.17 02.05.2010 |
![]() |