online jugar game florence fight best apps iphone cocos2d-iphone sprite physics game-physics

iphone - jugar - fight list online



Game Physics-No muy parecido a la vida (3)

Es posible que prefiera probar los motores de física Box2d o Chipmunk en su juego cocos2d-iphone para un efecto más real. Además, son relativamente fáciles de implementar.

No es necesario crear su propio sistema de física: recuerde dejar que la tecnología funcione para usted; D

En un juego simple (cocos2d) hice un pequeño motor de física para mover un sprite para que pueda saltar y pararse sobre plataformas, etc.

Para actualizar la posición (movimiento vertical) utilizo ecuaciones cinemáticas básicas en cada actualización:

  • position = oldPosition + velocity (delta) +1/2 (gravedad) (delta) ^ 2
  • velocidad = oldVelocity + (gravedad) (delta)

Por alguna razón, el juego no parece muy real. Parece tomar mucho tiempo cerca de la parte superior de un arco, a pesar de lo grande que hago la gravedad. Si quiero que mi sprite salte a la misma altura, pero desacelere y acelere más rápido, pero aún así salte tan alto como antes, ¿cómo debería hacerlo? Espero que tenga sentido.


¡El problema aquí es que has cometido un error con tu física! Pero eso está bien, porque es una solución fácil.

Al llamar a su método de actualización en la posición de su sprite, primero debe configurar la aceleración. Supongo que la gravedad es una constante para este juego, por lo que solo debes configurarlo una vez. (-9.81, o algo similar)

Luego desea actualizar la velocidad del personaje en la dirección y por velocidad = old_velocity + acceleration * time.

Después de hacer esto, actualice la posición de forma similar: position = old_position + velocity * time.

La ecuación que está utilizando para actualizar la posición es válida solo si delta es el tiempo total transcurrido, ¡y no un paso de tiempo! (He supuesto que delta es un paso del tiempo, porque así es como los juegos de física generalmente se programan).

¡Espero que esto ayude! Si quieres saber más, revisa las ecuaciones de suvat, verás que puedes calcular una posición final si conoces una velocidad inicial y una aceleración constante, mientras que tu juego tendrá una velocidad que variará cuando saltes y colisiones, ¡y entonces no sorprende que no sea realista! Más preguntas, solo comenta y trataré de ayudarte más.

EDITAR: He reprogramado exactamente lo que ha hecho aquí con algunos recuadros dibujados con OpenGL. Su método para actualizar la posición no parece funcionar. Las casillas solo parecen caer correctamente si el dt o timestep es 1.0d, y no estoy seguro de por qué. Luego, cuando colisionan con algo, se detienen todos juntos en lugar de rebotar. No estoy seguro exactamente por qué.

Sin embargo, también tengo otra caja en la pantalla que usa la física que describí: v = u + a*t y s = s_last + v*t La caja cae exactamente como se esperaba y rebota correctamente. Debido a una simplificación, la energía se pierde en el rebote.


EDITAR: No necesita usar esta fórmula, excepto si necesita calcular la distancia total o la velocidad inicial para un lanzamiento de objeto específico. Para el uso del tiempo, puede actualizar la velocidad del objeto aplicando la aceleración y mover el objeto para dt = el intervalo de la función de actualización. Esta es una manera más simple y más apropiada de hacer esto

Sin embargo, manteniendo el mismo algoritmo, puedes usar una gravedad más fuerte, luego una velocidad inicial más alta, para que tu personaje alcance la misma altura, pero salta / aterriza más rápido. Usando la misma fórmula (dy = a * dt + (1/2) * a * dt ^ 2) puede calcular la nueva velocidad inicial, ya que dy tendrá el mismo valor. Recuerde que desea bajar el valor de dt.

Si vas a necesitar más física que simplemente saltar, deberías considerar usar un motor de física, como Omega propuesto