Блог ☯

среда, 12 июля 2017 г.

Как сделать прозрачность объектов в Game Maker

Для того чтобы сделать прозрачность объектов в Game Maker Studio любой версии используется функция "image_alpha" (прозрачность картинки).

Под этим понимается прозрачность спрайта, функция будет менять прозрачность.

Изначально значение прозрачности всех объектов установлено равным 1, это значит что объекты абсолютно непрозрачны. Вы можете менять данное значение от 0 (полная прозрачность, невидимость) до 1 (непрозрачный).

Кроме того объекты могут быть прозрачными на уровне спрайта, а так-же прозрачным может быть фон спрайта.

Вот несколько примеров которые помогут вам разобраться:

Как сделать прозрачность объектов в Game Maker Studio

Спрайт с прозрачным фоном

Это бывает удобно когда мы делаем маску коллизии (соприкосновения) и для того, чтобы фон такого спрайта не наезжал на другие объекты.

Сейчас почти все спрайты для игр делаются с прозрачным фоном.

Как сделать прозрачность объектов в Game Maker Studio

Прозрачный спрайт с прозрачным фоном

Тут мы можем добавить спрайту прозрачность с помощью функции opacity (помутнение):

Как сделать прозрачность объектов в Game Maker Studio

Вот эта функция в редакторе спарйтов

Если там стоит значение 150 и если мы хотим сделать непрозрачный спрайт наполовину прозрачным, то выкручиваем её до 75, в 2 раза.

Однако менять прозрачность самих спарайтов не обязательно, достаточно в самой игре менять их прозрачность с помощью функции:

image_alpha

Допустим в момент создания дерева (create event) мы добавляем код с прозрачностью:

Как сделать прозрачность объектов в Game Maker Studio

Вот так делается прозрачность в Game Maker Studio, всё довольно просто

На карте до запуска игры ваши деревья будут непрозрачными, но как только игра начнётся, они сразу получат прозрачность 50%. Примерно вот так:

Как сделать прозрачность объектов в Game Maker Studio

Обратите внимание на красную зону, я её увеличу

Как сделать прозрачность объектов в Game Maker Studio

Мазда рейсер, зум, зум

Тут станет понятно зачем может быть нужна прозрачность в гейм мейкер студио, почти всегда это чисто визуальный момент. Например тут можно видеть как герой прячется за деревьями, при этом понятно что он там есть и что дерево над ним.

Иногда в играх с изометрией стены или подвалы / этажи делаются прозрачными, возьмём Fallout tactics в качестве примера:

Как сделать прозрачность объектов в Game Maker Studio

Всё таки Тактикс я считаю недооценённой игрой, она не так плоха...

Выделил красным область применения прозрачности. Так сделано примерно так что при касании спрайта героя с объектом, спрайт объекта делается прозрачным.

Кроме того прозрачностью можно отменить что объект скрывается.

Вернёмся к нашему примеру и деревьям.

Не забудьте прописать глубину (depth) дереву ниже чем у героя, чтобы оно было над ним. Например если глубина героя 0, то у дерева они должна быть -1, чтобы дерево было над.

С помощью прозрачности удобно делать тени, воду, стекло, деревья и некоторые эффекты (хотя лучше не надо), такие как кровь.

Имейте в виду что функция прозрачности требует много ресурсов процессора для обработки таких спрайтов, следовательно не злоупотребляйте ей. Если у вас нет нужды делать что-то прозрачным, не делайте.

Новички иногда делают многие объекты с прозрачностью 80-90% (0.8 - 0.9) просто так-как они считают что игра так лучше выглядит. Не стоит так делать для множества объектов, это и замедлит игру, и на самом деле в этом просто не нужды, да и это не реалистично.

В последних версиях Game Maker Studio (и в GMS2) фон у всех спрайтов автоматически делается прозрачным, раньше фон был белым.

Если у вас есть картинка с белым фоном (или любым другим), но вы хотите его убрать в графическом редакторе гейм мейкер, то это делается с помощью функции "erase a color" (убрать цвет), я пользуюсь этой функций очень часто, в том числе и для своих рисункова так-же работая практически с какой угодно графикой.


Как сделать прозрачность объектов в Game Maker Studio


Вот так убирается зелёный фон

Если цвет не убирается, меняйте либо цвет, подбирая под цвет фона, либо допустимое отклонение (tolerance).

