2012-05-02 4 views
2

J'ai besoin de faire pivoter un sprite de personnage en fonction de la portée de la plate-forme sur laquelle il (un rectangle) se tient ou marche. J'ai réussi l'effet en le faisant tourner selon la pente de la plate-forme sur laquelle il se tient. Mais il y a deux problèmes:Comment faire pivoter en douceur un personnage en fonction de la pente sur laquelle il marche?

D'abord, la rotation n'est pas lisse. Lorsque le personnage passe d'une plate-forme plate à une plate-forme inclinée, il pivote instantanément et, grâce à cette rotation, il est légèrement soulevé. Deuxièmement, une fois qu'il quitte la pente et revient sur une plate-forme plate, je ne peux pas faire pivoter le personnage en conséquence. C'est parce qu'à ce moment le personnage entrerait en collision avec une plate-forme plate et une plate-forme inclinée (elles sont placées ensemble), donc pour quelques pas le personnage tournera follement d'avant en arrière parce que deux fonctions de détection de collision travaillent ensemble. J'ai essayé de le résoudre en détectant la face du personnage et d'essayer de trouver quel point (gauche ou droite) de lui touche quelque chose en premier, mais ça ne fonctionnait pas, parce que je ne peux détecter que la collision, mais pas "no collision" ou "quand un personnage quitte une plateforme".

J'ai joint une illustration de la situation. S'il vous plaît, aidez, merci!

PS: Comme je ne suis pas autorisé à publier des images, veuillez visiter: http://i.stack.imgur.com/jqPjt.png pour l'image. Merci.

+0

Si vous ne faites aucune manipulation spéciale, vous obtiendrez le cas sur la gauche ... non? Que se passe-t-il si vous laissez juste le moteur faire son truc? – iforce2d

+0

@ iforce2d: J'ai essayé ça ... mais la force que j'applique dessus provient du centre du rectangle, non du bas, donc quand il frappe une pente il va rouler vers l'avant (au lieu de reculer) . Une autre chose est que ce jeu est une sorte de jeu de plateforme, donc je ne veux pas que le personnage puisse tourner librement. – Dai

Répondre

2

Votre rotation semble désactivée. Vous devez tourner autour de la base du rectangle de caractères. Cela résoudrait certains de vos problèmes, mais pas tous.

Le cas où le personnage est en contact avec 2 plates-formes doit être géré. Actuellement, je suppose que vous êtes juste en train d'extraire un angle directement de la plate-forme et d'attribuer cela au personnage. Cela ne va pas le couper parce que vous avez besoin d'angles arbitraires lorsque vous avez différents points de contact. La solution consiste à créer un vecteur entre les deux points de contact, puis à prendre les composants du vecteur x,y et à appeler le atan2(x, y). Cela donnera l'angle entre les contacts en radians. Assurez-vous d'avoir les paramètres dans le bon sens! Le développement de jeu exige que vous connaissiez la trigonométrie et les mathématiques vectorielles. Ce qui se passe ici, c'est que nous créons un triangle rectangle aligné sur l'axe avec l'hypoténuse étant défini par les deux points de contact, puis nous retournons le triangle et obtenons l'angle en utilisant tan = opp/adj en permutant les composants x et y. Notez que vous devez vous assurer que les points de contact sont toujours donnés dans un ordre spécifique, sinon vous finirez par tourner dans un angle étrange, car le triangle que vous créez sera orienté dans l'autre sens. Vous devrez peut-être faire quelque chose comme tri basé sur la coordonnée x d'abord.

1

Une solution simple pour cet exemple est de faire une détection de collision sur les coins, et non sur l'ensemble de l'objet. Vous pouvez faire pivoter l'objet sur le point qui le touche dans un angle tel que le point qui coupe seulement le toucher. Cette solution ne fonctionne que si vous inclinez, et non vers le bas. Pour résoudre cela, vous faites également une détection de collision sur les côtés. Vous tournez ensuite sur le coin de contact dans un angle tel que le côté touche juste.

+0

Désolé, nous ne pouvons pas marquer les deux comme des réponses acceptées (et je ne suis pas encore en mesure d'upvote, fera quand j'ai assez de réputation). Dans box2d, je ne peux pas obtenir de points de contact précis en effectuant une détection de collision sur l'ensemble de l'objet, comme vous l'avez dit. J'essaie de placer quelques capteurs aux coins de l'objet et de les utiliser pour décider de l'angle de rotation. Je vous remercie. – Dai

Questions connexes