Java无法通行的区域

时间:2013-06-13 01:03:43

标签: java eclipse events mouse awtrobot

我有一个鼠标事件处理程序,在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像素,则指针将被翻译。然而,我想做的是重新创造一个“无法通行的墙”。

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

3 个答案:

答案 0 :(得分:1)

我认为你需要向自己澄清一下鼠标撞击墙壁的行为,就坐标而言。
希望这个可怕的形象有所帮助;

pls dont judge my bad pic

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

FOR CAGE:

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

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

not so bad pic

你可以看到四个“边”区域涉及简单的翻译;只是改变鼠标的一个坐标(垂直墙的x坐标,水平墙的y坐标),以匹配墙的坐标。
四个“角落”区域可以完全改变鼠标坐标(到它们的角坐标!)

答案 1 :(得分: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.
      }
   });

答案 2 :(得分:1)

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

enter image description here

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

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

您可能认为这种方法过于严谨,但它是最强大的方法。我已经可以通过更简单的方法考虑另外两个问题。此外,您实际上正在进行2D hitbox检测。这是非常有用的事情要知道。