XNA 2D平板成型器-重力导致精灵沉入瓷砖中

XNA 2D平板成型器-重力导致精灵沉入瓷砖中,xna,state,collision,detection,tile,Xna,State,Collision,Detection,Tile,我正在XNA中创建一个2D平台,我在重力方面遇到了一些问题。我的重力使玩家沉入瓦片,而不是降落在顶部。以下是我的重力实现: if (willPlayerCollide(State.Decending) == false) { changeState(State.Decending); onGround = false; velocity.Y += 0.1f; posi

我正在XNA中创建一个2D平台,我在重力方面遇到了一些问题。我的重力使玩家沉入瓦片,而不是降落在顶部。以下是我的重力实现:

        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;
        }
WillpayerCollide碰撞检测代码的相关部分为:

        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];
                }
            }
        }
else if(potentialState==State.decenting)
{
futurePositionRec=新矩形((int)position.X,(int)position.Y+1,spriteWidth,spriteHeight);
for(int i=0;i

使用此代码,当玩家下落时,它将部分沉入瓷砖中。根据velocity.Y增加的数值的大小,玩家将沉入地面的程度。一个大的加速度会使玩家更深入地砖。感谢您的帮助。

之所以会这样,是因为您只更改了精灵的速度,并且当精灵落地时,它的Y位置保持不变。当发生地面碰撞时,将其设置为
tilecolrect.Y-spriteHeight应该可以解决问题。

这解决了问题。谢谢