我正在用Java开发第一人称射击游戏,我想实现鼠标移动旋转玩家的控件。但是在Java中,我只能使用MouseListener
事件来获取鼠标坐标,因此一旦鼠标光标离开显示器边缘,坐标将停止变化,我将无法转动播放器的视图。
有关如何操作的任何提示/建议?感谢。
答案 0 :(得分:4)
在某些游戏中,在每次鼠标移动事件中,光标都会移回屏幕中间,视图会随着鼠标事件的相应大小和方向移动。您可以通过在光标居中之前计算光标位置到屏幕中心的偏移来获得该矢量。要将光标移回屏幕中心,您可以尝试使用java.awt.Robot类。
由于您正在构建第一人称射击游戏,因此您可能希望隐藏中心锁定的光标,并在玩家想要瞄准的位置绘制您自己的十字准线。这还将涉及根据之前鼠标移动事件的运行总数跟踪光标应该的位置。
如果要实现视图相对于鼠标起始位置继续移动的行为(即使鼠标停止移动),也可以保留所有先前鼠标移动向量的移动总和,然后移动每帧相应地查看一次。然而,这可能更适用于飞行模拟器而不是第一人称射击游戏。
答案 1 :(得分:4)
我尝试使用java.awt.Robot
作为AerandiR建议,但是我遇到了一些问题,并且其他人也可能遇到它们,所以我会详细说明。
如果您的目标是将光标保持在一个位置(最好是屏幕的中心),那么您需要在robot.mouseMove(width/2, height/2);
方法的末尾调用mouseMoved()
之类的内容。通过此实现,每次将鼠标移离中心时,Robot
都会将鼠标移回中心。
但是,当Robot
重新居中鼠标时,播放器将返回到原来的位置。实际上,玩家将在原始位置和转动位置之间断断续续。
要解决这个问题,不要定义玩家在现在鼠标的位置与鼠标位置之间的差异,将其定义为距离中心的距离。
像这样:turnAmountX += e.getX() - width/2;
现在,如果Robot
重新居中鼠标,e.getX() - width/2
将始终为零。
回顾:
void mouseMoved(MouseEvent e) {
turnAmountX += e.getX() - width/2;
turnAmountY += e.getY() - height/2;
robot.mouseMove(this.getLocationOnScreen().x + width/2,
this.getLocationOnScreen().y + height/2;
}