Determinar player.isFalling () a través del cambio de y?


8

Actualmente estoy usando Box2D y mi personaje es un montón de accesorios en Box2D. Me preguntaba si, para determinar si un jugador está cayendo, ¿sería apropiado detectar un cambio en la posición Y?

¿Hay quizás otras formas en las que no estoy pensando? ¿Cómo se suele detectar este tipo de cosas?


2
¿No tendría un jugador una velocidad descendente para indicar una caída?
El pato comunista

1
¿Qué está "cayendo" en su caso de todos modos? ¿Es una simple velocidad descendente? ¿Es la no presencia de una superficie sólida inmediatamente debajo? ¿Estás "cayendo" cuando tu personaje salta de un edificio y todavía está viajando hacia arriba, pero obviamente va a golpear el concreto dentro de unos segundos?
Anko

@Aku faling es en cualquier momento que no tendría sentido para él saltar (ya que no hay superficie para saltar)
jmasterx

3
Normalmente, un motor de física debería proporcionarle formas de verificar la normalidad de una colisión. Si está "arriba", esto significa que su jugador está parado sobre algo y debería poder saltar. Inversamente, si no está colisionando, o si ninguna de las normales de colisión apunta hacia arriba, entonces está cayendo.
Jonathan Connell

@Duck y @ 3nixios suenan como buenas respuestas, por qué no hacerlo ... ehm respuestas;) Yo, por mi parte,
votaría

Respuestas:


9

(De mi comentario.) No estoy familiarizado con Box2D, pero normalmente un motor de física debería darle formas de verificar la normalidad de una colisión.

Si está "arriba", esto significa que su jugador está parado sobre algo y debería poder saltar.

Inversamente, si no está colisionando, o si ninguna de las normales de colisión apunta hacia arriba, entonces está cayendo.


3

Necesitas dos booleanos, isColidingWithGroundyisJumping

Cuando el usuario presiona el botón de salto, si isColidingWithGroundes truey isJumpinges falso, entonces llame a lo jump()que se establece isJumpingentrue

Si la yvelocidad del jugador es positiva, entonces isJumpinges igualfalse

Si el jugador está colisionando con el suelo, entonces isColidingWithGround es igual true, de lo contrario isColidingWithGroundes igual false.

A veces, el jugador todavía está en contacto con el suelo después del impulso de salto inicial, y encuentro que al usar estas dos banderas, evita que se llame al salto () varias veces cuando se presiona el salto.


Usando este método, sería interesante verificar si se presionó la tecla de salto cuando el jugador estaba cayendo, y si se presionó como 200 ms antes de tocar el suelo, jump()vuelva a llamar .
JCM

2

La forma en que manejo esto es que cada jugador tiene un valor isJumpingbooleano que, cuando saltan, está configurado en true. Cuando chocan con una superficie, compruebo si es algo de lo que podrían saltar y otras estipulaciones, como si están de pie, etc., y lo configuro false.

Luego, cuando intentan saltar, si la superficie en la que se encuentran es buena y isJumping == falseles permito saltar, de lo contrario no pueden saltar. Creo que esto es mejor que calcular colisiones cada vez que quieres ver si están saltando.

Edite
como @BlueRaja señaló a continuación, si el usuario se sale del borde, isJumpingseguirá siéndolo false. Puede solucionar esto con el EndContactmétodo de Contact Listener (consulte la sección 9.4 Documentos de Box2D . Solo necesita establecer la isJumpingpropiedad truecuando cese la colisión con el mundo.


2
¿Qué pasa si caminan fuera del borde sin saltar? isJumpingserá false, pero todavía no se les debe permitir saltar
BlueRaja - Danny Pflughoeft

@BlueRaja - Buen punto. Me olvidé de eso, también tengo un control sobre cómo romper las colisiones. Ver EndContacten 9.4 de los Documentos de Box2d . Editar respuesta actualizada.
Richard Marskell - Drackir

0

Mueva todos los componentes relevantes en su "grupo de accesorios" (que juntos hacen al jugador) hacia abajo en una pequeña cantidad, y verifique si hay colisiones con cualquier cosa que considere posible saltar. Si no hay colisión, el jugador está cayendo. De lo contrario, no lo es. No olvide volver a mover los componentes en la misma cantidad.

Si tu personaje es humanoide, probablemente deberías moverte y controlar solo los pies del personaje, de lo contrario, ¡tu personaje podría terminar saltando incluso de pie sobre su cabeza!


0

Esto puede o no aplicarse, pero detectaríamos una diferencia entre saltar / aterrizar y caer, por lo que sabíamos cuándo cambiar a una animación descendente, hacer daño por caer demasiado tiempo (no demasiado lejos;)) y similares.

Se hizo más o menos rastreando cuánto tiempo estuvo un objeto sin un punto de referencia. Cualquier cosa en el suelo, o cualquier otro objeto, tenía una referencia a lo que estaba parado ... ¿No parado sobre nada? Luego estabas en el aire, y después de 1-2 segundos, estabas 'cayendo' en lugar de aterrizar con gracia :)


0

De manera muy ingenua y simple, puedes comprobar si el jugador tiene una velocidad y (velocidad, no velocidad) que es> 0, suponiendo que estés usando (0,0) como arriba a la izquierda.

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.