我正在使用Java进行第一人称游戏,我正在尝试让3D运动正常运行。
我的问题是我想抓住鼠标移动,但将鼠标放在窗口内。捕获鼠标移动后,我认为将鼠标放在窗口中的最佳方法是使用Robot.moveMouse(x,y)在移动后将鼠标置于窗口中心。这样可以正常工作,但是机器人的移动会在我的窗口中触发一个事件,然后将其解释为正常事件,从而将我的角色移动到世界中。
我已经尝试了各种保持状态和忽略动作的方案,直到我在中心,但它们看起来都很挑剔,并且不能完全检测用户与机器人控制的事件。
有没有一种简单的方法可以检测出机器人的鼠标移动?
是否有一种更简单的方法来解决我忽略的问题?
答案 0 :(得分:0)
好吧,我不是100%关于这一点,但您是否在鼠标事件中使用了getsource()
或getComponent()
函数?他们可能会将机器人作为其来源返回。除此之外,我会有一个类变量,如boolean robotControlling
,只要它控制鼠标,将其设置为true。然后,在mouseListener中,执行if(!robotControlling){...}
。希望这会有所帮助。
编辑:如果您的应用程序中有未使用的鼠标按钮(Java有按钮1,按钮2和按钮3),您可以让机器人按下该按钮,并在鼠标监听器中忽略按下该代码的任何事件。 (对此使用evt.getButton()
)当然,这不是最干净的解决方案:P
答案 1 :(得分:0)
我通过使用JOGL 2.0 RC4切换到NEWT解决了这个问题。特别是,我使用GLWindow和warpPointer而不是使用Robot.mouseMove的AWT框架。通过开关,我立即获得了平稳的动作。一些示例代码与我正在做的类似(里程可能会有所不同):
public class MyClass implements MouseListener {
private GLWindow window;
private int centeredX = -1;
private int centeredY = -1;
// ...
public void mouseMoved(MouseEvent e) {
if (centeredX == -1 || centeredY == -1) {
center();
return;
}
int deltaX = e.getX() - centeredX;
int deltaY = e.getY() - centeredY;
// ... Do something with the deltas
centeredX = window.getWidth() / 2;
centeredY = window.getHeight() / 2;
window.warpPointer(centeredX, centeredY);
}
}