0

我有一个鼠标事件处理程序,在mouseMoved我有这个:

public void mouseMoved(MouseEvent e)
{
  if((e.getX()>=0 && e.getX()<=100) && (e.getY()>=0 && e.getY()<=100))
  {
    robot.mouseMove(mainOutput.getX()+200,mainOutput.getY()+200);
  }
}

这样做的目的是,如果用户试图向帧的前 100x100 像素移动,则指针将平移。然而,我想要做的是重建一堵“不可逾越的墙”。

基本上,当用户试图进入该区域时,它无法通过该区域的端点。我想知道的是我将如何去做这件事?

4

3 回答 3

1

我认为你只需要向自己澄清鼠标撞墙的行为,就坐标而言。
希望这个可怕的图像有所帮助;

请不要评判我的坏照片

每当鼠标移动时,您都想检查它是否在禁区(墙外的区域;无人区)。为此,只需检查鼠标的 x 坐标(在此示例中假设为水平墙)是否超出其限制(墙的 x 坐标)。
如果是,则将鼠标移回墙壁,保留其 y 值(将其 x 坐标设置为墙壁的坐标)

对于笼子:

有一个周围的方形墙壁的情况会稍微复杂一些,就突破墙壁时鼠标的放置位置而言。
观察到有 8 个不同的区域需要考虑鼠标可以进入“禁区”的位置,并且每个边界都应该以不同的方式平移鼠标。

边界角的坐标为红色(由 4 个值组成;xL、xR、yT、yB 分别代表左、右、上、下)。
每个区域中的绿色文本描述了鼠标位于该区域必须全部为真的条件(它们是您检测鼠标必须在该区域中的方式),其中 x 和 y 是鼠标坐标。

没那么糟糕的图片

您可以看到四个“侧面”区域涉及一个简单的平移;只需更改鼠标的一个坐标(垂直墙的 x 坐标,水平墙的 y 坐标)以匹配墙的坐标。
四个“角”区域可以完全改变鼠标坐标(到它们的角坐标!)

于 2013-06-13T02:03:37.477 回答
1

假设不可通过区域是一个 JPanel,您可以向它添加一个鼠标侦听器,该侦听器将在鼠标进入该区域时做出响应,然后执行您已经拥有的重定位工作。

   JPanel pnlArea = new JPanel();
   pnlArea .addMouseListener(new MouseAdapter() {
      @Override public void mouseEntered(MouseEvent arg0) {
         //execute some codes if the mouse pointer has enterd the area.
      }
   });
于 2013-06-13T02:10:15.970 回答
1

不幸的是,这比看起来要困难一些。让我首先用一个简单的移到边界外的方法来说明问题。

在此处输入图像描述

如您所见,在这种情况下,边界方法将检测到边界内的鼠标,并将其移动到角落的蓝点。让我强调一下,它会检测鼠标的位置。我们想要的是捕捉光标的移动,并让它在红点处结束。这种方法还有其他问题可能不会立即显现出来。

那么我们如何捕捉鼠标的移动呢?我们还需要通过跟踪先前的位置来将鼠标位移(黑色箭头)捕获为向量。我假设你可以做到这一点。那么我们如何计算新的位置呢?好吧,我们可以执行位移矢量与构成盒子边缘的线的线相交。由于您只处理水平线和垂直线,因此大大简化了,只需稍加思考即可完成。如果您很懒惰,请复制通用线相交算法。

您可能认为这种方法过于严谨,但它是最稳健的方法。我已经可以用更简单的方法想到两个额外的问题。此外,您实际上是在进行 2D hitbox 检测。这是一件非常有用的事情。

于 2013-06-13T02:50:06.723 回答