Прототип системы спавна (Новость №4)

Добавлен , опубликован
В общем, наконец-то допилена система спавна. Чтобы можно было нормально ее протестировать, я создал новый тестовый уровень, побольше. Правда, пришлось пожертвовать детализацией, но лично меня это не особо смущает. В общем, видео с финальным тестом системы
Строчка "Enemies Left" обозначает, сколько нам еще нужно убить всего врагов до конца волны. Первое число показывает, сколько врагов еще "в запасе", второе - сколько их на уровне на данный момент (ясное дело, оно ограничено; думаю, будет перебор отправлять на игрока 40-50 врагов сразу). Враги спавнятся со специальных точек. Сами точки выбираются случайным образом, но с условием, чтобы они выпадали из поля зрения игрока.
В будущем, можно будет сделать определенную зависимость общего количества врагов (и количества врагов, что могут одновременно находиться на локации) от уровня сложности и текущей волны. Но я пока этого делать не буду, так как со временем появятся новые типы врагов, и эти алгоритмы все равно придется переписывать. Вообще, надо подсмотреть, как это устроенно в KF, там весьма неплохо организовано подключение новых типов врагов к игре.

Помимо прочего, можно заметить, что я несколько увеличил размер главного персонажа и врагов. Дело в том, по умолчанию модель персонажа от третьего лица выглядит слишком маленькой в сравнении с окружающей средой, так что, думаю, пока удобней подстроить персонажа под окружение, чем все окружение под персонажа.
Еще была создана полноценная система временных эффектов (в простонародье - "баффы", "дебаффы" и "доты"). Демонстрации пока нет, так как пока нет собственно эффектов, разве что тестовые, но они никаким образом не влияют на игрока или врагов. Но в будущем с помощью этой системы можно будет организовать яды, замедление, разные усиления для персонажа и т.д..

А теперь о неприятностях в процессе
Костылей со спавном было предостаточно. Впрочем, вызваны они были особенностями тестового уровня, а именно - количеством точек для спавна. Объясню подробней.
Сам спавн происходит таким вот образом - создается тушка врага, и создается ИИ, который над этой тушкой контроль и получает. Надо ли говорить, что сам ИИ в движке абстрактный, и местоположение ему не нужно? А вот тушкам местоположение нужно еще как. А я в выборе следующей точки для спавна использую рандом. И вот представьте себе ситуацию, когда на 10 тушек приходится 20 точек спавна. Как вы думаете, насколько велик шанс, что рандом для этих 10 тактов спавна выдаст одинаковое число от 1 до 20? Эмпирически показано, что шанс достаточно велик. В итоге, рано или поздно определенная тушка хочет спавниться в точке, где уже заспавнилась другая тушка. А первая думает, "Ну и ладно", и попросту не спавнися. А ИИ все равно, занято ли место тушки или нет, он всегда может спавниться. Вот он и спавнится и пробует получить контроль над отсутствующей тушкой. Ясное дело, что шиш он получает, а не контроль. Но код мой этого не учитывал, и все равно приказывал ИИ давать приказы своему физическому воплощению. Ну и тот попадает в цикл бесконечных попыток дать приказ своей тушке следовать за игроком. Так один единственный ИИ без физического воплощения зацикливает игру.
В итоге, я немало помучился, пока до меня не доехало, в чем же проблема. Но в последствии, был проведен дебаг. Во первых, количество точек спавна на карте было увеличено на порядок. Во вторых, код пополнился блоком, который заносил номер использованного спавнера в массив, и если новое рандомное число уже находилось в этом массиве, то оно игнорилось, и код генерировал новое, и так пока не заспавнится необходимое количество врагов. Ну и во третьих, если все таки предыдущих шагов каким-то образом не хватило, теперь ИИ, потерпевший неудачу при захвате контроля над тушкой, выпиливается сразу.
Также был небольшой глюк с увеличением размера моделей врагов. Просто путевые точки находились слишком близко к некоторым углам, и враги в них тупо застревали. Решилось банальной перестановкой этих самых точек.
Остался маленький баг - когда враг зажат в толпе своих, он может не найти путь к персонажу, что вызывает соответственные варны в логе. Но поскольку это не критично, я на это забил, все равно он продолжает нормально функционировать, как только появляется свободный путь.
Ну и эффекты. Тут была проблемка чисто технического характера. Сами эффекты являют собой классы, в которых есть всего две функции - первая отвечает за непосредственно влияние на носителя, вторая - за корректное уничтожение при истечении срока жизни (при создании эффекта запускается таймер, по истечении которого просто вызывается функция уничтожения). Инстансы помещаются в массив в классе юнита (будь то наш персонаж или враг), и соответственно, раз в секунду мы проходимся по всем элементам массива и вызываем влияние этого эффекта, ну и сортируем массив так, чтобы не было пустых ячеек. Но вот незадача - эффекты в массиве почему-то отказывались уничтожаться. Ну а дело в том, что после того, как элемент попал в массив, он "попадает в рабство", сиречь, самоуничтожиться не может. Решилась проблема заменой вызова уничтожения внутри класса эффекта на обычную булевскую переменную, обозначающую, должен ли еще существовать этот эффект. Ну и при пробеге по элементам массива, помимо непосредственно влияния и пересортировки, уничтожались еще и "просроченные" элементы массива (внешне функция уничтожения работала прекрасно). Вот такие дела.