Кстати, вы часто замечали спрайты вот с таким зелёным фоном?

Это так сохраняются некоторые спрайты с прозрачным фоном, вам просто нужно будет потом его убрать вот таким вот образом.

С помощью прозрачности можно делать и тень, хотя это не лучший способ.

Чтобы сделать тень в Game Maker вы берёте ваш спрайт, затем делайте его абсолютно чёрным. Меняйте интенсивность (insensitivity) до 0:

Как сделать прозрачность объектов в Game Maker Studio

Вот так у вас получается чёрный силуэт

Далее меняете прозрачность изменяя opacity (помутнение), как я и писал выше.

Как сделать прозрачность объектов в Game Maker Studio

Вот такая тень в гейм мейкер

Ну и накладывайте на всё это дело ваш основной спрайт:

Как сделать прозрачность объектов в Game Maker Studio

Получается примерно что-то такое, фон уже потом добавил, он на спрайте не нужен.

С помощью этой функции можно делать как-бы растворение элементов и объектов, а так-же появление их из ниоткуда. Выглядит прикольно, но жрёт довольно много ресурсов да и это кривоватый метод.

Посмотрите это моё короткое видео про элементы меню:

Да и вообще подписывайтесь на мой ютуб канал про создание игр, если не подписались.



Посмотрите как тут из темноты появляются элементы меню (кнопки). Сделано это с помощью как раз прозрачности. Просто изначально пишем кнопкам (в create) прозрачность равную нулю (image_alpha = 0), а затем в шаге (step) пишем что-то вроде:

if image_alpha<1 then image_alpha+=0.05;

Если прозрачность меньше 1 (полностью непрозрачный) то повышает раз в тик прозрачность на какое-то значение (0.05 например, 5%). Если у нас 30 тиков в секунду (fps = 30, скорость комнаты), то примерно через пол секунды у нас все кнопки с нуля станут непрозрачными.

Так-же можно делать с трупами, чтобы они исчезали (испарялись как-бы), только тогда вы снижаете прозрачность. Так-же можно делать отлетающие цифры урона и еще кучу всего.

Но не увлекайтесь с этим. Как я и сказал функции прозрачности затратные.

Последнее. Вот это точно не советую делать, но ради интереса.

Можно сделать дальность видимости героя с помощью прозрачности, при чём это довольно просто, но как это в плане нагрузки на компьютер я не знаю. Думаю что очень плохо.

Это может использоваться во всяких стелс играх либо в играх про подземелья типа рогаликов. Метод очень простой, выглядеть это будет примерно вот так:

Как сделать прозрачность объектов в Game Maker Studio

Простенькую гифку даже сделал, всё ради вас

Как видите тут деревья и враги меняют прозрачность в зависимости от дистанции до героя.

Чтобы это сделать просто пропишите у них в step:

image_alpha=150/distance_to_object(o_hero);

Лучше не у каждого объекта кроме героя отдельно, а сделать один родительский объект (parent) под всё это дело и прописать у него.

150 в данном случае это зона видимости героя. Допустим если дерево стоит на дистанции 300, то по формуле будет 150/300 = 0.5, прозрачность 50%. То есть вы при таком раскладе будете видеть всегда, но дальние объекты будут более прозрачными, а объекты ближе чем 150 будут иметь прозрачность 1 (она не может быть больше чем 1).

А когда дистанция будет ровно 0 (впритык), то объекты вообще будут пропадать так-как по формуле итог будет равен нулю...

Если вы не хотите видеть что-то дальше чем Х вообще (прозрачность 0), можно так:

if distance_to_object(o_hero)<100 then image_alpha=1;
if distance_to_object(o_hero)>=150 then image_alpha=0;

Можно это и комбинировать с прошлой формулой...

Реально и сделать еще парочку промежуточных вариантов дальности видимости.

У этого метода есть и другие недостатки, например объекты где вы хотели иметь постоянную прозрачность допустим 50% (0.5) у вас будут тоже менять её в зависимости от дальности от героя, хотя можете у таких объектов сделать изначальную прозрачность спрайта другой.

Ну вот и всё что я могу вам рассказать про прозрачность в Game Maker Studio, функция важная, красивая и полезная, пользуйтесь с умом. Удачи!

Другие мои статьи про создание игр вы можете найти вот тут: Геймдев

Если какие-то вопросы пишите в комментах.