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é?
Réponses:
(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.
la source
Vous avez besoin de deux booléens,
isColidingWithGround
etisJumping
Lorsque l'utilisateur appuie sur le bouton de saut, si
isColidingWithGround
esttrue
, etisJumping
est faux, appelerjump()
qui ensemblesisJumping
àtrue
Si la
y
vitesse du joueur est positive, elleisJumping
est égale àfalse
Si le joueur entre en collision avec le sol, isColidingWithGround est égal
true
, sinonisColidingWithGround
égalfalse
.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é.
la source
jump()
nouveau.La façon dont je gère cela est que chaque joueur a un
isJumping
booléen qui, lorsqu'il saute, est réglé surtrue
. 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èglefalse
.Ensuite, quand ils essaient de sauter, si la surface sur laquelle ils se trouvent est bonne et que
isJumping == false
je 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
isJumping
sera toujoursfalse
. Vous pouvez résoudre ce problème avec laEndContact
méthode Contact Listener (voir la section 9.4, Documents Box2D . Il vous suffit de définir laisJumping
propriététrue
lorsque la collision avec le monde cesse.la source
isJumping
serafalse
, mais ils ne devraient toujours pas être autorisés à sauterEndContact
en 9.4 dans les documents Box2d . Modifier la réponse mise à jour.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!
la source
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 :)
la source
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.
la source