Помогите как сделать так, чтобы код выполнялся один раз в GameMaker.
я только начинаю познавать GameMaker по этому не знаю как это решить. дело в том что ГГ должен подбирать деньги из бочки, но сколько я не пытался у меня получалось либо подбор сотен монет с секунду, либо команда ничего не делала. как быть?
вот пример кода, когда ГГ подбирал монет без остановки:
if place_meeting(x,y,o_Barrel) and keyboard_check(ord("E")){
money = money + 4;
}
и пример когда он не подбирал монеты вовсе:
a = false;
if(!a = false){
if place_meeting(x,y,o_Barrel) and keyboard_check(ord("E")){
money = money + 4;
}
a = true;
}
Для того, чтобы код выполнялся только один раз, можно использовать переменную, которая будет отслеживать, была ли монета уже подобрана. Например, можно создать переменную collected, которая будет равна false в начале игры, а после подбора монеты изменится на true. Таким образом, при следующем прохождении цикла проверки наличия монеты в бочке, код не будет выполняться, так как переменная collected уже будет равна true.
Код:
if place_meeting(x,y,o_Barrel) and keyboard_check_pressed(ord("E")) and !collected{
money = money + 4;
collected = true;
}
Здесь добавлена проверка на нажатие клавиши E с помощью функции keyboard_check_pressed, чтобы код выполнялся только один раз при каждом нажатии клавиши. Также добавлена проверка на переменную collected, чтобы код не выполнялся повторно, если монета уже была подобрана. Переменную collected нужно объявить в объекте ГГ и установить ее значение в false в событии Create:
collected = false;
Тут только часть кода. Как добавить в свою программу надеюсь уже разберетесь
Набросал простой тестовый проект, в котором можно собирать монетки с бочек.
Выглядит все конечно примитивно, но каждая бочка у меня может иметь своё количество монеток и игроку добавится именно столько сколько есть в бочке.
Движение персонажа сделал проще - кинул на события Key Down (Up, Down, Left, Right)
Собирательство монеток так же кинул на событие Key Down (E).
По итогу получилось так (за чистоту кода не ручаюсь, делал быстро, почти на коленке, тем не менее это работает): https://disk.yandex.ru/d/-Tr3GPdzbNPC-w
И да, посмотрев ваши с Татьяной потуги и несколько ужаснулся. Зачем такие костыли делать с массивами всех бочек? Хех, я поначалу тоже так думал сделать, но быстро понял что это дурацкая затея. В GameMaker есть две замечательные функции
place_meeting(x, y, obj)
И
instance_place(x, y, obj)
Делаем вот так:
if (place_meeting(x, y, objBarrel)) // Проверяем столкновение объекта objBarrel
{
var barrel = instance_place(x, y, objBarrel); // Возвращаем экземпляр (instance) с каким было столкновение
var money = variable_instance_get(barrel, "money"); // У конкретного экземпляра получаем количество монеток.
}
Не знаю как в GameMaker'e, но в Unity я бы сделал Корутину (это когда задержка между одним скриптом и другим). Например:
money +=4;
StartCoroutine(waiter());
IEnumerator waiter() {
yield return new WaitForSeconds(2)
}
Если GameMaker поддерживает (и если он на C#), то можно просто написать:
money +=money;
System.Threading.Sleep(2000);
Но это может привести к зависанию всей игры, или вылету.
Легко