繁体   English   中英

如何使用 java 为 FPS 游戏执行游戏内鼠标移动(或者可能为该任务编写驱动程序?)

[英]how to perform In-game mouse movements for FPS games using java (or maybe writing drivers for the task?)

你好,我要做什么的一些背景

我的服务将使用户能够使用他们的 android 设备玩 PC 游戏,方法是将正在运行的游戏实例从他们的 PC 流式传输到移动设备。 这涉及能够 stream 并使用 android 控制电脑。我正在尝试创建两个单独的应用程序 -

  • Android 应用程序 - 这边将拥有控件和所有这些。
  • 基于 Windows java 的应用程序 - 这将负责根据从 android 设备接收的数据对设备执行控制。

现在我知道你们中的一些人会说java.awt.robot可能只是工作(正如我在其他 stackoverflow 问题中发现的那样)。 所以,我将在下面留下两段代码,您可以看到它们在游戏中的作用以及它们不可用的原因。

这些代码是 KOTLIN 代码。 对于那些不知道的人,KOTLIN 和 JAVA 是可互操作的,因此 KOTLIN 可以使用 JAVA 库。 KOTLIN 代码转换为 JAVA 字节代码。

使用增量(或位置变化)-

val robot = Robot()
fun main(args: Array<String>) {
    Thread.sleep(10000)
    for (i in 0..200) {
        Thread.sleep(20)
        testMouseDelta(100, 0)//moves mouse to right by 100px
    }
}

fun testMouseDelta(dx: Int, dy: Int) {
    robot.mouseMove(
        MouseInfo.getPointerInfo().location.x + dx,
        MouseInfo.getPointerInfo().location.y + dy
    )
}

示例gif

游戏就好像它已经到达屏幕的右边缘并且不再向右旋转。(它应该保持旋转 20ms * 200 = 4000ms)

使用硬编码值 -

val robot = Robot()
fun main(args: Array<String>) {
    Thread.sleep(10000)
    for (i in 0..10000 step 50) {
        Thread.sleep(20)
        robot.mouseMove(
            i,
            MouseInfo.getPointerInfo().location.y
        )//moves mouse to right by 50px
    }
}

示例gif

我发现游戏有点自我循环。 您可能会在 gif 的末尾注意到它。 旋转故障到一个完全不同的角度。


现在你们对我要实现的目标有了一些背景,让我们讨论一下我遇到的问题。

到目前为止,我一直在使用java.awt.robot来执行我的所有操作并且它工作正常,直到我意识到它不能用于游戏中的鼠标控制。 我环顾了多个地方大约一个星期,只是为了找到一个可以正常工作的简单代码(没有找到)。 我发现我可能需要让游戏感觉好像直接从硬件鼠标接收数据,这是因为游戏与鼠标控件的交互方式不同,仅使用上述库不是解决方案。 所以,现在我想我只有两个选择。

  1. 等待一段 java 代码可以立即解决这个问题。
  2. 编写鼠标驱动程序并弄清楚我将如何在 java 中与它交互。

我不知道如何使用这两个选项中的任何一个。 我不知道驱动程序编码。 任何帮助深表感谢。 谢谢你。

我认为原因是您继续向右移动指针,即使到达边缘也是如此。 我有 2 个想法,这可能会有所帮助。

  1. 检查循环中指针的position。 如果到达屏幕的尽头( x坐标等于屏幕宽度),释放所有按钮(如果有点击),将指针向左移动最大值,点击所有之前的按钮(如果有),继续循环。
  2. 保持两个屏幕同步。 这将需要一些计算,但一般的想法是获取移动屏幕的宽度并以屏幕的百分比计算移动,然后在计算机中以相同的屏幕百分比移动鼠标指针。 例子:
mobileScreen = 500px
mobileMovement = 50px
percent = 10%
pcScreen = 2000px
pcMovement = 2000px * 10% = 200px

Tbh,我不确定两者都能解决问题,但我认为值得一试。 您可以像这样获得屏幕尺寸:

Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
double width = screenSize.getWidth();
double height = screenSize.getHeight();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM