Направление взгляда

Материал из Клуб любителей рогаликов
Перейти к: навигация, поиск

Введение

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

Правила

Направление взгляда игрока определяется его предыдущим перемещением, и расположением вокруг него монстров, следующим образом (правила применяются в приведённом порядке): Если последним ходом был выстрел стрелой, использование волшебной палочки, метание снаряда, и т.п., тогда игрок смотрит в том направлении, в котором он стрелял/направлял эффект/бросал. Иначе, если около игрока есть только один видимый монстр, игрок поворачивается лицом к нему. Объяснение: Независимо от направления перемещения, игрок настороже и защищается против атак. Иначе, если последняя атака была передвижением или атакой, взгляд направлен в направлении данного перемещения/атаки. Иначе, направление взгляда такое же, как и при последнем перемещении.

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

Бой

Во время данного хода тайлы вокруг игрока подразделяются на фронтальный, фланговый и задний (см. Фиг. 1). Если атакующий монстр находится на фланговом или заднем тайле, игрок не получает защитных преимуществ от щита. (Вариация: один фланг получает преимущества щита, в зависимости от того, в какой руке щит.) Кроме того, если нападающий находится во фланговом тайле, он получает небольшой (в зависимости от системы), бонус to-hit, в то же время если он находится в заднем тайле, он получает значительный бонус.

Fig. 1 - Melee
Направление взгляда @ [восток]        Направление взгляда северо-восток
         321              1: Фронт                   211
         3@1              2: Фланг                   3@1
         321              3: Тыл                     332

Дистанционное Оружие

Атакующий на расстоянии получает преимущество при атаке с фланга или на расстоянии, в зависимости от того, в каком квадранте (см. Фиг. 2) он находится.

Fig. 2 - Missile
Направление взгляда восток         Направление взгляда северо-восток
         \222/                                   22|11
         3\2/1                                   22|11                1: Фронт
         33@11                                   --@--                2: Фланг
         3/2\1                                   33|22                3: Тыл
         /222\                                   33|22

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

Более Формальное Определение

Пока мы ограничиваем дистанционные атаки стрельбой вдоль прямых или диагональных направлений, мы можем представить направление взгляда как целое число от 0 до 7, изменяющеееся по часовой стрелке в 45-градусными приращениями; чтобы определить, в какой области находится нападающий, мы находим направление взгляда к нему, вычитаем из направления взгляда игрока 8 и берём модуль от результата; если результат <= 1, то это фронтальная атака; иначе если <=2, фланговая атака; иначе <=4, - сзади.

Если мы не делаем этого ограничения, то мы должны допустить как то, что игрок поворачивается лицом на произвольные углы, так и то, что угол дистанционной атаки точно рассчитывается. Угол между игрока и нападающим равен atan2(monst.y-plr.y, monst.x-plr.x) радиан. Как и раньше, мы берём атака abs(угол - направление взгляда игрока % (2*pi)). (На этот раз есть некоторая сложность с использованием модуля, поскольку Си не поддерживает использование оператора модуля для чисел с плавающей запятой.) Атака фронтальная, если результат <= pi/4, фланговая, если <= 3*pi/4, иначе <= pi, сзади. Как обход отсутствия модуля для чисел с плавающей запятой, Вы вместо этого можете использовать функцию C ниже.

float mod(float a, float b) {
    if(a&gt0) return floor(a/b) * b;
    else    return -floor(-a/b) * b;
}

Дополнительно о Дистанционном Оружии

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

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

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



Автор: Jimmy Babcock.
Источник: неизвестен.
Перевел: Дмитрий О. Бужинский, 06.03.2006.