Top.Mail.Ru
Ответы

Помогите как сделать так, чтобы код выполнялся один раз в 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.
Код:

1234
 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:

1
 collected = false; 

Тут только часть кода. Как добавить в свою программу надеюсь уже разберетесь

Аватар пользователя
Оракул

Набросал простой тестовый проект, в котором можно собирать монетки с бочек.

Выглядит все конечно примитивно, но каждая бочка у меня может иметь своё количество монеток и игроку добавится именно столько сколько есть в бочке.

Движение персонажа сделал проще - кинул на события Key Down (Up, Down, Left, Right)
Собирательство монеток так же кинул на событие Key Down (E).

По итогу получилось так (за чистоту кода не ручаюсь, делал быстро, почти на коленке, тем не менее это работает): https://disk.yandex.ru/d/-Tr3GPdzbNPC-w

И да, посмотрев ваши с Татьяной потуги и несколько ужаснулся. Зачем такие костыли делать с массивами всех бочек? Хех, я поначалу тоже так думал сделать, но быстро понял что это дурацкая затея. В GameMaker есть две замечательные функции

1
 place_meeting(x, y, obj) 

И

1
 instance_place(x, y, obj) 


Делаем вот так:

12345
 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);
Но это может привести к зависанию всей игры, или вылету.

Аватар пользователя

Легко