Понедельник, 30.12.2024, 20:59
Главная Регистрация RSS
Приветствую Вас, Гость
Поиск по сайту
Авторизация

Меню сайта
Game Maker
Если вы только-только начали изучать игрострой и еще даже не успели скачать сам Game Maker, предлагаем вам на выбор следующие версии программы:

Game Maker 8.1
Классика. Идеально подходит для создания простых 2D игр на PC. Требует активации.
Game Maker for Mac
Абсолютно та же программа, но только для пользователей Mac. Требует активации.
Game Maker Studio
Самая новая версия с возможностью кроссплатформенной разработки. Бесплатна.
Топ 5 игр
Агент Green 4.2 / 5.0
FeDo 4.2 / 5.0
To Mars: Sec... 4.2 / 5.0
To Mars+MapE... 3.9 / 5.0
Paintball 3.8 / 5.0

Топ игр составлен путем пользовательского голосования.

Если вы не согласны с какой-либо оценкой, примите участие и поставьте свой балл игре. Ваша оценка очень важна для нас ;)
Статистика



На сайте: 2
Гостей: 2
Пользователей: 0
Главная » Статьи » Разработка игр

Графика в играх на Game Maker

Несомненно, несмотря на неоднократные высказывания вроде «графика не главное», качественная визуализация по сей день остается одним из самых важных аспектов в видеоиграх. Правда, в двухмерных проектах (в отличие от трехмерных) картинка часто целиком и полностью ложится на плечи художников и дизайнеров. Однако и тут без труда программиста не обойтись. И тут на помощь нерасторопному кодеру приходит Game Maker со своим в меру широким набором функционала для рисования. В этой статье я как раз постараюсь разобрать базовые «механизмы» вывода графики. 

О режимах смешивания.
Итак, для начала следует вспомнить следующее: всё, что мы видим на экране, это есть матрица, в каждой секции которой закодирован определенный цвет. Таким образом, каждый спрайт, фон и т.д. является всего лишь своеобразной таблицей с определенным цветом в каждой ячейке. Каждое (что-то я немного перебарщиваю с этим словом, подскажите синоним в комментах) последующее рисование, условно скажем, графического объекта на экране представляет собой замену закодированного в ячейке цвета по определенному правилу:

пиксель  = новый пиксель*src + пиксель на экране*dest;

Для того, чтобы установить режим смешивания используется команда 

draw_set_blend_mode_ext(src, dest); 

Как вы уже, наверное, догадались, вводимые аргументы src и dest являются всего лишь множителями в формуле для получения нового цвета. Однако воспринимается это довольно тяжело: мол как цвет можно вообще умножать и складывать? Потому для нас на данном этапе более подходит следующая функция, позволяющая использовать заранее подготовленные шаблоны смешивания:

draw_set_blend_mode(mode);

По умолчанию она равна параметру bm_normal, однако может принимать и другие значения. В целях оптимизации рекомендуется использовать смену режима смешивания только в одном экземпляре во всей комнате. Как объясняется в официальном блоге YoYo Games, процесс отображения графики в Game Maker представляет собой конвейер, через который проходят партии текстур. Каждый вызов смены режима смешивания «разламывает» текущую партию, и процесс как бы начинается по новой. Таким образом, чем меньше вызовов смены режима смешивания, тем меньше партий поступает в графический конвейер - соответственно картинка выводится на экран быстрей.

 

Обмануть шайтан-машину можно, как уже говорилось выше, добавив специальный объект, который рисует всю графику, требующую иной режим смешивания. Естественно не забываем, что у этого объекта должна быть правильно настроена глубина, а те экземпляры, которые, собственно, и требуют смены режима смешивания, не должны содержать никакого контента в событии Draw. Также не забываем после эксплуатации устанавливать нормальный режим смешивания. 

Draw

draw_set_blend_mode(X);

with (объекты  использующие режим смешивания X) 
{
… отображение графики
}

 

