【问题标题】:How to prevent "mouse object" from moving throgh rectangles?如何防止“鼠标对象”在矩形中移动?
【发布时间】:2015-08-28 14:14:22
【问题描述】:

我想达到什么目的?

我有一个 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;
        }
    }

问题

在我的情况下,有什么方法可以防止精灵穿过墙壁?

提前致谢。

【问题讨论】:

  • 我认为你需要检查每个障碍物的鼠标位置,例如: if (offsetPosition.X

标签: xna mouse collision-detection


【解决方案1】:

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

所以,如果你遇到一个 X 障碍(垂直障碍),只需调用

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

即使你的鼠标朝那个方向推,你的鼠标也不会改变它的X值,它根本不会穿过墙壁,但它可以上下移动就好了。 如果你从墙上退后,干脆不要拨打这条线,它会像以前一样运行。

【讨论】:

  • 我确实使用了 Mouse.SetPosition,它确实有效。当我以一定的速度(非常快)移动鼠标时,它似乎忽略了实现并且卡在了可碰撞的矩形中。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多