Déterminer player.isFalling () par un changement de y?


8

J'utilise actuellement Box2D et mon personnage est un tas d'appareils dans Box2D. Je me demandais si, pour déterminer si un joueur tombait, détecter un changement de position Y serait approprié?

Y a-t-il peut-être d'autres façons auxquelles je ne pense pas? Comment ce genre de chose est-il généralement détecté?


2
Un joueur n'aurait-il pas une vitesse descendante pour indiquer une chute?
The Communist Duck

1
Qu'est-ce qui "tombe" dans votre cas de toute façon? Est-ce une simple vitesse descendante? S'agit-il d'une non-présence d'une surface solide immédiatement en dessous? Êtes-vous en train de «tomber» lorsque votre personnage saute d'un bâtiment et continue de monter, mais va évidemment frapper le béton dans quelques secondes?
Anko

@Aku faling est à tout moment cela n'aurait pas de sens pour lui de sauter (car aucune surface pour sauter)
jmasterx

3
Normalement, un moteur physique devrait vous donner des moyens de vérifier la normale d'une collision. S'il est «haut», cela signifie que votre joueur est debout sur quelque chose et devrait être capable de sauter. Inversement, s'il n'entre pas en collision, ou si aucune des normales de collision ne pointe vers le haut, il tombe.
Jonathan Connell

@Duck et @ 3nixios sonne comme de bonnes réponses, pourquoi ne pas le faire .. réponses ehm;) Moi, pour ma part, je voterais pour
Maik Semder

Réponses:


9

(D'après mon commentaire.) Je ne connais pas Box2D, mais normalement un moteur physique devrait vous donner des moyens de vérifier la normale d'une collision.

S'il est «haut», cela signifie que votre joueur est debout sur quelque chose et devrait être capable de sauter.

Inversement, s'il n'entre pas en collision, ou si aucune des normales de collision ne pointe vers le haut, il tombe.


3

Vous avez besoin de deux booléens, isColidingWithGroundetisJumping

Lorsque l'utilisateur appuie sur le bouton de saut, si isColidingWithGroundest true, et isJumpingest faux, appeler jump()qui ensembles isJumpingàtrue

Si la yvitesse du joueur est positive, elle isJumpingest égale àfalse

Si le joueur entre en collision avec le sol, isColidingWithGround est égal true, sinon isColidingWithGroundégal false.

Parfois, le joueur est toujours en contact avec le sol après l'impulsion de saut initiale, et je trouve qu'en utilisant ces deux drapeaux, cela empêche le saut () d'être appelé plusieurs fois lorsque le saut est enfoncé.


En utilisant cette méthode, il serait intéressant de vérifier si la touche de saut a été enfoncée lorsque le joueur tombait, et si elle a été enfoncée pendant 200 ms avant de toucher le sol, appelez à jump()nouveau.
JCM

2

La façon dont je gère cela est que chaque joueur a un isJumpingbooléen qui, lorsqu'il saute, est réglé sur true. Quand ils entrent en collision avec une surface, je vérifie si c'est quelque chose dont ils pourraient sauter et d'autres stipulations telles qu'ils se tiennent à plat, etc. et je le règle false.

Ensuite, quand ils essaient de sauter, si la surface sur laquelle ils se trouvent est bonne et que isJumping == falseje leur permets de sauter, sinon ils ne peuvent pas sauter. Je pense que c'est mieux que de calculer les collisions à chaque fois que vous voulez voir si elles sautent.

Modifier
comme @BlueRaja l'a souligné ci-dessous, si l'utilisateur quitte le bord, le isJumpingsera toujours false. Vous pouvez résoudre ce problème avec la EndContactméthode Contact Listener (voir la section 9.4, Documents Box2D . Il vous suffit de définir la isJumpingpropriété truelorsque la collision avec le monde cesse.


2
Et s'ils sortent du bord sans sauter? isJumpingsera false, mais ils ne devraient toujours pas être autorisés à sauter
BlueRaja - Danny Pflughoeft

@BlueRaja - Bon point. J'ai oublié ça, j'ai aussi un contrôle sur les collisions cassantes. Voir EndContacten 9.4 dans les documents Box2d . Modifier la réponse mise à jour.
Richard Marskell - Drackir

0

Déplacez tous les composants pertinents de votre "groupe d'appareils" (qui ensemble font le joueur) vers le bas d'une petite quantité, et vérifiez les collisions avec tout ce que vous considérez comme possible de sauter. S'il n'y a pas de collision, le joueur tombe. Sinon, il ne l'est pas. N'oubliez pas de remonter les composants de ce même montant.

Si votre personnage est humanoïde, vous devriez probablement bouger et vérifier uniquement les pieds du personnage, car sinon votre personnage pourrait finir par sauter même s'il est debout sur sa tête!


0

Cela peut ou non s'appliquer, mais nous détecterions une différence entre sauter / atterrir et tomber afin que nous sachions quand passer à une animation en baisse, faire des dégâts pour tomber trop longtemps (pas trop loin;)) et similaires.

Cela a été fait en traçant pendant combien de temps un objet était sans point de référence. Quelque chose au sol, ou tout autre objet, faisait référence à ce sur quoi il se tenait. Vous ne vous teniez pas sur quoi que ce soit? Ensuite, vous étiez en l'air, et après 1-2 secondes, vous «tombiez» au lieu d'atterrir avec grâce :)


0

Très naïvement et simplement, vous pouvez vérifier si le joueur a une vitesse y (vitesse, pas vitesse) qui est> 0, en supposant que vous utilisez (0,0) en haut à gauche.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.