实现鼠标边界

时间:2009-07-28 01:19:49

标签: c# visual-studio visual-studio-2008 xna

否则称为硬边缘,这是鼠标无法穿过的线。在游戏等中很有用。

目前,我有一个函数,如果我的鼠标光标位于屏幕上绘制的多边形中,则返回该函数。如果不是,我将光标移动到多边形中的最后一个存储点。

    if (!PointInPolygon(local, polyGon))
    {
        Cursor.Position = safePoint;
    }
    else
    {
        safePoint = Cursor.Position;
    }

我不喜欢这个有几个原因:

  • 由于更新时间较慢或出于某种原因,我有时可以突破。然后,将该位置存储为多边形外部的safePoint。然后我的鼠标卡在这个位置。

  • 倾斜边缘应使鼠标沿倾斜方向移动。再向右推动鼠标,“/”形状的墙应该以光标位于右上角。但由于这种方法的性质,越过该行将光标重置为以前的位置。继续向右推动只会继续重置光标,并且不会“向上推”。

还有其他方法可以解决这个问题吗?我主要担心的是最后一个问题:这个斜坡横向行为是我的程序的主要目标,我需要让它工作。即使我使用这个基本方法,任何优化特定行为的想法?


编辑:

Reed已经建议我返回CLOSEST到当前越界点的点。给定四边形的4个角点,我如何找到形状中/上的最近点?

4 个答案:

答案 0 :(得分:2)

我会执行以下操作,而不是跟踪“safePoint”:

如果找到多边形的外部,而不是恢复到最后已知的安全点,请将鼠标放在多边形上/中最近的点到当前鼠标位置。这也有助于感受,因为光标将倾向于(缓慢地)跟随多边形边缘的斜坡等。

它还消除了在调用之间保存状态的需要(安全点)。

答案 1 :(得分:2)

如何在2-D(假设顺时针缠绕顺序)中约束多边形内的点 P (非凸面有点难):

对于多边形的每条边(Pi,Pj)

找到边缘的法线向量 N (单位向量从 Pi 指向 Pj ,旋转90度)

沿着 N D =(P-Pi)点N <从边缘到 P 找到位移 D < / strong>)

如果 D 为正(或逆时针缠绕顺序为负),则 P = P - N * D

结束循环:)

答案 2 :(得分:0)

  1. 使用两个端点查找边线的等式。
  2. - (1 / slope)给出垂直线的斜率。
  3. 使用边缘上的已知点(真实鼠标的位置)求解垂直线的线方程
  4. 解决边线与垂直线的交点。
  5. 将假光标放在该位置。

答案 3 :(得分:-1)

最近点:

if(mouse.x > maxX) 
    mouse.x = maxX;
else if(mouse.x < minX)
    mouse.x = minX;

// same for Y.