Personagem quicando no chão devido à gravidade

7

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;
dbomb101
fonte
11
Por que não usar um mecanismo de física existente? O clarividente leva cerca de um dia para se sentir confortável e pode fazer praticamente qualquer coisa que você precise.
precisa

Respostas:

12

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:

  • atualizações de velocidade devem depender do passo temporal, mesmo que a gravidade seja uma constante
  • velocidade vertical deve ser definida como zero se estiver no chão
  • adicionar a "velocidade geral" está incorreto; é a velocidade média para a duração do último quadro que precisa ser adicionada. Este artigo deve explicar o porquê .

Levando ao seguinte código:

Vector2 oldvelocity = velocity;

if (!isOnGround)
    // This will require tweaking the gravity value
    velocity.Y += gravity * (float)gameTime.ElapsedGameTime.TotalSeconds;
else
    velocity.Y = 0.0;

position += 0.5 * (oldvelocity + velocity)
                * (float)gameTime.ElapsedGameTime.TotalSeconds;
sam hocevar
fonte
+1 Sobre o uso da integração Verlet pela integração com Euler. Eu sempre esqueci ou esqueci disso antes.
David Gouveia