无法让我的碰撞工作(平台游戏)XNA

Can't get my collision to work (platformer) XNA

我现在正在学习 XNA,总体而言我对编程还很陌生。我现在正在制作平台游戏,但当我从左侧或右侧走进平台时,我会被传送到平台顶部。碰撞仅适用于添加到平台列表的最后一个平台。

这是在游戏中 class:

加载内容:

for (int i = 0; i < 3; i++)
        {
            platform0List.Add(new Platform0(new Vector2(70 + (i * 300), 400), platform0Texture));
        }

更新:

protected override void Update(GameTime gameTime)
    {
        keyboard = Keyboard.GetState();

        player.Update(keyboard, keyboardPrev, platform0List);
        foreach (Platform0 platform in platform0List)
        {
            if (!Move_Free(player.position.X, player.position.Y + player.gravity, player.texture.Width, player.texture.Height, platform.rectangle) && player.gravity >= 0)
            {
                player.ground = true;
                if (player.position.Y + player.texture.Height + player.gravity > platform.position.Y)
                {
                    player.position.Y = platform.position.Y - player.texture.Height;
                }
                else if (player.position.Y + player.texture.Height + player.gravity < platform.position.Y)
                {
                    player.gravity = platform.position.Y - player.texture.Height;
                }
                break;
            }
            else
            {
                player.ground = false;
            }
        }

        if (keyboard.IsKeyDown(Keys.Escape)) this.Exit();

        keyboardPrev = keyboard;
        base.Update(gameTime);
    }

这是我的Move_Free方法

public static bool Move_Free(float x, float y, int width, int height, Rectangle rectangle)
    {
        Rectangle rect = new Rectangle((int)x,(int)y,width,height);
        if(rect.Intersects(rectangle))
        {
            return false;
        }
        else
        {
            return true;
        }
    }

这是在播放器中 class

foreach (Platform0 platform in platform0List)
        {
            if (keyboard.IsKeyDown(Keys.Right) && Game1.Move_Free(position.X + 5, position.Y, texture.Width, texture.Height, platform.rectangle))
            {
                moveRight = true;
            }
            else if (keyboard.IsKeyDown(Keys.Right) && ((position.X + texture.Width - platform.position.X) * -1) > 0)
            {
                position.X += (position.X + texture.Width - platform.position.X) * -1;
            }
            else
            {
                moveRight = false;
            }
            if (keyboard.IsKeyDown(Keys.Left) && Game1.Move_Free(position.X - 5, position.Y, texture.Width, texture.Height, platform.rectangle))
            {
                moveLeft = true;
            }
            else if (keyboard.IsKeyDown(Keys.Left) && position.X - (platform.position.X + platform.texture.Width) > 0)
            {
                position.X -= position.X - (platform.position.X + platform.texture.Width);
            }
            else
            {
                moveLeft = false;
            }
        }
        if (moveRight) position.X += 5;
        if (moveLeft) position.X -= 5;
        if (keyboard.IsKeyDown(Keys.Up) && ground)
        {
            gravity = -10;
            ground = false;
        }
        if(ground)
        {
            gravity = 0;
        }
        else
        {
            gravity += 9.8f / 60f;
            position.Y += gravity;
        }

forloop 的每次迭代都会覆盖 moveLeft 和 moveRight 变量。
因此,只会保留最后一个平台值。