Привет, друзья! На прошлом занятии мы с вами сделали таймер. Сегодня мы займемся разработкой предметов, которые могут появляться в нашей игре в разных местах и при разных обстоятельствах: в сундуках, после убийства монстров, при приходе торговца.
Для начала нарисуем для наших первых предметов несколько кадров в одном спрайте. Почему в одном? Так нам будет чуть удобнее, однако это помешает сделать анимацию для предметов. В целом, она нам всё равно не особо нужна.
Вот так выглядят мои предметы. Этот спрайт я назвал sPassiveItems.
Затем я сделаю свой новый объект - oPassiveItems.
Присвою ему наш новый спрайт и создам новое событие - "Создать".
image_speed = 0; //Скорость анимации 0
image_index = irandom_range(0,sprite_get_number(sprite_index)-1);
Таким образом мы запретили спрайту быть анимированным, он не будет переключать кадры из-за скорости 0.
А когда он появится в комнате его кадр будет равен случайному в диапазоне от 0 до последнего.
Как работает? Функция irandom_range берет два числа и выбирает случайно от первого до второго. И если с первым все понятно, то второе число - это последний кадр. Для того, чтобы вручную его не вбивать после каждого добавления кадра мы будем использоваться функцию sprite_get_number() в которую поместили sprite_index (переменная, которая отвечает за то, какой сейчас спрайт у объекта). И так как счет начинается с 0, то условно 5 кадр будет у нас на 1 меньше, то есть 4.
На примере кадров 16, но последний не 16, а 15, так как первый кадр нулевой.
Идем дальше. Теперь создадим событие "Столкновение. Столкновение с объектом oPlayer".
Соответственно, давайте подумаем, что будет, если игрок касается нашего предмета? Наверное, игра сначала посмотрит, что это за предмет. А сделать это можно легко.
Давайте проверим, что за кадр у нашего созданного предмета.
И соответственно, мы будем менять какие-то характеристики нашего персонажа для начала, да?
Давайте вместе подумаем, какие мы можем сделать характеристики-параметры-переменные, которые мы можем легко изменить.
speedWalk - переменную, отвечающую за скорость передвижения игрока
bulletDmg - урон от пули
shootTimer - скорострельность
Да и много чего можем еще добавить: удачу, скорость полета пули, количество жизней и т.п.
Да в целом, мы можем делать что-угодно в этом событии, но пока попробуем увеличить урон и скорость.
Как это мы обычно делаем:
Сейчас изменить переменные другого объекта мы можем, конечно, но нужно понимать, что когда наш игрок выходит из комнаты он уничтожается, а затем в новой комнате появляется новый объект игрока и берет данные о том, какие переменные чем равны из "создать", а значит данный способ нам не подходит, ибо изменения переменных будет только на одну комнату.
Тогда нам нужно в объекте oGame, который у нас не зависит от игрока добавить свое событие "создать", а сам объект сделать "постоянным", поставив галочку под названием. Если такой объект есть, заходим в него, если нет, то создадим oGame.
Обязательно ставим галочку под "постоянным слева" и перенoсим oGame в самую первую комнату.
В событии "создать" добавим все переменные, которые нам нужны: например, я добавлю global.speedWalk, global.bulletDmg и так далее. Обращаю внимание, что они у меня с приставкой "global.", что говорит о том, что эти переменные глобальные и видны во всей игре. Так будет нам удобнее для конкретного случая. Но нужно понимать, что использовать такие переменные везде не стоит, слишком много памяти они задействуют, так как даже когда мы их не используем, игра будет хранить данные о них в реальном времени.
Вот мы добавили переменные, теперь мы можем взять и заменить в нашей игре старые переменные и/или значения на глобальные новосозданные.
Так например, мы говорили о speedWalk в "создать" Игрока:
Естественно, эта переменная нам больше не нужна, так как вместо игрока данные о ней будет хранить oGame, а сама переменная стала называться global.speedWalk. Удалим старый speedWalk из "создать" игрока.
Но помним, что те переменные, что мы будем удалять мы где-то могли использовать.
Чтобы не вызвать ошибки в духе "переменная не найдена" мы возьмем и везде, где была, например, "speedWalk", раз мы ее удалили напишем "global.speedWalk", данные о которой есть в oGame.
Но можно ли заменить старые переменные как-то автоматически? Или хотя-бы ускорить их поиск по нашему коду?
Конечно да!
Для этого нажмите комбинацию клавиш "SHIFT+CTRL+F". Тогда выйдет панель для поиска и замены переменных.
С помощью этой панели легко можно найти любое слово или предложение, протыкать внизу и заменить вручную или с помощью "Заменить" - "Заменить все", но помни друг! Что если ты будешь менять, например "speedWalk" на "global.speedWalk", то когда ты зайдешь в oGame, где уже был "global.speedWalk", то увидишь вместо него уже "global.global.speedWalk" по естественным причинам. Перепроверяй и будь внимателен!
Когда ты заменишь старые переменные на новые global в oGame, то переходи к следующему этапу, мы почти закончили.
Так вот, вернемся к нашему методу. В объекте oPassiveItem мы не можем просто заменить переменные oPlayer'а, так как это только переменные игрока. А теперь их вообще и нет)
Теперь мы будем менять global. переменные, которые хранятся в "создать" oGame.
Меняем!
Так мой предмет с нулевым кадром - ботинки увеличивают скорость на 0.5, а предмет с первым кадров увеличивает урон пули на 1 и задержку между выстрелами снижает на 6.
Не забудем еще о том, что когда мы подобрали предмет его нужно обязательно уничтожить, иначе он будет увеличивать каждый кадр нам наши переменные :D
Круто! Теперь мы можем сказать, что этот oPassiveItem появляется в комнате по каким-то причинам, или после уничтожения сундука/врага. И это будет работать!
В следующем руководстве сделаем получение урона по игроку и уменьшение его количества жизней.
Peace!
Если будут вопросы или вы хотите подписаться и следить за мной, то держите ссылки на соц.сети:
Подписывайся на мою группу ВК: https://vk.com/oliora.
Подписывайся на мой телеграм канал: https://t.me/oliver_orangers.
Подписывайся на мой Twitter: https://x.com/OliverOrangers.
И не пропускай следующие мои туториалы!