Предотвратить катастрофу в рулевых гонках

9

Играя в GTA III на Android, я заметил кое-что, что раздражало меня почти во всех гоночных играх, в которые я играл (может быть, за исключением Mario Kart): ехать прямо вперед легко, но кривые очень сложны. Когда я меняю полосу движения или проезжаю мимо кого-то, машина начинает поворачиваться взад-вперед, и любая попытка исправить это только усугубляет ситуацию. Единственное, что я могу сделать, это нажать на тормоза. Я думаю, что это какая-то перегрузка.

То, что делает это настолько раздражающим, - то, что это никогда не случается со мной в реальной жизни (слава богу :-)), таким образом, 90% игр с транспортными средствами внутри кажутся мне нереальными (несмотря на то, что, вероятно, имеют действительно хорошие физические движки). Я говорил об этом с парой людей, и кажется, что вы либо «получаете» гоночные игры, либо нет. С большой практикой мне удавалось добиться полуготовности в некоторых играх (например, из серии «Необходимость в скорости»), очень осторожно ездя, много тормозя (и обычно у меня болят пальцы).

Что вы можете сделать как разработчик игры, чтобы предотвратить катастрофическую резонансную катастрофу и сделать так, чтобы чувство вождения было правильным? (Для казуальной гоночной игры, которая не стремится к 100% реалистичной физике)

Мне также интересно, какие игры, такие как Super Mario Kart, делают по-другому, чтобы у них не было слишком большого перегиба?

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

JDM
источник
3
Вы также должны рассмотреть, кто является вашей целевой аудиторией. Если это энтузиасты вождения геймеров, вы будете отталкивать их, только «исправляя» реальность. Вы, вероятно, не гоночные автомобили, и не понимаете, что на высоких скоростях гонки проблема, с которой вы сталкиваетесь, является очень реальной вещью, которая является проблемой для настоящих гонщиков. Настоящее «исправление» заключается в том, чтобы быть более случайным, и это то, что Марио Карт делает по-другому. Они более свободны в физике и не моделируют силы, необходимые для создания рыбьего хвоста, и, следовательно, не представляют интереса для фанатов хардкор-вождения.
DampeS8N
Я не знаю, как легко у вас есть доступ к этому, но подумал, что это может помочь. Я давно играл в PSX-игру под названием «Формула-1». Они сделали несколько из них, но это была самая первая игра. В любом случае это была симуляция, но у опций были опции рулевого управления и помощи при взломе с помощью ползунка, который можно увеличивать или уменьшать. Так, например, если у вас очень высокая помощь при взломе, ваша машина будет автоматически ломаться, если она будет слишком быстро поворачивать, и она будет поворачивать и вас (в зависимости от того, сколько помощи вы хотели), так что вы можете проверить это для решения.
wardd

Ответы:

7

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

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

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

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

Philipp
источник
Спасибо за ваше исправление, @kotekzot. Но вы можете предлагать правки другим постам напрямую, не спрашивая их.
Филипп
твоя идея хороша. Когда нажата правая кнопка (0/1), она повернет автомобиль на угол, который зависит от кривой. Прямо как при движении: вы говорите «я поворачиваю налево» (0/1), но на самом деле вы поворачиваете руль более или менее в зависимости от уклона. И еще кое-что, о чем стоит упомянуть: угол меняется постепенно , а не внезапно.
GameAlchemist
0

Я сталкивался с этим (старым) вопросом, исследуя то, что реализовали другие игры, кроме Grand Theft Auto IV и V, но у меня есть достойный ответ для достижения контролируемой избыточной поворачиваемости. У меня есть только некоторый опыт работы с моделью вождения в Grand Theft Auto V, но эта информация должна быть применима к большинству реалистичных моделей вождения.

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

Что можно увидеть в Grand Theft Auto V, так это то, что пользовательский ввод рулевого управления напрямую не связан с выходом рулевого управления. Транспортное средство движется само по себе, к его текущему вектору скорости. Это видно при форсировании ситуации с небольшим избыточным поворотом и наблюдении за управляемыми колесами - без какого-либо вмешательства они сами поворачиваются. Любой пользовательский ввод затем добавляется поверх этих «естественных» исправлений.

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

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

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

Следует помнить, что Grand Theft Auto V была выбрана здесь как «идеальная», хотя мне еще предстоит найти какую-либо другую игру, в которой реализована эта система.

Если вам интересно какой-то код, вот фрагмент моей реализации.

// Returns in radians
float Racer_calculateDesiredHeading(float steeringMax, float desiredHeading,
    float reduction) {
    desiredHeading *= reduction;
    float correction = desiredHeading;

    // Get the relative velocity vector
    Vector3 speedVector = ENTITY::GET_ENTITY_SPEED_VECTOR(vehicle, true);
    if (abs(speedVector.y) > 3.0f) {
        // Simplify it to an angle
        Vector3 target = Normalize(speedVector);
        float travelDir = atan2(target.y, target.x) - static_cast<float>(M_PI) / 2.0f;
        if (travelDir > static_cast<float>(M_PI) / 2.0f) {
            travelDir -= static_cast<float>(M_PI);
        }
        if (travelDir < -static_cast<float>(M_PI) / 2.0f) {
            travelDir += static_cast<float>(M_PI);
        }
        // Correct for reverse
        travelDir *= sgn(speedVector.y);

        // Limit to some degree, R* uses 15 degrees
        travelDir = std::clamp(travelDir, deg2rad(-15.0f), deg2rad(15.0f));

        // User input deviation
        correction = travelDir + desiredHeading;
    }

    return std::clamp(correction, -steeringMax, steeringMax);
}
IKT
источник