Могу ли я помешать диагональному движению исследовать больше карты?

57

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

Например: вы красный прямоугольник на изображении ниже. Зеленые клетки в настоящее время видны вам (квадратное поле зрения). Вы можете перемещать расстояние одной плитки в любом из восьми направлений.

Если вы двигаетесь на северо-восток , вы исследуете 13 новых плиток (показаны синим цветом). Если вы вместо этого двигаетесь на юг , вы исследуете только 7 новых плиток (показаны фиолетовым цветом).

сетка с видимостью в зависимости от положения

Как я могу сделать путешествие в каждом направлении одинаково благоприятным для исследования?

Мистер Смит
источник
27
Это фундаментальный недостаток дизайна такой игры. Вам нужно либо не допустить перемещения по диагонали, либо переключиться на что-то вроде шестигранной сетки, у которой нет этой проблемы.
Тетрад
1
@Tetrad Вы не ошиблись, считая это недостатком, но, вероятно, вы не понимаете, насколько это распространено в играх, подобных этой .
г-н Смит
8
В любой игре, где ортогональные и диагональные движения одинаково быстры, всегда будут некоторые вещи, для которых диагональное движение лучше, чем ортогональное движение и наоборот. Это просто не решаемо - если вы закроете одно отверстие, откроется другое.
Паташу
3
Не совсем полный ответ, но возможно ли в вашей игре, чтобы перемещение по диагонали занимало больше времени, чем ортогональное, пропорциональное длине диагонали? Во-вторых, у вас может быть смешанное решение, в котором для движения используется ромбовидный рисунок, а для расстояния просмотра - квадрат?
Vality
2
Еще один не совсем ответ: ортогональные движения ведут себя так же, как и сейчас, но диагональные движения приводят к тому, что источник света становится «нечетким» - он не показывает все 13 квадратов, которые только что попали в диапазон, но только 7 (или около того) из них, определяется случайным образом.
Snowbody

Ответы:

67

В Dungeons and Dragons 3.5 (RPG с ручкой и бумагой) есть решение, используемое как для расчета перемещений, так и для расчета радиуса на основе сетки: стоимость диагонального перемещения составляет 1,5, а стоимость ортогональной. Поскольку диагональ единичного квадрата приблизительно равна 1,414, значение 1,5 довольно близко.

Поскольку D & D 3.5 поддерживает только целочисленное движение, способ, которым это фактически рассчитывается, заключается в том, что ортогональное движение стоит «один квадрат». Ваше первое диагональное движение также стоит только «один квадрат», а вторая диагональ стоит «два квадрата». Вы чередуете один и два квадрата для каждого диагонального хода. Реализация этого правила движения в вашей игре решит несколько проблем с диагональным движением.

Как показывает эта диаграмма, это правило движения создает разумную аппроксимацию окружностей и также не отклоняется более чем на 1 по сравнению с истинным расстоянием (когда в пределах 15 единиц от начала).

введите описание изображения здесь

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

датчанин
источник
Именно то, что я хотел предложить. Хотя стоит отметить, что эта стратегия с точки зрения ограничения движения падает, если персонаж может перемещаться только на один пробел за ход (что, похоже, относится к диаграмме вопроса?). Вы могли бы «запомнить», если они находятся на нечетных / четных диагоналях между ходами, хотя это может сбивать с толку / расстраивать игрока. Несмотря на это, это хорошо работает для проблемы видимости.
Алексис Бессесснер
5
@AlexisBeingessner, правда. И тот, кто спрашивал, указал, что ему нужно движение, похожее на шахматного короля, но я полагаю, что, поскольку это сайт по разработке компьютерных игр, я бы указал на хорошее игровое решение. Если это скорее загадка или чисто математический вопрос, я бы ожидал этого на другом сайте. Если это для мошеннической игры, некоторые из них уже поддерживают переменную скорость движения.
датчанин
Большинство Roguelike-игр кажутся пошаговыми, но на самом деле имеют временную составляющую, поэтому, если вы двигаетесь по диагонали, у других объектов будет больше времени для реакции, прежде чем вы сделаете еще один ход.
Кос,
67

Вам необходимо изменить форму поля зрения.

Так что, когда вы двигаетесь в любом направлении, появляется одинаковое количество новых квадратов.

Вот одна возможность:

пример сетки

