Implementando a gravidade no jogo, o personagem continua saltando para cima e para baixo quando atinge o chão, ao depurar o personagem está essencialmente saltando dentro e fora do chão. Não tenho certeza de como resolver o problema, qualquer ajuda aqui seria muito apreciada.
O valor constante
private float gravity = 0.09f;
aumentando a velocidade se o personagem estiver no chão
if (!isOnGround)
velocity.Y += gravity;
adicionando a velocidade geral dos caracteres à posição geral.
position += velocity * (float)gameTime.ElapsedGameTime.TotalSeconds;
Parte do método de colisão que determina se o personagem está no chão ou não.
for (int y = topTile; y <= bottomTile; ++y)
{
for (int x = leftTile; x <= rightTile; ++x)
{
// If this tile is collidable,
TileCollision collision = Level.GetCollision(x, y, tileMap);
if (collision != TileCollision.Passable)
{
// Determine collision depth (with direction) and magnitude.
Rectangle tileBounds = Level.GetBounds(x, y);
Vector2 depth = RectangleExtensions.GetIntersectionDepth(bounds, tileBounds);
float elapsed = (float)gameTime.ElapsedGameTime.TotalSeconds;
if (depth != Vector2.Zero)
{
float absDepthX = Math.Abs(depth.X);
float absDepthY = Math.Abs(depth.Y);
// Resolve the collision along the shallow axis.
if (absDepthY <= absDepthX || collision == TileCollision.Platform)
{
// If we crossed the top of a tile, we are on the ground.
if (previousBottom <= tileBounds.Top)
isOnGround = true;
Respostas:
Receio ainda não entender completamente seu código de colisão: se houver um erro de desvio de um pixel em algum lugar, será difícil identificá-lo. Mas seu código de física já precisa de algumas correções:
Levando ao seguinte código:
fonte