В общем, делов на будущее у меня достаточно - нужно запилить хотя бы костяк системы апгрейдов (костяк - потому что для полной версии придется еще и интерфейс делать), доделать выпадающие предметы, ну и довести игру до первого самостоятельного пре-альфа билда, тобишь, сделать главное меню. О модельках я вообще молчу.
К слову, заглядывайте иногда на форум, я буду там постить инфу и, что весьма для меня важно, опросы. Например, завтра будет создана тема о том, какой же должна быть система апгрейда, так как вариантов много, и я не могу определиться.
Вот и все. Подписывайтесь, комментируйте - этим вы мотивируете автора продолжать свою работу.
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
15
12 лет назад
0
Крутяк, не иначе. Хочется отдельно увидеть систему эффектов, интересно звучит.
0
34
12 лет назад
0
Здорово. Звук у оружия только режет уши)
0
26
12 лет назад
0
God_of_light, я им все равно визуального оформления давать не буду, разве что иконку на интерфейсе.
Hellcore, это стандартное оружие UDK. Вероятней всего, мне будет достаточно поменять звук и модель (и снаряды), чтобы сделать из него штурмовую винтовку.
0
30
12 лет назад
0
секунды три втыкал что "точки для спавна" это spawn poins
а в целом ок, делай дальше)
1
37
12 лет назад
1
lentinant, а можно спросить - я просто мало в этом шарю - т.е. ты получается делаешь сейчас что-то типа своей игры (с ресурсами, внутренней технической начинкой - со всем короче)?
0
21
12 лет назад
0
Мне кажется или подтормаживает?
0
26
12 лет назад
0
Mud_Flow, 15 фпс при записи. Это потому что 1) у меня комп жестянка, у которой еще и видюху надо раз в неделю прогревать, чтобы работала; 2) это не игровой, а тестовый билд, и оптимизация в нем остутствует как понятие; 3) фрапс тоже несколько режет фпс, особенно, на маломощных машинах.
Elrat, вроде как, и да, и нет. Да - потому что я определенно делаю свою игру. Нет - потому что делаю я ее не с нуля, а на готовом движке, да и с ресурсами своими пока туговато, поэтому на данный момент используются стандартные ресурсы инструментария. Думаю, в будущем буду искать добровольцев на создание контента (пока я занимаюсь геймплеем), а если не найду, буду учиться делать сам (к слову, в таком случае, игру можно будет позиционировать как "проект для портфолио" - демонстрацию моих способностей в создании игр).
2 комментария удалено
Чтобы оставить комментарий, пожалуйста, войдите на сайт.