ChargingPun
источник
5
Интересно; Я никогда не рассматривал алмазное поле зрения. Тем не менее, есть проблема с этой точкой зрения; Теперь ужасно путешествовать по диагонали, потому что если вы заметите врага во время путешествия по диагонали, он будет значительно ближе к вам, чем если бы вы путешествовали ортогонально.
Мистер Смит
43
@ mr.smith, да, это новая проблема, но я решил твою старую ...
ChargingPun
В самом деле, вы сделали; кажется, я не был достаточно конкретен с вопросом.
Мистер Смит
8
Поможет ли здесь круглая форма?
amitp
3
@amitp Это является круглой формой - при условии , ваша функция расстояния Манхэттенский расстояния.
Даниэль Вагнер
27

Чтобы диагональное и ортогональное движение показывали примерно одну и ту же область, вам нужны две вещи (каждая из которых, одна, уже была предложена в другом ответе или комментарии):

  1. Приблизительно круговой диапазон обзора :

    Изображение псевдокруглого диапазона обзора

    Само по себе это не даст одинаково выявленной области для обоих типов движения. Например, на изображении выше, ортогональное движение показывает 9 квадратов, а диагональное движение показывает 13. Это все же лучше, чем соотношение 13/7 для площади квадрата в вашем примере.

    Фактически, по мере увеличения радиуса обзора отношение выявленных областей на диагональный / ортогональный шаг стремится к √2 ≈ 1,414 для круглой области, в то время как такое же соотношение для квадратной области просмотра стремится к 2.

  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, .. . последовательность движения позволяет игроку исследовать быстрее , чем предполагалось.)

Илмари Каронен
источник
Простой способ предотвратить такие подвиги состоит в том, чтобы сказать, что затраты на диагональное перемещение занимают два тика, за исключением случаев, когда им предшествует движение в том же направлении, что и два тика.
суперкат
1
@supercat: Верно, но при этом последовательность E, NE, E, NE, ... заметно менее эффективна для изучения, чем прямое ортогональное / диагональное движение, что также может быть нежелательно.
Ильмари Каронен
Это оставит эту последовательность менее эффективной, но что с того? Не все методы разведки должны быть одинаково эффективными. На самом деле, было бы неплохо иметь временное наказание за изменение ориентации, за исключением случаев, когда движение до или после проходило по диагонали с двойным зарядом.
суперкат
2
Некоторое время назад я сделал нечто подобное, и я решил, что ортогональное движение стоит два «тика» за квадрат, а диагональное перемещение - три.
Мейсон Уилер
11

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

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

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

user43497
источник
Это интересный компромисс; если вы путешествуете по диагонали, не все клетки, которые обычно были бы видимы, были бы видимы. Вы можете либо подождать хода (чтобы исследовать эти клетки), либо продолжить движение.
Мистер Смит
8
какой ответ "предыдущий ответ"?
Mooing Duck
7

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

Supercat
источник
3

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

Несмотря на то, что вы не можете форсировать движение одного юнита, не потеряв свою неприглядную сетку (что значительно изменило бы ваш игровой дизайн), возможно, вы могли бы отслеживать дополнительные взятые движения и сбрасывать ходы позже: отследите дополнительные 0,41 с, и как только они составят больше, 1.00 у этого юнита пропустить ход. Или наоборот: считайте диагональ нормальной, прибавьте 0,41 с для каждого горизонтального или вертикального перемещения и дайте дополнительный кредит на перемещение, если оно больше 1 (или 1,41 для диагонального перемещения).

Вы должны быть осторожны, когда вы представляете это своим игрокам таким образом, чтобы это выглядело как гладко, так и честно. В сценарии с несколькими игроками такие изменения могут стать стратегическим преимуществом для игроков - это может быть проблемой, или может быть естественный способ смешать это с игровой механикой (возможно, позволить игрокам хранить небольшой количество «неиспользованного кредита на перемещение», которое они могут использовать для быстрого реагирования в более позднее время и получения дополнительных 0,41 секунды подачи движения в (или извлечение) из этого пула.

Это будет работать лучше всего, если объекты управления игроком перемещаются на одну единицу хода за ход. Например, три точки движения могут быть использованы как три горизонтальных движения или две диагональные с 0,16, оставленными в бассейне для дальнейшего использования. Как только это достигает 1.00, игрок получает «свободный» ход / очень и на 1.41 свободный диагональный ход. Вы можете ограничить дополнительный уровень 1,5, чтобы заставить его быть использованным или потерянным в этот момент, чтобы игрок не мог хранить накопленную энергию целую вечность или позволять ей накапливаться.

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

Дэвид Спиллетт
источник
2

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

drdavehere
источник
Это хорошая идея, но я считаю, что это эквивалентно
простому