Доброго дня, джентельмены.
Проектируется карта жанра Hero Defense, с типичной механикой волн противников.
Система волн сработана так:
Существует переменная, в которую записывается +1 при возникновении каждого юнита противника.
При гибели юнита, от переменной отнимается один.
Когда погибает юнит, проверяется равна ли переменная 0.
Если равна, то волна считается законченой и стартует новый триггер, переключающий порядковый номер волны и запускающий новую волну.
Вопрос:
При одновременной гибели юнитов противника (от сплеша/взрыва/убивающего триггера), периодически происходит дублирование срабатывания триггера, выявляющего окончание волны. Как я понимаю, потому, что несколько триггерных событий происходят одновременно или с коротким промежутком.
Возможно ли предотвратить дублирование данного триггера в таком случае? Перерабатывать систему в плане иного отсечения момента окончания волны уже сложно, потому что много чего наслоилось сверху.

Принятый ответ

СерафимКречет, чтобы отсечь дублирование окончания в условии триггера поставь проверку, что счетчик больше 0, и тогда триггер не будет запускаться.

Пример:
С: Юнит умирает
У: Счетчик > 0
Д:
set Счетчик = Счетчик - 1
Ждем 0.01 сек
if Счетчик == 0 then
  Выдать поражение и текст: волна зввершена
endif
Ты должен назару в окошко стучаться. На вэйт плевать, надо сначала логически понять, что у вас ломается. Ибо это сломается и без вэйта.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
2
5 месяцев назад
0
Можно плясать от еды, если есть такая возможность. Лимит ноль/нужное кол-во, значит -> след волна.
Понимаю что это другой путь, но мне кажется для тебя будет легче.
Но это не убережёт от дублирования, т. к. нулевой лимит может быть и при смерти трёх юнитов

И вот зачем тебе в таком простом триггере вэйт?
Думаешь в нём может быть дело?
0
29
5 месяцев назад
0
Думаешь в нём может быть дело?
Думаю что здесь он не нужен.
0
2
5 месяцев назад
0
Думаешь в нём может быть дело?
Думаю что здесь он не нужен.
Спору нет, можно убрать. Но это не решает вопрос с дублированием.
0
29
5 месяцев назад
0
СерафимКречет, а теперь давай подумаем, что произойдёт, если одновременно умрут 10 последних юнитов.
Переменная станет равна нулю и запустится ожидание на 10 триггеров. После которого все 10 триггеров увидят переменную равную нулю.
1
27
5 месяцев назад
Отредактирован MpW
1
СерафимКречет, чтобы отсечь дублирование окончания в условии триггера поставь проверку, что счетчик больше 0, и тогда триггер не будет запускаться.

Пример:
С: Юнит умирает
У: Счетчик > 0
Д:
set Счетчик = Счетчик - 1
Ждем 0.01 сек
if Счетчик == 0 then
  Выдать поражение и текст: волна зввершена
endif
Ты должен назару в окошко стучаться. На вэйт плевать, надо сначала логически понять, что у вас ломается. Ибо это сломается и без вэйта.
Принятый ответ
0
2
5 месяцев назад
0
СерафимКречет, чтобы отсечь дублирование окончания в условии триггера поставь проверку, что счетчик больше 0, и тогда триггер не будет запускаться.

Пример:
С: Юнит умирает
У: Счетчик > 0
Д:
set Счетчик = Счетчик - 1
Ждем 0.01 сек
if Счетчик == 0 then
  Выдать поражение и текст: волна зввершена
endif
Ты должен назару в окошко стучаться. На вэйт плевать, надо сначала логически понять, что у вас ломается. Ибо это сломается и без вэйта.
Это действительно помогло, хоть я и не верил! Мне казалось, что так или иначе будут повторные срабатывания, но, кажется помогло!
P.S.: Хотя я и не вполне понял механизм отсечения, его математическую природу.
СерафимКречет, а теперь давай подумаем, что произойдёт, если одновременно умрут 10 последних юнитов.
Переменная станет равна нулю и запустится ожидание на 10 триггеров. После которого все 10 триггеров увидят переменную равную нулю.
И Вам спасибо! Убирание вейта не помогло полностью с дублированием, но уменьшило множество других багов! Огромное спасибо, не буду теперь пулять его везде!
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.