С чем едят Draw.
Собственно, каждый знает, что отображение графических объектов работает только в том случае, если все необходимые функции располагаются в событии Draw. Секрет в том, что после того, как картинка составлена, выполняется скрытая команда screen_refresh(), которая выводит содержимое «буфера» на экран. Однако не стоит, пользуясь этим, пихать все коды, касающиеся рисования, в событие Step, а потом попросту обновлять экран. Разделение шага на Step и Draw существует неспроста. То бишь событием Draw (которое выполняется в самом начале шага) рекомендуется пользоваться исключительно для вывода графики, а Step - напротив, для вычислений. Во-первых, это быстрей, поскольку скрипт screen_refresh в любом случае выполняется дольше (за исключением ситуации, когда он откомпилирован при помощи YoYo Compiler). А во-вторых, не стоит забывать, что в Game Maker уже имеется довольно удобная и эффективная структура ввода/обработки/вывода. И проявляя самодеятельность, «заменяя» без того рабочую структура на свою, вы попросту загромождаете программу. 

Вывод примитивов.
Ну а теперь поговорим о том, что, собственно, можно вывести на экран при помощи события Draw. В первую очередь это примитивы. На фоне того, что Game Maker без проблем выводит спрайты и фоны, такие вещи, как квадраты и треугольники, кажутся попросту бесполезными. Тем более, что рисование, к примеру, спрайта шестиугольника в разы быстрее, чем аналогичные действия при помощи примитивов. В итоге многие просто забывают про примитивы, несмотря на их потенциальные возможности, которые довольно велики. К примеру, стоит задача динамически нарисовать свет с тенью от прямоугольного объекта (в общем, типичный световой движок на Game Maker). Вопросом, как это реализовать, задаются многие новички. Однако если вспомнить про примитивы, то задача уже не кажется такой невозможной.

 

Рисуются двухмерные примитивы предельно просто. У них существует на данный момент шесть форм: pr_pointlist, pr_linelist, pr_linestrip, pr_trianglelist, pr_trianglestrip и pr_trianglefan. Ознакомиться с ними вы можете самостоятельно в справке к Game Maker (поскольку мне лень рассматривать каждый из них, и обращу я ваше внимание только на наиболее показательные и понятные типы). Начнем с pr_linestrip. Как вы уже могли догадаться, этот примитив представляет собой линию. Для отображения ему необходимо ввести две точки (в дальнейшем вершины). Что же, давайте при помощи этого примитива нарисуем контур треугольника, а заодно и ознакомимся с самой конструкцией:

Draw

draw_primitive_begin(pr_linestrip);
draw_vertex(x,y);
draw_vertex(x+60,y+160);
draw_vertex(x-60,y+160);
draw_vertex(x,y);
draw_primitive_end();

Фича pr_linestrip в том, что для того, чтобы продолжить линию в другую сторону, нет необходимости указывать новую начальную точку. Таким образом, контур треугольника рисуется при помощи всего 4-ех вершин. Ну а теперь мельком о самой конструкции примитива. Начинается он в любом случае с команды draw_primitive_begin(kind), где kind - имя рисуемого примитива. Заканчивается же рисование командой draw_primitive_end(). Каждая вершина строится при помощи команды draw_vertex(x,y), где пояснять, что такое x и y, смысла нет. Также каждой вершине можно присвоить свой цвет и даже прозрачность. Для этого вместо draw_vertex используется команда draw_vertex_color(x,y,col,alpha). Давайте рассмотрим её на практике. Для этого чуть выше предыдущего листинга пишем новый код, который рисует разноцветный треугольник (для треугольника, в отличии от линии, не требуется в конце заново указывать начальную точку, чтобы фигура стала замкнутой, потому вершин всего три):

Draw

draw_primitive_begin(pr_trianglestrip);
draw_vertex_color(x,y,c_red,1);
draw_vertex_color(x+60,y+160,c_green,1);
draw_vertex_color(x-60,y+160,c_blue,1);
draw_primitive_end();

