Могу ли я запретить диагональному движению показывать больше новых плиток, чем ортогональное, в сетке тайлов, где движение в любом из 8 направлений занимает одинаковое количество ходов (правила стиля шахматной доски)?
Например: вы красный прямоугольник на изображении ниже. Зеленые клетки в настоящее время видны вам (квадратное поле зрения). Вы можете перемещать расстояние одной плитки в любом из восьми направлений.
Если вы двигаетесь на северо-восток , вы исследуете 13 новых плиток (показаны синим цветом). Если вы вместо этого двигаетесь на юг , вы исследуете только 7 новых плиток (показаны фиолетовым цветом).
Как я могу сделать путешествие в каждом направлении одинаково благоприятным для исследования?
movement
grid
line-of-sight
Мистер Смит
источник
источник
Ответы:
В Dungeons and Dragons 3.5 (RPG с ручкой и бумагой) есть решение, используемое как для расчета перемещений, так и для расчета радиуса на основе сетки: стоимость диагонального перемещения составляет 1,5, а стоимость ортогональной. Поскольку диагональ единичного квадрата приблизительно равна 1,414, значение 1,5 довольно близко.
Поскольку D & D 3.5 поддерживает только целочисленное движение, способ, которым это фактически рассчитывается, заключается в том, что ортогональное движение стоит «один квадрат». Ваше первое диагональное движение также стоит только «один квадрат», а вторая диагональ стоит «два квадрата». Вы чередуете один и два квадрата для каждого диагонального хода. Реализация этого правила движения в вашей игре решит несколько проблем с диагональным движением.
Как показывает эта диаграмма, это правило движения создает разумную аппроксимацию окружностей и также не отклоняется более чем на 1 по сравнению с истинным расстоянием (когда в пределах 15 единиц от начала).
Если ваш видение / радиус исследования также рассчитывается таким образом, диагональные перемещения и диагональные открытия будут примерно такими же близкими или ортогональными.
источник
Вам необходимо изменить форму поля зрения.
Так что, когда вы двигаетесь в любом направлении, появляется одинаковое количество новых квадратов.
Вот одна возможность:
источник
Чтобы диагональное и ортогональное движение показывали примерно одну и ту же область, вам нужны две вещи (каждая из которых, одна, уже была предложена в другом ответе или комментарии):
Приблизительно круговой диапазон обзора :
Само по себе это не даст одинаково выявленной области для обоих типов движения. Например, на изображении выше, ортогональное движение показывает 9 квадратов, а диагональное движение показывает 13. Это все же лучше, чем соотношение 13/7 для площади квадрата в вашем примере.
Фактически, по мере увеличения радиуса обзора отношение выявленных областей на диагональный / ортогональный шаг стремится к √2 ≈ 1,414 для круглой области, в то время как такое же соотношение для квадратной области просмотра стремится к 2.
Медленное движение по диагонали :
В реальной жизни хождение по диагонали через квадратное поле занимает больше времени, чем хождение по одной из сторон. На самом деле это занимает примерно √2 ≈ 1,414 раза дольше. Если вы хотите, чтобы движение в вашей игре казалось реалистичным, вы должны сделать это и в своей игре.
На практике 3/2 = 1,5 - довольно хорошее приближение √2. Таким образом, вы можете просто сделать, чтобы каждый ортогональный шаг занимал две единицы времени, а каждый диагональный шаг занимать три. В приведенном выше примере области просмотра это дает 9/2 = 4,5 выявленных квадратов в единицу времени для ортогонального движения и 13/3 = 4,33 раскрытых квадратов в единицу времени для диагонального перемещения. Довольно близко, а?
В качестве альтернативы, если вы хотите придерживаться «1 шага = 1 единица времени» для ортогонального перемещения, вы можете использовать что-то вроде системы D & D, предложенной датчанином, и заставить каждый второй шаг по диагонали потреблять дополнительный ход. (Однако, если вы сделаете это, вам нужно дать каждому юниту явный счетчик того, сколько диагональных шагов они предприняли; в противном случае вы можете получить такие эксплойты, как, скажем, E, NE, E, NE, .. . последовательность движения позволяет игроку исследовать быстрее , чем предполагалось.)
источник
Поскольку вы используете сетку и знаете, в каком направлении движется пользователь, ничто не ограничивает вас от адаптации предыдущего ответа и использования различных полей зрения в зависимости от направления.
Например, вы можете расширить поле, включив в него углы, когда вы путешествуете в кардинальных направлениях, и уменьшить его на два квадрата на каждом конце в диагональных случаях, чтобы каждый раскрыл 9 квадратов.
Другой альтернативой, в зависимости от того, как работает ваше освещение, было бы использование лучшего приближения окружности с сглаживанием, чтобы частично показать некоторые квадраты.
источник
Как насчет того, чтобы вместо того, чтобы иметь фиксированный диапазон обзора, область видимости игрока зависела от того, в каком направлении был игрок, а также, возможно, от направления, в котором находился игрок в последние несколько ходов (игрок, который двигался на север, мог бы немедленно сделайте шаг на юг, но для достижения максимального расстояния просмотра в этом направлении может потребоваться несколько поворотов). Игрок, который выходит на север из узкого коридора в большую комнату и продолжает путешествовать на север, будет иметь ограниченную видимость на востоке и западе, и, вероятно, должен. Когда игрок прекращает движение, система может автоматически «исследовать» невидимые области, которые находятся в пределах текущего радиуса обзора игрока, но в то время как игрок активно перемещается, поле обзора должно быть более ограниченным.
источник
В качестве альтернативы более сложному полю зрения (которое, как обсуждалось выше, добавляет свои проблемы из-за ограничений макета на основе сетки), вы можете попытаться эмулировать эффект движения в игре, которая не основана на незаметном сетка. Там, где возможно свободное движение, диагональное движение одной единицы было бы именно таким, а не ~ 1,41 единиц движения, видимых с квадратной сеткой.
Несмотря на то, что вы не можете форсировать движение одного юнита, не потеряв свою неприглядную сетку (что значительно изменило бы ваш игровой дизайн), возможно, вы могли бы отслеживать дополнительные взятые движения и сбрасывать ходы позже: отследите дополнительные 0,41 с, и как только они составят больше, 1.00 у этого юнита пропустить ход. Или наоборот: считайте диагональ нормальной, прибавьте 0,41 с для каждого горизонтального или вертикального перемещения и дайте дополнительный кредит на перемещение, если оно больше 1 (или 1,41 для диагонального перемещения).
Вы должны быть осторожны, когда вы представляете это своим игрокам таким образом, чтобы это выглядело как гладко, так и честно. В сценарии с несколькими игроками такие изменения могут стать стратегическим преимуществом для игроков - это может быть проблемой, или может быть естественный способ смешать это с игровой механикой (возможно, позволить игрокам хранить небольшой количество «неиспользованного кредита на перемещение», которое они могут использовать для быстрого реагирования в более позднее время и получения дополнительных 0,41 секунды подачи движения в (или извлечение) из этого пула.
Это будет работать лучше всего, если объекты управления игроком перемещаются на одну единицу хода за ход. Например, три точки движения могут быть использованы как три горизонтальных движения или две диагональные с 0,16, оставленными в бассейне для дальнейшего использования. Как только это достигает 1.00, игрок получает «свободный» ход / очень и на 1.41 свободный диагональный ход. Вы можете ограничить дополнительный уровень 1,5, чтобы заставить его быть использованным или потерянным в этот момент, чтобы игрок не мог хранить накопленную энергию целую вечность или позволять ей накапливаться.
Очевидно, что это усложнение ваших правил игры, которое может быть совершенно нежелательным, и это было бы непрактично для некомпьютерной игры, но если бы вы могли заставить ее работать в рамках существующих правил вашей игры, это ограничило бы разницу в исследовании между направлениями движения без необходимости отказаться от формата сетки.
источник
Вы можете сделать так, чтобы игрок двигался в двух местах, если они двигались вверх, вниз, влево или вправо, и только на одно по диагонали. Это не полностью выровняло бы это, но это было бы намного ближе.
источник