【问题标题】:XNA 3.1 Movement Collision IssueXNA 3.1 运动碰撞问题
【发布时间】:2012-03-22 07:23:39
【问题描述】:

所以这是我的问题。我有一个盒子,我想让我的角色四处移动。但是我希望能够在持有多个移动命令的同时移动它,例如.. 向右移动(向障碍物的左侧)移动时,我希望能够同时向右和向上或向下移动,而角色不会粘在盒子上。有趣的是,它适用于障碍物的左侧和右侧,但当我在障碍物的顶部和底部尝试时它会粘住。 这是播放器类(物体正在移动)

<!-- language: c# -->
    public class Player
{
    public Texture2D texture;
    public Vector2 position;
    public int speed;
    public Vector2 offset;
    public bool left, right, up, down;
    public Rectangle collisionRect
    {
        get
        {
            return new Rectangle((int)position.X , (int)position.Y, texture.Width, texture.Height);
        }
    }
    public Vector2 direction;
    public Player(Texture2D texture, Vector2 position, int speed)
    {
        this.texture = texture;
        this.position = position;
        this.speed = speed;
        offset.X = speed;
        offset.Y = speed;
        left = false;
        right = false;
        up = false;
        down = false;
    }
    public virtual void Update(GameTime gameTime, Rectangle clientBounds)
    {
        direction = Vector2.Zero;
        if (Keyboard.GetState().IsKeyDown(Keys.A))
        {
            direction.X -= 1;
            left = true;
        }
        else
            left = false;
        if (Keyboard.GetState().IsKeyDown(Keys.D))
        {
            direction.X += 1;
            right = true;
        }
        else
            right = false;
        if (Keyboard.GetState().IsKeyDown(Keys.W))
        {
            direction.Y -= 1;
            up = true;
        }
        else
            up = false;
        if (Keyboard.GetState().IsKeyDown(Keys.S))
        {
            direction.Y += 1;
            down = true;
        }
        else
            down = false;

        position += (direction * speed);
    }
    public virtual void Draw(GameTime gameTime, SpriteBatch spritebatch)
    {
        spritebatch.Draw(texture, collisionRect, Color.White);
    }
}

这是我主游戏中的更新方法

    <!-- language: c# -->
    public override void Update(GameTime gameTime)
    {
        // TODO: Add your update code here
        player.Update(gameTime, Game.Window.ClientBounds);

        if (player.right && HitWall(player))
        {
            player.position.X -= player.offset.X;
        }
        else if (player.left && HitWall(player))
        {
            player.position.X += player.offset.X;
        }
        if (player.down && HitWall(player))
        {
            player.position.Y -= player.offset.Y;
        }
        else if (player.up && HitWall(player))
        {
            player.position.Y += player.offset.Y;
        }
        base.Update(gameTime);
    }

还有 HitWall 功能

    <!-- language: c# -->
    public bool HitWall(Player player)
    {
        for (int i = player.collisionRect.Top; i < player.collisionRect.Bottom; i++)
            for (int j = player.collisionRect.Left; j < player.collisionRect.Right; j++)
                if (TextureData[i * gameMap.map.Width + j] != Color.White)
                    return true;
        return false;
    }

【问题讨论】:

    标签: c# xna game-physics collision


    【解决方案1】:

    我不确定偏移是在哪里定义的,但我假设它是您刚刚制作的那个帧的移动。

    您的问题是,因为您在上下之前检查了左右,如果您沿对角线向下移动到框的顶部边缘,那么您将在 Y 方向上记录一个命中 - HitWall 没有t 检查你要去的方向,它只是检查碰撞。因此,Y 轴上的碰撞仍然计入线 if (player.right &amp;&amp; HitWall(player)) 并停止您的横向移动。

    最好的办法是进行横向移动,检查是否有击中,如果有击中则向后移动 - 然后向下移动,检查是否击中,如果有击中则向后移动。像这样更正位置应该意味着您可以随意沿着两侧滑动。

    【讨论】:

    • 谢谢,我修复它的方法是为第一部分(横向)创建一个布尔值,当处理垂直运动时,我只是关闭了横向检查。
    猜你喜欢
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    • 2013-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    相关资源
    最近更新 更多