Сурфейсы. 
Сурфейсы в Game Maker основаны на возможности DirectX создавать «поверхности» прямоугольной формы, хранящиеся в памяти и обычно содержащие в себе графические данные. Работа сурфейсов схожа с работой слоев в Фотошопе. К примеру, на первом «слое» может храниться основная сцена, а на втором, лежащем поверх первого, различные пост-эффекты, вроде теней, взрывов и т.д. В общем, сурфейсы - на самом деле вещь очень полезная и крайне удобная для создания красивой картинки в игре. Тем не менее, использовать надо их с осторожностью. Дело в том, что далеко не все видеокарты способны корректно переваривать сурфейсы. Вы можете закрыть на это глаза, мол нет уже таких вёдер. Но первый же отзыв к вашей игре, а-ля почему Crysis тянет, а вот это чудище - нет, наверняка поставит вас в тупик. Потому заранее предупреждаю, что не стоит использовать сурфейсы размером более чем 2024x2024. Кроме того, создавать сурфейсы рекомендуется размером, являющимся степенью двойки. Например, 256x256 или 512x512. Это связано с тем, что сурфейс по сути является обыкновенной текстурой и соответственно обрабатывается видеокартой также. 

Создаются сурфейсы крайне просто при помощи команды surface_create(w,h), где w - ширина, а h - высота. Чтобы сурфейс не потерялся в памяти, и к нему можно было бы обратиться, ему присваивают уникальный идентификатор:

surf=surface_create(w,h) //создание сурфейса с идентификатором surf

После того, как сурфейс станет ненужным, его необходимо «высвободить» из памяти при помощи команды surface_free(id), где id - тот самый идентификатор. Чтобы переключиться на сурфейс, дабы на нём рисовать, используется команда surface_set_target(id). После того, как рисование на сурфейсе будет завершено необходимо прописать surface_reset_target(). Знаю, это кажется невероятно сложным и зубодробительным, но на практике всё довольно просто. Итак, давайте попробуем создать пустой сурфейс размером 256x256, содержащий в себе изображение, скажем, квадрата Малевича. Для этого в событии Create прописываем:

Create

surf=surface_create(256,256);

surface_set_target(surf);
draw_clear(c_white); 

draw_set_color(c_black);
draw_rectangle(20,20,236,236,0);

surface_reset_target();

Чтобы нарисовать наш сурфейс достаточно в событии Draw написать следующую команду, кою пояснять смысла не вижу:

Draw

draw_surface(surf,x,y,)

Ну вот собственно и всё! Как у Малевича, правда, не получилось, но все равно довольно неплохо (можете продать за кучу денег). Осталось только по завершению комнаты «высвободить» память, занятую сурфейсом:

Room End

surface_free(surf);

 

Заключение.
Не люблю долгих речей, потому буду краток. К сожалению, изложить всё то, о чем я хотел поведать, в этот раз не удалось. За бортом осталось довольно много интересных вещей, кои следовало бы осветить. Тем не менее, надеюсь, читателю мои скромные труды окажутся полезными и, кхе-кхе… полученные знания он будет активно применять на практике =)

 

Использованные материалы:

 

Категория: Разработка игр | Добавил: BRESS (17.07.2014)
Просмотров: 7249 | Комментарии: 5 | Рейтинг: 3.8/12
Всего комментариев: 5
5 SVGames   (14.09.2014 13:50) [Материал]
SVGames Я все понял. Красава, Bress. Внес зерно мудрости

4 Vicktor_BRO   (23.08.2014 11:12) [Материал]
Vicktor_BRO Я как всегда ничего не понял.

0
1 никита   (15.08.2014 15:01) [Материал]
никита BRESS, класс thumb Но, скорее всего, поймут только опытные игроделы.

0
2 BRESS   (15.08.2014 19:05) [Материал]
BRESS Вроде бы как специально старался, чтобы новичкам было ясно - прошаренные и так сообразят.

0
3 никита   (15.08.2014 19:11) [Материал]
никита Даже я не до конца понял. Новички вообще поймут только 1/4 сказанного.

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]