J'ai un sprite, Player
. Mettre à jour la position de Player
de la manière suivante:XNA/Monogame: Physique de saut de plateforme et collision Numéro
_position += (_direction * _velocity) * (float)gameTime.ElapsedGameTime.TotalSeconds;
Où _position
, _direction
et _velocity
sont Vector2
s.
J'ai un simple collisionneur (BoxCollider
) qui génère simplement un rectangle (BoundingBox
) étant donné la position et les dimensions du collisionneur.
Dans Initialize()
, je crée un nouveau List<BoxCollider>
et le remplit avec des collisionneurs pour le niveau. Je passe la liste à Player
pour vérifier les collisions.
La méthode de contrôle de collision:
public void CheckPlatformCollision(List<BoxCollider> colliders, GameTime gameTime)
{
var nextPosition = _position + (_direction * _velocity) * (float)gameTime.ElapsedGameTime.TotalSeconds;
Rectangle playerCollider = new Rectangle((int)nextPosition.X, (int)nextPosition.Y, BoundingBox.Width, BoundingBox.Height);
foreach(BoxCollider collider in colliders)
{
if(playerCollider.Intersects(collider.BoundingBox))
{
nextPosition = _position;
}
}
Position = nextPosition;
}
En ce moment, tous les moyens que j'ai essayé de mettre en œuvre la gravité a échoué. Si Player
est tombé de trop haut, nextPosition
devient trop loin de Player
et le laisse coincé dans les airs.
J'ai aussi des problèmes avec les collisions horizontales, le problème étant similaire: Player
s'arrête trop tôt, laissant un espace entre. Parfois, j'ai eu Player
coller sur le côté du collisionneur.
Ce que je voudrais savoir est:
Comment puis-je mettre en œuvre correctement la gravité & sauter avec _position
, _direction
et _velocity
? Comment gérer correctement les collisions horizontalement et verticalement?
Peut-être que cela vous aidera: http://gamedev.stackexchange.com/questions/104954/2d-collision-detection-xna-c – vyrp