J'écris un jeu XNA top down 2d. Depuis que c'est ma première, j'essaie d'écrire moi-même des trucs sur la physique et la collision pour l'apprendre.
Chaque fois que mon personnage sprite joueur tente de se déplacer dans une position où ses limites se croisent avec le bord d'un mur, je détermine un angle de rebond (angle d'incidence = angle de réflexion) et je fais rebondir le joueur sur le mur et éviter la collision .
J'ai du mal à comprendre comment faire face à la situation de mon sprite intersectant avec deux bords de mur simultanément, par exemple s'il atteint un coin.
Mon code me dit actuellement que deux bords de mur ont été intersectés mais pas quel bord il aurait touché en premier et donc quel bord rebondir.
Quel est le test mathématique pour choisir quel bord rebondir? C'est clair à voir en le regardant mais j'ai du mal à comprendre le test de mathématiques pour cela.
Réponses:
Si vous calculez la distance dans le
Wall
l'Player Sprite
a déplacé, vous pouvez probablement baser sur le delta des coordonnées x et y des coins qui se croisent. J'espère que cela a du sens, je ne peux pas penser à une meilleure façon de le formuler.Ainsi, par exemple, si vous regardez votre diagramme. Prenez la
x
valeur du coin supérieur gauche duPlayer Sprite
(après le déplacement) et soustrayez lax
valeur du coin inférieur droit duWall
. Faites la même chose pour lesy
valeurs, puis voyez laquelle est la plus grande. La clé est que si l'un est plus grand que l'autre, il estPlayer Sprite
probablement recoupé de ce côté.Voici un exemple d'image (c'est une sous-section de votre image avec mes propres lignes ajoutées):
Maintenant, vous voyez ici que la ligne bleue est plus grande que la ligne verte. Dans ce cas, la ligne bleue est également du côté
Player Sprite
duquel le rebondirait.Si les deux valeurs sont égales, elles frappent juste au coin.
Maintenant, il y a un léger problème à le faire de cette façon. Si le
Player Sprite
véhicule se déplace très rapidement ou que la collision est très proche du coin, il est possible que lePlayer Sprite
véhicule puisse aller plus loin dansWall
la mauvaise direction. Dans ce cas, vous devrez probablement vérifier la vitesse de l'objet en mouvement. (Voir la réponse de Nathan Reed .)Remarque: Je pense que j'essaie essentiellement de décrire la détection de collision SAT mentionnée par @Blau, mais j'ai passé beaucoup de temps à l'écrire, donc je vais la publier de toute façon. J'espère que cela vous aidera.
la source
Le déplacement minimum ne donne pas toujours la bonne réponse pour quel bord a été touché en premier. Considérez ce cas:
Cela se produit lorsque la vitesse est suffisamment élevée pour que le bloc se déplace assez loin au cours d'une image. Pour détecter correctement l'arête frappée en premier, vous devrez configurer une équation linéaire à résoudre pour le temps de collision avec chaque arête. Dans ce cas décrit dans le diagramme de l'OP, les équations pertinentes sont:
(Cela suppose un système de coordonnées X à droite et Y vers le haut.) En général, vous devez utiliser les signes des composants X et Y de player.velocity pour déterminer la paire d'arêtes à tester. Quoi qu'il en soit, une fois que les temps de collision sont calculés, la première des deux est la collision que vous devez gérer.
la source
Vous avez besoin de la détection de collision SAT
Fondamentalement, vous devez rechercher le vecteur de déplacement minimum qui s'est soustrait à l'un des objets et ne les laisser se croiser.
Dans votre image, le déplacement minimum est le segment orange.
la source
Répondu à une question similaire ici
Vous voudrez peut-être envisager de vérifier les positions précédentes-
Par exemple: si votre côté gauche était auparavant à droite de leur côté droit et que vous vous heurtez, une collision avec la droite s'est produite.
Si vous faites cela, résolvez simplement les collisions de l'axe y, vérifiez si vous entrez en collision avec quelque chose, puis résolvez les collisions de l'axe x.
la source