2010-12-21 14 views
7

En resumen, estoy haciendo un juego de plataforma. No tengo la edad suficiente para haber tomado Cálculo todavía, así que no sé de derivadas o integrales, pero sé de ellos. El comportamiento deseado es que mi personaje salte automágicamente cuando hay un bloqueo a cada lado de él que está sobre el que está parado; por ejemplo, escaleras. De esta manera, el jugador puede simplemente mantener hacia la izquierda/derecha para subir escaleras, en lugar de tener que enviar la clave de salto también.¿Cálculo? Necesito ayuda para resolver una variable dependiente del tiempo dado algunas otras variables

El problema está en la forma en que implementé el salto; Decidí ir al estilo mario y permitir que el jugador aguante el "salto" más tiempo para saltar más alto. Para hacerlo, tengo una variable 'jump' que se agrega a la velocidad Y del jugador. La variable de salto aumenta a un valor establecido cuando se presiona la tecla 'saltar', y disminuye muy rápidamente una vez que se suelta la tecla 'saltar', pero disminuye menos rápidamente siempre que mantenga presionada la tecla 'saltar', proporcionando así una aceleración continua hasta que tengas 'saltar'. Esto también lo convierte en un bonito y fluido salto, en lugar de una aceleración brusca y visualmente discordante.

Por lo tanto, para tener en cuenta la altura variable de la escalera, quiero poder calcular exactamente qué valor debe obtener la variable 'saltar' para saltar exactamente a la altura de la escalera; preferiblemente no más, no menos, aunque un poco más es permisible. De esta forma, el personaje puede saltar escaleras empinadas o poco profundas sin que se vea raro o lento.

Fundamentalmente, hay 5 variables en juego:

h -the height the character needs to jump to reach the stair top<br> 
j -the jump acceleration variable<br> 
v -the vertical velocity of the character<br> 
p -the vertical position of the character<br> 
d -initial vertical position of the player minus final position<br> 

Each timestep:<br> 
j -= 1.5;   //the jump variable's deceleration<br> 
v -= j;   //the jump value's influence on vertical speed<br> 
v *= 0.95;   //friction on the vertical speed<br> 
v += 1;   //gravity<br> 
p += v;   //add the vertical speed to the vertical position<br> 

v-initial is known to be zero<br> 
v-final is known to be zero<br> 
p-initial is known<br> 
p-final is known<br> 
d is known to be p-initial minus p-final<br> 
j-final is known to be zero<br> 

j-initial is unknown<br> 

Teniendo en cuenta todos estos hechos, ¿cómo puedo hacer una ecuación que va a resolver para j?

tl; dr ¿Cómo hago el cálculo?

Muchas gracias a cualquiera que haya llegado hasta aquí y decida resolver este problema.

Editar: Aquí hay un gráfico que hice de un ejemplo en Excel. alt text

Quiero una ecuación que le permitirá a encontrar un valor para un determinado un valor deseado para B. Puesto que la variable salto disminuye con el tiempo, el valor de posición no es sólo una parábola sencilla.

+1

Esto, creo, pertenece a http://math.stackexchange.com/ o http://gamedev.stackexchange.com/ – soulseekah

+0

@ user451527 Permítanme darle la bienvenida a Stack Oveflow y recordar solo tres cosas que Por lo general, hazlo aquí: 1) Cuando recibas ayuda, intenta darle también ** respondiendo preguntas ** en tu área de experiencia 2) ¡lee las preguntas frecuentes! 3) Cuando veas buenas preguntas y respuestas, recíbelas ** usando los triángulos grises **, ya que la credibilidad del sistema se basa en la reputación que los usuarios obtienen al compartir sus conocimientos. Recuerde también aceptar la respuesta que resuelva mejor su problema, si corresponde, ** presionando el signo de la marca de verificación ** –

+0

¡Haga lo que haga, no mezcle math.stackexchange.com con mathoverflow.com! Además, si publica esto en otro sitio, publique un enlace aquí para que los miembros interesados ​​de Stack Overflow puedan ver la discusión allí. – MatrixFrog

Respuesta

1

Aquí hay dos dificultades en juego. La primera es que en realidad no tiene j -= 1.5, tiene j = max(0, j - 1.5). Eso arroja algo de una llave en los cálculos. Además, su término de fricción v *= 0.95 hace que la solución directa sea difícil.

Sugiero usar una tabla de búsqueda para esto. Puede precalcular el a deseado para cada posible b, por prueba y error (por ejemplo, búsqueda binaria en los valores de a que le dan el b requerido). Almacene los resultados en una tabla y simplemente haga una búsqueda simple de la tabla durante el juego.

1

Si descuido el término de fricción, y asumamos que j llega a cero antes de v llega a cero, consigo después de una página de cálculos que:

b = 1/(8*(deceleration^2)*gravity)*j0^4 - 1/(6*deceleration^2)*j0^3 

la solución a esto es bastante largo, pero aproximadamente igual (durante 10 < b < 400) a:

j0 = (10*(deceleration^2)*gravity*b)^0.25 
+0

¡Guau, gracias por su dedicación! Voy a probar esto para asegurarme de que funciona, y gracias de nuevo por contribuir. No estoy claro a qué término corresponde la desaceleración. –

+0

son las constantes de su texto. desaceleración = 1.5, gravedad = 1 – tsvikas

1

tras un uso extenso de Excel 2010 y su función Seek Gol, yo era capaz de hacer una tabla de valores, y Excel me dio una línea de tendencia aproximada y la ecuación para ello, que pellizqué hasta que funcionó fuera. La ecuación es j = 3.35 * h^0.196, donde j es la fuerza de salto inicial y h es la altura requerida para saltar. Gracias por tu ayuda.

+0

+1 para usar Excel para resolver un problema de física. – ja72

Cuestiones relacionadas