Изнанка. Дневник разработки #2
Прекрасный день, чтобы начать продуктивную разработку проекта, думал я. А «Изнанка» в ответ только усмехнулась и выставила мне челлендж на пару-тройку часов.
Как всё было. Первым делом я взялся за разработку AI врагов людей, чтобы как следует изучить их поведение в мире и наделить какими-то активными особенностями по типу : поиск пути, режим уклонения вблизи врага, преследование игрока в последней замеченной точке. Ковыряю я код , запускаю проверку и что я вижу, персонаж судорожно начинает мансить из стороны в сторону как сумасшедший. В чём причина ? Какого черта он мансит даже не встретив противника? Оооооочень долго я искал суть проблемы в таргетах , в точке призраке игрока, но персонаж всё равно продолжал гнуть свою линию. Шёл уже где-то 3-й час ночи и вдруг я замечаю мааааааааленькую ошибку в синтаксисе кода , по ошибке я написал вместо target!=0, target=!0. Эта опечатка стоила мне нескольких часов разбирательства и в итоге, увидев такую глупую опечатку , подумал что это сигнал к скорейшему восстановлению сил во сне.
Первым делом я взялся за AI врагов: хотел сделать их живыми, с поведением, а не просто «беги на игрока». Заложил базовые состояния: поиск пути, уклонение вблизи, преследование по последней замеченной точке. Всё логично, всё по блок‑схеме.
Запускаю тест — и вижу, как персонаж начинает судорожно мансить из стороны в сторону, будто у него паническая атака. Причём делает это ещё до встречи с игроком. Никакой причины: таргет вроде бы есть, точка «призрака» игрока обновляется, логика состояний на месте.
Я копался в коде, перепроверял переходы между состояниями, смотрел, не сбивается ли позиция цели, не теряется ли ID. Прошёл второй час, потом третий. Уже ближе к трём ночи, когда глаза слипаются, взгляд случайно цепляется за одну строчку:
if target=!0 { ... }
А должно быть:
if target != 0 { ... }
Одна лишняя точка — и вместо «не равно нулю» GML воспринимает это как присваивание и инверсию. В итоге условие срабатывало почти всегда, и AI постоянно считал, что ему нужно «уклоняться», даже если рядом никого не было. Отсюда и этот безумный танец.
Одна лишняя точка — и вместо «не равно нулю» GML (или логика парсинга в конкретном контексте) воспринимает это как присваивание и инверсию. В итоге условие срабатывало почти всегда, и AI постоянно считал, что ему нужно «уклоняться», даже если рядом никого не было. Отсюда и этот безумный танец.
Когда до меня дошло, я не злился — скорее рассмеялся. Иногда самые эпичные баги рождаются из опечаток, которые ты просто не видишь, потому что мозг «дочитывает» код правильно.
Мораль: если поведение NPC выглядит как паника — начни с самых простых проверок. И не работай в три ночи без автотеста хотя бы на базовые условия.
«Изнанка» любит такие шутки: масштабная механика, продуманная логика — и всё рушится из‑за одного символа. Но именно в таких моментах учишься замечать детали.


Комментарии (2)
Войдите, чтобы написать комментарий
Войти