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

时间:2015-08-28 14:14:23

标签: xna mouse collision-detection

我想要实现的目标是什么?

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

有什么问题?

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

我的碰撞方法。

    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;
        }
    }

问题

在我的情况下,有什么方法可以阻止雪碧穿过墙壁?

提前致谢。

2 个答案:

答案 0 :(得分:1)

如您所知,您可以通过调用Mouse.GetState()来阅读鼠标位置。但您也可以通过Mouse.SetPosition(X,Y)将鼠标位置设置为您想要的任何位置,鼠标将移动到那里。

所以,如果你反对,比如X屏障(垂直屏障),只需打电话

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

即使将鼠标朝那个方向推动,你的鼠标也不会改变它的X值,它根本不会穿过墙壁,但它可以上下移动。 如果你从墙上退下来,就不要打电话给这条线,它就会像以前那样运作。

答案 1 :(得分:1)

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