10

我正在用 Java 开发第一人称射击游戏,我想实现鼠标移动使玩家旋转的控件。但是在Java中,我只能通过MouseListener事件来获取鼠标坐标,所以一旦鼠标光标离开显示器边缘,坐标就会停止变化,我将无法转动玩家的视野。

关于如何做到这一点的任何提示/建议?谢谢。

4

2 回答 2

5

我尝试java.awt.Robot按照 AerandiR 的建议使用 a,但我遇到了一些问题,其他人也可能会遇到这些问题,所以我会详细说明。

如果您的目标是将光标保持在一个位置(最好是屏幕的中心),那么您将需要在方法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;
    }
于 2012-08-13T13:52:11.920 回答
4

在某些游戏中,每次鼠标移动事件时,光标都会移回屏幕中间,并且视图会随着鼠标事件的相应幅度和方向移动。您可以通过在光标居中之前计算光标位置到屏幕中心的偏移量来获得该向量。要将光标移回屏幕中心,您可以尝试使用java.awt.Robot类。

由于您正在构建第一人称射击游戏,因此您可能希望隐藏中心锁定光标,并在玩家打算瞄准的位置绘制您自己的十字准线。这还将涉及根据先前鼠标移动事件的运行总数来跟踪光标应位于的位置。

如果您想实现视图将继续相对于鼠标的起始位置移动的行为(即使鼠标停止移动),您可以保留所有先前鼠标移动向量的移动总和,并相应地移动视图一次每一帧。然而,这可能更适用于飞行模拟器之类的东西,而不是第一人称射击游戏。

于 2012-05-13T01:35:51.400 回答