如何防止"鼠标对象"移动矩形?



我想要实现什么?

我有一个精灵,它应该随着鼠标的位置移动(有点像光标)。在我的情况下,我也有一些其他纹理(障碍类)。因此,如果鼠标与这样的障碍物碰撞,我希望纹理停止向该方向移动。

有什么问题?

虽然纹理跟随鼠标并在鼠标与障碍物"碰撞"时停止,但在某些时候光标不再在边界矩形内,而是在墙壁的另一边。结果,纹理的位置被更新到鼠标的位置,它突然出现在墙的后面,这不是一个理想的行为。

我的碰撞方法

    private void CheckCollision(List<Obstacle> _obstacleList, MouseState mState)
    {
        int xOffset = oldMouseState.X - mState.X;
        int yOffset = oldMouseState.Y - mState.Y;
        Vector2 offsetPosition = new Vector2(oldMouseState.X + xOffset,oldMouseState.Y + yOffset);
        bool collides = false;
        foreach (Obstacle obstacle in _obstacleList)
        {
            if (obstacle.BoundRectangle.Contains(offsetPosition))
            {
                collides = true;
            }
        }
        if (!collides)
        {
            position = offsetPosition;
        }
    }

在我的例子中,如何防止精灵穿过墙壁?

如您所知,可以通过调用Mouse.GetState()来读取鼠标位置。但是你也可以通过Mouse.SetPosition(X,Y)将鼠标的位置设置为你想要的任何位置,然后鼠标就会到达那里。

所以,如果你面对着,比如说,一个X屏障(垂直屏障),只需调用

Mouse.SetPosition(oldMouseState.X, mState.Y);

,你的鼠标不会改变它的X值,即使你把鼠标往那个方向推,它也不会穿过墙壁,但它可以上下移动。如果你从墙边退下,只要不打这条线,它就会像以前一样运行。

您可以存储鼠标的最后(有效)已知位置和鼠标的当前位置(有效意味着鼠标不在它不应该在的矩形中)。当你在当前鼠标位置碰到一个鼠标不应该经过的矩形时,你可以在while循环中迭代回到最后一个有效位置,并在每次将鼠标移近有效位置时检查鼠标是否仍处于阻塞精灵中。如果鼠标在禁区之外,你只需退出while循环,鼠标就非常接近障碍物的边界。

最新更新