Prevenir catástrofes de sobreviraje en juegos de carreras


9

Al jugar a GTA III en Android, noté algo que me ha molestado en casi todos los juegos de carreras que he jugado (tal vez excepto Mario Kart): Conducir en línea recta es fácil, pero las curvas son realmente difíciles. Cuando cambio de carril o paso a alguien, el auto comienza a girar de un lado a otro, y cualquier intento de corregirlo lo empeora. Lo único que puedo hacer es pisar el freno. Creo que esto es una especie de sobreviraje.

Lo que lo hace tan irritante es que nunca me sucede en la vida real (gracias a Dios :-)), por lo que el 90% de los juegos con vehículos en el interior me parecen irreales (a pesar de que probablemente tengan motores de física realmente buenos). He hablado con un par de personas sobre esto, y parece que o 'obtienes' juegos de carreras o no. Con mucha práctica, logré ser semi-bueno en algunos juegos (por ejemplo, de la serie Need for Speed), conduciendo con mucha precaución, frenando mucho (y generalmente teniendo un calambre en los dedos).

¿Qué puede hacer como desarrollador de juegos para evitar la catástrofe de resonancia de sobreviraje y hacer que la conducción se sienta bien? (Para un juego de carreras casual, que no se esfuerza por una física 100% realista)

También me pregunto qué juegos como Super Mario Kart hacen exactamente de manera diferente para que no tengan tanto sobreviraje.

Supongo que un problema es que si juegas con un teclado o una pantalla táctil (pero no con ruedas y pedales), solo tienes entrada digital: gas presionado o no, dirección izquierda / derecha o no, y es mucho más difícil conducir adecuadamente para un velocidad dada La otra cosa es que probablemente no tenga un buen sentido de la velocidad y conduzca mucho más rápido de lo que lo haría (con seguridad) en realidad. Desde lo alto de mi cabeza, una solución podría ser variar la respuesta de la dirección con la velocidad.


3
También debe considerar quién es su público objetivo. Si se trata de entusiastas de los juegos de conducción, solo los alejará 'arreglando' la realidad. Probablemente no corras autos, y no entiendes que a las altas velocidades de una carrera, el problema que estás experimentando es algo muy real que es un problema para los pilotos reales. La verdadera 'solución' es ser más informal, y eso es lo que Mario Kart está haciendo diferente. Son más flexibles con la física y no modelan las fuerzas necesarias para crear la cola de pez, y por lo tanto no son de interés para los fanáticos de los juegos de conducción.
DampeS8N

No sé qué tan fácil tiene acceso a esto, pero pensé que podría ayudar. Jugué un juego de PSX hace mucho tiempo llamado Fórmula Uno ... hicieron varios de ellos, pero fue el primero. De todos modos, era una simulación, pero las opciones tenían opciones de asistencia de dirección y rotura con un control deslizante que se podía aumentar o disminuir. Entonces, si tenía una asistencia de frenado muy alta, por ejemplo, su automóvil se rompería automáticamente si iba a girar demasiado rápido, y también se dirigiría hacia usted (dependiendo de la asistencia que deseara), por lo que es posible que desee verificar eso por una solución.
Ward

Respuestas:


7

Una solución sería hacer un poco de trampa y adivinar lo que el jugador quiere hacer. Cuando el jugador está en una sección recta y presiona hacia la izquierda, puede suponer que quiere cambiar de carril. Cuando está cerca de una curva o intersección, ciertamente quiere girar. El jugador no puede controlar su ángulo de dirección exacto en una curva, por lo que puede decidir darle al jugador el beneficio de la duda y siempre dejarlo conducir a través de curvas en el ángulo ideal cuando presiona el botón de giro en el momento correcto (siempre lo más físicamente posible: cualquier jugador que intente conducir a través de una curva cerrada con 200 km / h merece ser castigado con un vuelo corto sobre el césped).

Esto, por supuesto, podría ser complicado cuando el jugador realmente quiere girar en una sección recta o realmente quiere cambiar de carril justo antes de una intersección.

Otra solución sería tener una diferencia entre tocar una tecla y mantenerla presionada. Cuanto más tiempo mantenga el jugador la tecla de giro, mayor será el ángulo de giro. Esto ni siquiera parece poco realista, porque cuando tienes un volante, necesitas tiempo para girarlo por completo.

Editar: en una pantalla táctil, puede usar controles deslizantes en lugar de botones para controlar la dirección y la velocidad de forma analógica. Cuando la pantalla es sensible a la presión, también puedes interpretar la presión (pero dar retroalimentación visual sobre la presión máxima, o los jugadores demasiado celosos pueden romper sus pantallas). Cuando el dispositivo tiene sensores de orientación, puede usar la inclinación del dispositivo para controlar la dirección.


Gracias por su corrección, @kotekzot. Pero puede sugerir modificaciones a las publicaciones de otras personas directamente sin tener que pedirles.
Philipp

Tu idea es buena. Cuando se presiona el botón derecho (0/1), rotará el automóvil con un ángulo que depende de la curva. Justo como cuando conduces: dices 'doblo a la izquierda' (0/1) pero de hecho girarás el volante más o menos dependiendo de la pendiente. Y también algo que vale la pena mencionar: el ángulo cambia gradualmente , no de repente.
GameAlchemist

0

Me encontré con esta (antigua) pregunta mientras investigaba qué otros juegos que Grand Theft Auto IV y V han implementado, pero tengo una respuesta decente para lograr un sobreviraje controlable. Solo tengo algo de experiencia jugando con el modelo de conducción en Grand Theft Auto V, pero esta información debería ser aplicable a la mayoría de los modelos de conducción algo realistas.

Lo que parece suceder en la mayoría de los juegos de conducción es que la salida de la dirección del automóvil está directamente vinculada a la entrada del jugador, incluso si se usa algún tipo de suavizado (temporal). Esto provoca una sensación de lentitud o una sensación espasmódica, y el automóvil no se corrige solo después de soltar los controles. Esto contrasta con un automóvil real, donde el automóvil tiende a centrarse después de liberar la fuerza sobre el volante. Algunos juegos intentan corregir esto cambiando su modelo de manejo o teniendo modelos de manejo arcade.

Lo que se puede observar en Grand Theft Auto V es que la entrada de dirección del usuario no está directamente vinculada a la salida de dirección. El vehículo se dirige solo, hacia su vector de velocidad actual. Esto es visible al forzar una ligera situación de sobreviraje y observar las ruedas de dirección; sin ninguna entrada, contrarrestan por sí mismas. Cualquier entrada del usuario se agrega luego de estas correcciones "naturales".

Sin embargo, una desventaja de este enfoque es que el automóvil se siente demasiado pegajoso y algo terco para entrar en un deslizamiento de poder o deriva, por lo que este valor de contraviraje puede limitarse a algún ángulo.

Esta teoría puede verificarse reinstalando el sistema de dirección y comparándolo con el comportamiento original.

  • Al vincular entrada a salida directamente, el vehículo es extremadamente difícil de controlar, incluso cuando se ha aplicado el limitador de entrada de dirección basado en la velocidad.
  • Al agregar el contraviraje natural, el comportamiento es casi idéntico a la implementación de los juegos, pero los autos son "demasiado" estables.
  • Cuando se agrega un límite de 15 grados al contraviraje, el comportamiento es casi idéntico.

Una cosa a tener en cuenta es que Grand Theft Auto V fue tomado como "ideal" aquí, aunque todavía no he encontrado ningún otro juego que implemente este sistema.

Si tiene curiosidad por algún código, aquí hay un fragmento de mi implementación.

// 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);
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.