Найти тему
Сделай игру

Боевые роботы. Часть 4. Исправление недочётов

Оглавление

В прошлой части я писал о том, как сделать врагов поумнее. Поумней они, конечно, стали, но анализ игрового процесса, да и организации кода, выявил ряд недостатков, которые я решил подправить.

Маски

В первую очередь, потребовалось подправить маски наложения: это такие зоны подсветки, показывающие, как будет развиваться игровой процесс. Куда можно пойти, куда нельзя, что видно, чего не видно. И всё в таком духе. Проблема в том, что данная подсветка, изначально, была привязана к герою, что совершенно логично привело к тому, что её формирование оказалось внутри кода героя. Что, разумеется, неправильно. В итоге, всё было перенесено в отдельный модуль и стало работать уже внутри всего приложения, а не только героя. По сути, потребовалось описать логику работы следующих масок наложения:

  1. Видимые и невидимые зоны;
  2. Куда персонаж может пойти;
  3. Как далеко персонаж может выстрелить;
  4. По какой траектории полетит выстрел (некоторые снаряды не должны иметь возможности пролетать через преграды, а некоторые - должны) и где, если что, она завершится;
  5. Какой будет зона поражения (либо точка, либо взрыв с радиусом поражения).

Если первые три маски уже более-менее работали, то четвёртая и пятая - нет. И их понадобилось добавить. Плюс, немного была улучшена схема визуальная составляющая.

Маски наложения
Маски наложения

Итого, получилось приемлемо. Зона видимости теперь ограничивается "затуманенной областью", что позволяет видеть тип преграды, но не позволяет видеть противника. Куда можно пойти - зелёная штриховка, радиус поражения - красная подсветка; линия атаки - жёлтые кружки; если через препятствие нельзя пробиться - то в том месте кружки меняют цвет на красный. Ну и зона поражения - голубой.

На самом деле, я ничего нового тут не придумал; всё это было задолго до меня в разных играх. Хотя навскидку не припомню, в какой именно игре всё это накладывалось одновременно. Но маски, если что, потом можно будет подправить, благо технический задел на это теперь есть.

А ещё решил добавить указатель, сколько ходов будет стоить то или иное действие. Может быть это и лишнее, но такие нюансы делают игровой процесс более предсказуемым.

Зелёный прямоугольник - сколько стоит шаг, жёлтый - цена выстрела
Зелёный прямоугольник - сколько стоит шаг, жёлтый - цена выстрела

Исправление траекторий

Изначально, ограничений в траекториях не было. Грубо говоря, выстрел летел насквозь чего угодно и ничего ему не мешало. Что было неправильно. В блоке масок я подправил отрисовку, а в этом решил исправить и поведение. Благо, вынесенные в отдельный модуль вычисления позволили использовать их повторно.

Выстрел есть, а вот попадания - больше нет
Выстрел есть, а вот попадания - больше нет

А ещё, взвесив все "за" и "против" - решил исправить для некоторого типа оружия траектории. Чтобы "по дуге" стреляли лишь некоторые типы.

Впрочем, исправление траекторий, привело к неприятному последствию: вражеские роботы разучились стрелять. Причина оказалась проста: изначально, логика ИИ была привязана только к расстояниям, но никак не к невозможности стрельнуть через препятствие. Пришлось немного усовершенствовать кодовую базу, дабы избавиться от подобного казуса.

Усовершенствование игрового процесса

Так уж вышло, что режим защиты есть у злодеев, но нет у героя. Это непростительно. Но коль скоро управление всё осуществляется при помощи мышки - решил просто добавить защиту как ещё один квадратик оружия.

Теперь появилась защита. Можно подождать восстановление оружия
Теперь появилась защита. Можно подождать восстановление оружия

Предположительно, персонажи смогут активировать некоторые способности и активировать их, удобней всего, будет через панель оружия. Поэтому я просто в настройках для оружия, добавил специальные поля, позволяющие вызвать любой метод объекта персонажа. Например, прыжок на большое расстояние или, как в моём случае, вызов защиты. Эдакий задел наперёд.

Разделение действий

Следующая проблема возникла там, где её, казалось бы, быть не должно. Когда у персонажа заканчиваются ходы, ход переходит к следующему. И процесс перехода должен как-то контролироваться. Это может потребоваться для разных целей: плавно переместить карту на место движения нового героя, отобразить текст типа "Ход завершён" или просто отобразить некоторую анимацию.

Иными словами, потребовалось создать два дополнительных события:

  • Закончился ход персонажа;
  • Все персонажи сделали свои ходы.

Тут сложность оказалась в том, что до настоящего момента, все переключения ходов выполнялись, как бы так сказать, стихийно. То есть, как только заканчивалась очередная анимация - проверялось количество оставшихся очков действий и, если они заканчивались, управление передавалось следующему персонажу.

И вот тут и была принципиальная ошибка: контроль упирался исключительно в действия персонажей, а, следовательно, все дополнительные действия должны были либо тоже стать действиями персонажей, либо такая парадигма должна была быть изменена.

Я, разумеется, пошёл по второму пути, тем более, что у такого подхода потенциал сильно больше.

Вообще, было несколько путей реализации такой задумки, но я решил, что будет намного эффективней просто добавить дополнительный массив с блокирующими событиями, которые не позволят выполняться основному потоку игрового процесса, пока не будут завершены. Должен заметить, что в настоящее время решение выглядит вполне себе удобным и рабочим; как это повлияет на игру в дальнейшем - время покажет.

Дополнительные события: конец хода и конец раунда
Дополнительные события: конец хода и конец раунда

Вроде и выглядит всё просто, но пришлось кое-что переделать.

И завершая

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

В частности, теперь персонажи могут ходить поверх поверженных союзников и врагов (раньше этого нельзя было делать).

Также, немного доработал фокусирование на текущем персонаже. Если коротко - он теперь всегда примерно посередине, как в третьих героях. Надо сказать, получилось очень посредственно, однако, для начала и этого достаточно.

Чтобы подытожить

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

Ну а на этом, пока что, всё. Дальше продолжу совершенствовать игру: план я уже обозначил в прошлой статье.