J'ai un problème avec la résolution de collision AABB.
Je résous l'intersection AABB en résolvant d'abord l'axe X, puis l'axe Y. Ceci est fait pour empêcher ce bug: http://i.stack.imgur.com/NLg4j.png
La méthode actuelle fonctionne bien lorsqu'un objet pénètre dans le lecteur et que celui-ci doit être poussé horizontalement. Comme vous pouvez le voir dans le fichier .gif, les pointes horizontales poussent correctement le lecteur.
Lorsque les pointes verticales pénètrent dans le lecteur, l'axe X est toujours résolu en premier. Cela rend "l'utilisation des pics comme un ascenseur" impossible.
Lorsque le joueur entre dans les pointes verticales (affecté par la gravité, il y tombe), il est poussé sur l'axe des Y car il n'y avait pas de chevauchement sur l'axe des X pour commencer.
Quelque chose que j’ai essayé est la méthode décrite dans la première réponse de ce lien: Détection de collision d’objets rectangulaires 2D
Cependant, les pointes et les objets en mouvement se déplacent en changeant leur position, et non leur vitesse, et je ne calcule pas leur prochaine position prédite tant que leur méthode Update () n'a pas été appelée. Inutile de dire que cette solution n'a pas fonctionné non plus. :(
Je dois résoudre le conflit AABB de manière à ce que les deux cas décrits ci-dessus fonctionnent comme prévu.
Ceci est mon code source de collision actuel: http://pastebin.com/MiCi3nA1
Je serais vraiment reconnaissant si quelqu'un pouvait se pencher là-dessus, car ce bogue était présent dans le moteur depuis le début, et je me suis battu pour trouver une bonne solution, sans succès. Cela me fait sérieusement passer des nuits à regarder le code de collision et à m'empêcher d'entrer dans la partie "amusante" et à coder la logique du jeu :(
J'ai essayé d'implémenter le même système de collision que dans la démo de la plate-forme XNA AppHub (en copiant-collant la plupart des éléments). Cependant, le bogue "sauter" se produit dans mon jeu, alors qu'il ne se produit pas dans la démo AppHub. [bug sautant: http://i.stack.imgur.com/NLg4j.png ]
Pour sauter, je vérifie si le joueur est "sur le sol", puis ajoute -5 à Velocity.Y.
Etant donné que Velocity.X du lecteur est supérieur à Velocity.Y (reportez-vous au quatrième panneau du diagramme), onGround est défini sur true alors que ce ne devrait pas être le cas, et permet donc au joueur de sauter en l'air.
Je crois que cela ne se produit pas dans la démo AppHub, car Velocity.X du joueur ne sera jamais plus élevé que Velocity.Y, mais je peux me tromper.
J'ai résolu cela auparavant en résolvant d'abord sur l'axe des X, puis sur l'axe des Y. Mais cela gâche la collision avec les pics comme je l'ai dit ci-dessus.