3 votes

Les collisions de boîte de délimitation 2D, Murs

Actuellement, j'ai du mal à faire en sorte qu'un sprite apparaisse solide en utilisant des boîtes de collision. Les collisions fonctionnent très bien avec le code ci-dessous.

La position est la position principale du personnage sur la carte. character2 est le nom d'un sprite de 18 x 28 avec lequel le personnage principal va entrer en collision.

Lorsque le personnage principal entre en collision avec le sprite character2, j'ai essayé d'ajuster la position en conséquence (EX: Position.X -=1;) mais cela fait simplement glisser mon sprite principal en arrière jusqu'à ce qu'il ne se superpose plus.

J'ai l'impression que c'est quelque chose de très simple, mais pour ma vie, je n'arrive juste pas à comprendre.

En résumé de ma question : Comment faire en sorte que le sprite character2 apparaisse solide lors d'une collision ?

Même si mon sprite principal s'arrête lors de la collision (en réduisant la vitesse à 0), il reste bloqué là, la déclaration if entrant dans une boucle infinie.

        float x1 = Position.X;
        float y1 = Position.Y;

        float x2 = x1 + character2.Width;
        float y2 = y1 + character2.Height;

        BoundingBox b1 = new BoundingBox(new Vector3(x1, y1, 0), 
            new Vector3(x2, y2, 0));
        BoundingBox b2 = new BoundingBox(new Vector3(Position2.X, Position2.Y, 0),
            new Vector3(x2, y2, 0));

        if (Collision(b1, b2))
        {
            // ????
        }

2voto

Steve Wortham Points 11563

Cela dépend de ce que vous voulez qu'il se passe exactement, mais une suggestion est quelque chose comme ceci...

  if (HorizontalCollision(b1, b2))
  {
    xv = -xv;
  }
  else if (VerticalCollision(b1, b2))
  {
    yv = -yv;
  }

  Position2.X += xv;
  Position2.Y += yv;

xv et yv seraient des variables de vélocité dans ce cas et vous inversez simplement leur direction en cas de collision horizontale ou verticale, respectivement. Cela fera rebondir littéralement les objets ou les personnages l'un contre l'autre.

Ensuite, vous pourriez ajouter xv *= .99 et yv *= .99 pour ralentir la vélocité après chaque boucle de rendu, simulant ainsi la momentum et la friction. De nombreuses possibilités différentes s'ouvrent lorsque vous utilisez des variables de vélocité de cette manière. Au fait, ceci s'appelle l'intégration d'Euler et est incroyablement efficace dans le but de l'animation.

0voto

MRT Points 13
Tant que(Collision(b1, b2))
{
    Position.X -=1;
}

Est-ce ce que vous voulez? :P

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X