XNA 2D Platformer-гравитация заставляет спрайт погружаться в плитку


Я создаю 2D-платформер в XNA, и у меня возникли некоторые проблемы с гравитацией. Моя гравитация заставляет игрока погружаться в плитку, а не приземляться сверху. Вот моя реализация гравитации:

        if (willPlayerCollide(State.Decending) == false)
        {
            changeState(State.Decending);

            onGround = false;
            velocity.Y += 0.1f;
            position.Y += velocity.Y;

            positionRect = new Rectangle((int)position.X, (int)position.Y, spriteWidth, spriteHeight);
            futurePositionRec = new Rectangle((int)position.X, (int)position.Y + 1, spriteWidth, spriteHeight);

            debug = velocity.Y.ToString();

        }
        else
        {
            changeState(State.Idle);
            onGround = true;
            velocity.Y = 0.0f;
        }

Соответствующая часть кода обнаружения столкновений для willPlayerCollide:

        else if (potentialState == State.Decending)
        {
            futurePositionRec = new Rectangle((int)position.X, (int)position.Y + 1, spriteWidth, spriteHeight);

            for (int i = 0; i < Level.impassableTileRecs.Count(); i++)
            {
                if (futurePositionRec.Intersects(Level.impassableTileRecs[i]))
                {
                    collided = true;
                    tileCollRect = Level.impassableTileRecs[i];
                }
            }
        }

С этим кодом, когда игрок падает, он будет частично погружаться в плитку. В зависимости от того, насколько велико число этой скорости.Y увеличивается на то, насколько игрок будет погружаться в земля. Большое ускорение заставит игрока погрузиться еще глубже в плитку. Любая помощь ценится.

1 2

1 ответ:

Это происходит потому, что вы изменяете только скорость спрайта и его положение Y сохраняется, когда он ударяется о землю. Установка его в tileCollRect.Y - spriteHeight при столкновении с Землей должна устранить проблему.