2012-06-17 13 views
5

Actualmente estoy desarrollando un juego para Android, y me gustaría su experiencia en un problema que he tenido.Desarrollo de juegos para Android: detección de colisiones fallidas

Antecedentes:

  1. Mi juego incorpora la velocidad de fotogramas de movimiento independiente, que tiene en cuenta el valor delta tiempo antes de realizar velocidad necesaria cálculos.

  2. El juego es un juego de plataformas en 2D tradicional.

El Problema:

Aquí está mi problema (simplificado). Vamos a pretender que mi personaje es un pie cuadrado en la parte superior de una plataforma (con "gravedad" es una velocidad constante hacia abajo de characterVelocityDown).

he definido la detección colisión de la siguiente manera (suponiendo Y puntos del eje hacia abajo):

Dado characterFootY es la coordenada y de la base de mi carácter cuadrado, platformSurfaceY es la ordenada superior coordenada de mi plataforma, y ​​platformBaseY es la menor coordenada y de mi plataforma:

if (characterFootY + characterVelocityDown > platformSurfaceY && characterFootY + characterDy < platformBaseY) { 

        //Collision Is True 
        characterFootY = platformSurfaceY; 
        characterVelocityDown = 0; 

       } else{ 
        characterVelocityDown = deltaTime * 6; 

Este enfoque funciona p erfectly fine cuando el juego se ejecuta a velocidad normal; Sin embargo, si el juego se ralentiza, la DeltaTime (que es el tiempo transcurrido entre el marco previo y el actual) se hace grande, y characterFootY + characterVelocityDown superan los límites que definen la detección de colisiones y el carácter justo cae directo (como si fuera teletransportarse).

¿Cómo debo abordar este problema para evitar esto?

Gracias de antemano por su ayuda y estoy deseando aprender de usted!

+0

Si alguien más tiene este problema, una posible solución para esto es limitar el valor deltaTime para que cuando sea mayor a un cierto valor, simplemente lo ajuste al límite. Esto haría que la velocidad de juego fuera inconsistente, pero debería estar bien en la mayoría de los casos. – SeveN

+0

¿Tiene los valores delta antes y después, ya que la comparación se puede hacer allí? – cjk

Respuesta

1

Lo que necesita hacer es ejecutar su bucle de física con tiempo constante delta e iterarlo tantas veces como lo necesite con el tic actual.

const float PHYSICS_TICK = 1/60.f; // 60 FPS 
void Update(float dt) 
{ 
    m_dt += dt; 
    while(m_dt > PHYSICS_TICK) 
    { 
     UpdatePhysics(PHYSICS_TICK); 
     m_dt -= PHYSICS_TICK; 
    } 
} 

Existen varias técnicas utilizadas para manejar la garrapata izquierda (m_dt)
Tapas para garrapatas miniumum y máxima de garrapatas son también una necesidad.

+0

Y para la mayoría de los juegos, es mejor/más fácil solo fijar el paso del tiempo para toda la lógica del juego (no solo la física). –

1

Supongo que el problema aquí es que las ralentizaciones son inevitables. Puede intentar y optimizar el código, pero siempre tendrá usuarios con dispositivos lentos o secciones ocupadas de su juego, donde demorará un poco más de lo normal procesarlo. En lugar de asumir un delta consistente, asuma lo contrario. Código al darse cuenta de que alguien podría intentar instalarlo en un ábaco.

Así que, básicamente, como dice SeveN, haga que su bucle de juego maneje ralentizaciones. La única manera real de hacer esto (en mi experiencia ciertamente limitada) sería poner un límite a lo grande que puede ser el delta. Esto hará que tu reloj no se ejecute exactamente a tiempo, pero cuando lo piensas, así es como la mayoría de los juegos manejan la ralentización. No enciendes StarCraft en tu Pentium 66 y lo ejecutas a 5 FPS, pero a toda velocidad, desacelera y lo procesa normalmente, aunque en una presentación de diapositivas.

Si hiciste tal cosa, durante los periodos de desaceleración en tu juego, se ralentizaría visiblemente ... pero los cálculos deberían seguir siendo acertados.

corregir: acaba de darse cuenta de que eres SeveN. Bien hecho.

+0

[profanidad no es bienvenida aquí] (http://meta.stackexchange.com/a/22233/142838). – meagar

Cuestiones relacionadas