@Onigire

Проверка редких кейсов в логике игр?

Здравствуйте, у меня вопрос по логике разработки игр.
Представим игру - Terraria.
Во всей игре есть лишь одно место, где нельзя ставить провода - храм джунглей.
Неужели ради одного такого редкого кейса, игре нужно каждый раз на протяжении всего игрового процесса, перед расположением блока - проверять, не был ли этим блоком провод и не находился ли игрок в храме?
Можно много привести подобных примеров.
Это все было бы слишком сложно и трудозатратно что бы быть правдой, ведь в игре слишком много контента.
Как тогда это делается?
  • Вопрос задан
  • 355 просмотров
Решения вопроса 1
hint000
@hint000
у админа три руки
Вот поэтому...
для геймдева нужно знать дискретную математику

Можно создать битовую маску / битовую карту, в которой по одному измерению будут блоки, по другому измерению локации. Единичный бит будет означать доступность действия, нулевой бит - недоступность.
Тогда "сто тыщ миллионов" условий будут проверяться одной строкой кода. Такой подход слегка напоминает ПЛИС / FPGA. Кстати, если скомбинировать это с ответом Daemon23RUS, можно не таскаться с огромной битовой картой, а подгружать маленькую в конкретной локации. И, более того, битовую карту можно динамически менять в зависимости от дополнительных факторов, например, разлочивание какой-то возможности будет выглядеть как замена одного нолика на единичку в битовой карте.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 5
wataru
@wataru Куратор тега Алгоритмы
Разработчик на С++, экс-олимпиадник.
Эта проверка - элементарна. Поле и так все в памяти хранится. Просто посмотреть, что за тип биома там и есть ли там уже провод - это один if. Это наносекунды процессорного времени
Ответ написан
Комментировать
Daemon23RUS
@Daemon23RUS
Не скажу за игровой процесс Terraria, но ваше предположение можно условно назвать монолитной компоновкой, и тогда - да каждый раз проверка. Но это жутко непрактично на большом контенте, в особенности при его расширении и дополнении (можно что то сломать и долго искать причину) Поэтому второй вариант - условно модульный, проверка на уровне сегмента территории, что там можно ставить, чего нельзя. Сам код проверки единый, а вот данные подгружаются в соответствии с локацией.
Ответ написан
Комментировать
Vindicar
@Vindicar
RTFM!
ИМХО достаточно прописать у класса блока метод/обработчик события, который вызывается перед попыткой поставить блок по координатам и сообщает, можно ли его поставить. По дефолту метод может либо проверять базовые вещи типа "есть ли уже блок в этом месте", либо (если эта проверка вынесена за рамки метода и выполняется отдельно) тупо возвращать true.

Это паттерн Полиморфизм, он встречается в наборе G.R.A.S.P. и ещё много где. Если на пальцах - если нужны разные реализации какой-то операции над разными типами объектов, нужно вместо большого дерева if-else-if-else-if-else сделать перегружаемый метод. Тогда можно будет возложить выбор правильной реализации метода на компилятор - к какому классу объект принадлежит, такой вариант метода и вызовется.
Ответ написан
Комментировать
@CBET_TbMbI
> Во всей игре есть лишь одно место, где нельзя ставить провода - храм джунглей.

А чем это отличается от любой другой логики, описываемой словом "только"?
- яйцо дракона можно получить только с дракона
- мифическую руду можно получить только копая в мифической пещере
- костёр можно развести везде кроме водоёмов
Ответ написан
Комментировать
CityCat4
@CityCat4
Внимание! Изменился адрес почты!
Блоку приделывается обработчик события "Установка". И там прописывается все, что считается нужным.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы