2011-11-24 10 views
9



gravedad con tiempo en el aire, la aceleración y la velocidad ganando

que estoy tratando de lograr una gravedad, donde se incluye tiempo aire, y también la aceleración.
He intentado usar la gravedad habitual, lo que se ve algo como esto:

velocity += gravity * dt; 
position += velocity * dt; 


Esto probablemente funcionar lo suficientemente bueno para un juego de plataformas normal, pero estoy tratando de hacer un juego inspirado en "El juego de helicópteros ", donde tienes que navegar a través de un túnel, sin tocar las paredes.

lo que quiero hacer diferente, es que quiero ser capaz de ahorrar velocidad en el camino hacia abajo, que se utilizará en el camino de nuevo, así que tendré algo de aceleración al principio.
También quiero algún tipo de tiempo de comunicación, así que cuando llegues a la cima no te obligaría a bajar tan rápido como lo haría si hubiera usado la gravedad de la muestra del código.

Esta imagen ilustra la curva que me gustaría tener:
Link to curve

Tenga en cuenta que todo el control se realiza con una tecla, por lo que volaría si mantuviera presionado el espacio y bucearía si lo liberara.
El personaje tampoco se mueve hacia la izquierda o hacia la derecha, ya que tendrá una posición X estática en la pantalla, por lo que no se pueden usar vectores.

He pasado horas tratando de hacerlo funcionar, pero sin éxito. También intenté buscar en Internet, pero sin suerte.

El juego "Whale Trails" tiene la gravedad que quiero.
Aquí hay un enlace para un video del juego: http://www.youtube.com/watch?v=5OQ0OWcuDJs

No soy tan grande como un tipo de física, por lo que sería genial si pudiera dar un ejemplo del código real
Espero que alguien pueda ayudarme a resolver esto fuera.

+0

una mala pregunta, pero que muestra un código que ilustra lo que ha intentado - y una descripción de cómo * * no funciona - le ayudaría obtener respuestas. :) –

+0

No soy un chico de física también, pero mi suposición es que necesitas profundizar un poco más en la física para lograr lo que quieres. Así que creo que la física de los aviones debería ir en la dirección general. Tal vez [este] (http://www.ucmp.berkeley.edu/vertebrates/flight/physics.html) te ayude un poco al menos a encontrar las palabras correctas para buscar soluciones a tu problema. También en el juego más nuevo de Batman - Arkham City, tienes una mecánica similar, tal vez vale la pena echarle un vistazo. – dowhilefor

+0

@djacobson era casi un código aleatorio, ya que no tenía idea de dónde ir, así que no haría ningún bien :) – Basic

Respuesta

4

La gravedad es la fuerza que tira de los objetos hacia abajo. Tu jugador es la fuerza que levanta los objetos. En consecuencia, su código debe ser:

if(keyPressed) { 
    velocity += POWER_OF_PLAYER; 
} 

velocity += G; 
position += velocity; 

Esto es suficiente para crear una curva como la que se ilustra. Por supuesto, POWER_OF_PLAYER debe ser de un signo diferente y el valor absoluto debe ser mayor para que esto funcione.

G = -9.81 
POWER_OF_PLAYER = 20 

Ahorro de energía es entonces una simple comprobación.

if(keyPressed) { 
    if(powerSaved > 0) { 
    velocity += POWER_OF_PLAYER; 
    powerSaved -= SOMETHING; 
    } 
} else if (velocity >= SOME_MINIMUM_SPEED_BEFORE_GETTING_POWER) { 
    powerSaved += SOMETHING; 
} 

SOME_MINIMUM_SPEED_BEFORE_GETTING_POWER debería ser algo menos o igual a 0.

P. S. Supuse que su eje Y comienza en el suelo y dispara al cielo. Signos puestos de acuerdo.

+0

Estoy bastante seguro de que lo he intentado, pero voy a probarlo y ver si funciona :) – Basic

+0

Esta es la fórmula estándar, la física del juego es diferente. –

+0

Tus cálculos son incorrectos. La gravedad es una fuerza, es decir, tiene unidades de aceleración de masa *, mientras que la velocidad tiene unidades de distancia en el tiempo, por lo que establecer "velocidad + = GRAVEDAD" es fundamentalmente incorrecta. – rcollyer

0

Parece que la velocidad del pez es constante.

intente lo siguiente:

velocity es fijo y no se debe cambiar (a menos que el pez come un power-up velocidad). angle = 0 es equivalente a un vuelo nivelado.

angle -= gravity * dt; 
if (angle < - Math.PI/2) { 
    angle = Math.PI/2; 
} 
if (keyPressed) { 
    angle += power * dt; 
} 

if (angle < - Math.PI/2) { 
    // Stop the player from doing a looping 
    angle = - Math.PI/2; 
} 
if (angle > Math.PI/2) { 
    // Stop the player from doing an inverted looping 
    angle = Math.PI/2; 
} 
// Move the fish (vertical component of velocity) 
position += velocity * dt * Math.sin(angle); 
// Move the background (horizontal component of velocity) 
background_position -= velocity * dt * Math.sin(angle); 
+0

Al usar tu código, el jugador simplemente va directo, a menos que cuando se presiona la tecla, vaya ligeramente hacia abajo. – Basic

+0

Intenta hacer los cambios en el ángulo más pequeños - 'ángulo - = gravedad * dt/100.0;' y 'ángulo + = potencia * dt/100.0;' –

0

suena como la incorporación de 'levantar' que se basa en la velocidad horizontal y tienen el gatillo pulse el botón de un movimiento 'noseup' podría funcionar bastante bien.

Así lift sería una constante k multiplicado por la velocidad horizontal Vx y la velocidad vertical Vy sería la diferencia de gravity y lift veces el cambio en el tiempo dt

lift = k * Vx 
Vy += (lift - gravity) * dt 

def noseup 
    k = 0.01 #some small chunk 
    dx = k * Vx 
    dy = k * Vy 
    Vx -= dy 
    Vy += dx 

cuando el avión (o lo que sea) narices básicamente baja la velocidad en un eje mientras que lo aumenta en el otro.

probablemente no sería una mala idea para lanzar drag en alguna parte, así ahora que lo pienso, tendría que depender de la velocidad absoluta V = (Vx**2 + Vy**2)**0.5 ... y el peso es una palabra mejor que la gravedad en este caso (menos confuso, unidades sabio) pero funciona, supongo.

No es exactamente "física", pero una aproximación cercana que debería funcionar bastante bien. Juega con los valores de k y mira si puedes hacer que haga lo que quieras.

cierto lo siento por la :-P súper cutre psuedocode

No
Cuestiones relacionadas