【问题标题】:How to control the mouse in Minecraft using Python?如何使用 Python 在 Minecraft 中控制鼠标?
【发布时间】:2018-11-15 15:38:37
【问题描述】:

总而言之,我正在尝试以编程方式 - 并且在外部 - 控制 Minecraft 玩家的方向。

游戏环境没有 API,没有 Java 模组

通常这需要移动鼠标,但我尝试过的每一个模拟 python3 库的鼠标移动都不会在游戏中移动玩家的头部。每个库也做不同的事情。

例如,在脚本完成后手动移动鼠标之前,pyautogui 不会执行任何操作。这样做会在继续跟随您当前的鼠标移动之前,将玩家的视线转移到程序应该将其移动到的位置。两个鼠标命令都会出现这种情况。

import pyautogui

pyautogui.moveTo(500, 500)
pyautogui.moveRel(100, 100)  

pynput 库的结果和 pyautogui 一样奇怪:

from pynput.mouse import Controller

mouse = Controller()

mouse.position = (100, 200)
mouse.move(200, -100)

Quartz 根本不做任何事情:

import Quartz

class Mouse():
    down = [Quartz.kCGEventLeftMouseDown, Quartz.kCGEventRightMouseDown, Quartz.kCGEventOtherMouseDown]
    up = [Quartz.kCGEventLeftMouseUp, Quartz.kCGEventRightMouseUp, Quartz.kCGEventOtherMouseUp]
    [LEFT, RIGHT, OTHER] = [0, 1, 2]

    def click_pos(self, x, y, button=LEFT):
        self.move(x, y)
        self.click(button)

    def to_relative(self, x, y):
        curr_pos = Quartz.CGEventGetLocation( Quartz.CGEventCreate(None) )
        x += curr_pos.x;
        y += curr_pos.y;


mouse = Mouse()
mouse.to_relative(200, 200)

而且 python 鼠标库已经过时了:错误显示它只能在 Darwin 上运行(我在 macOS High Sierra 上)。由于Github 页面上的描述,我很难过得知这一点。它说“所有鼠标设备上的全局事件挂钩(无论焦点如何都捕获事件)”。然后我想,不知何故,我的世界正在自己吸收所有模拟的鼠标移动。无论哪种方式,我都没有为这个游戏使用正确的界面,我需要一些可以绕过 Minecraft 有趣的鼠标控制的东西来获得我想要的移动。

我什至尝试使用 鼠标键(mac 的鼠标移动辅助功能,让您只用键控制鼠标)和 pyautogui。

import pyautogui # with mouse keys on
import time
# mouse keys is an accessibility feature on mac that controls the mouse with the keyboard

print("[ALERT]: Make sure mouse keys is on! (press option 5 times if shortcut is enabled)")

pyautogui.keyDown('8')  # up in mouse keys
time.sleep(5)
pyautogui.keyUp('8')

我对最后一个不起作用并不感到特别惊讶,但我想我已经没有办法尝试绕过使 Minecraft 不接受我的蟒蛇鼠标输入的任何东西了。在这一点上,我很确定我给计算机的输入类型一定有一些区别。作为一个程序的 Minecraft 不像其他程序那样使用鼠标,而 python 鼠标也不像其他来源那样控制鼠标,因此存在断开连接。

我在我的 macOS High Sierra 上以全屏和窗口模式运行 Minecraft,尽我所能让它正常运行。我将在 PyCharm 中启动测试脚本(python 3.6),将窗口(或窗口焦点)更改为 Minecraft(在程序中有足够的延迟时间),然后见证会发生什么。鼠标点击、键盘按下,甚至涉及命令和转义键的热键都可以在 Minecraft 中使用 pyautogui 正常工作,所以我根本不担心这些。实际上只是鼠标移动没有做任何事情。

首先,这是问这个问题的正确地方吗?还有什么可以尝试的,或者我是否缺少一些重要的东西,可以让我的鼠标输入得到正确响应?

【问题讨论】:

  • 您找到适合您的方法了吗?我尝试过的所有方法(包括 Java 机器人、键盘大师、pynput)的行为都与您描述的相同。程序过程中鼠标不动,而是一手动触摸鼠标就跳转到编程的目的地。

标签: python macos mouse minecraft pyautogui


【解决方案1】:

我正在尝试做同样的事情,我让我在 Minecraft(Java 版)中移动视图。

对我有用的是使用带有相关鼠标命令的 pynput。它还需要在 Minecraft 设置中关闭“原始输入”。 [Esc -> 选项... -> 控件... -> 鼠标设置... -> 原始输入:关闭]

import pynput
mouse = pynput.mouse.Controller()
mouse.move(10, 10)

此外,如果有人想要的话,这里是鼠标平滑移动的开始:

def move_smooth(xm, ym, t):
    for i in range(t):
        if i < t/2:
            h = i
        else:
            h = t - i
        mouse.move(h*xm, h*ym)
        time.sleep(1/60)

move_smooth(2, 2, 40)

现在,开始尝试使键盘工作:P

【讨论】:

  • 关闭原始输入对我有用。我能够使用 pyautogui 的相对运动。它仅在延迟值大于 0 时才有效。
【解决方案2】:

我和你的情况类似。我也无法找到一种方法来记录我在 minecraft 等游戏中的鼠标移动。

但是,我了解到您可以使用 Java 和内置的机器人库来实现所需的鼠标移动。我不知道你是否设置了 python,但如果不是,那么值得一试。

【讨论】:

  • 我想知道你是否有一个在 Minecraft 中通过机器人控制鼠标的示例?当我尝试它时,鼠标表现出与 Pizzafoot 报告的相同行为。编程过程中鼠标不移动,手动移动鼠标会跳转到最后编程的位置。
【解决方案3】:

尝试以管理员身份运行 python 并以窗口模式运行游戏。 Pyautogui 应该可以工作。

【讨论】:

  • sudo python3 mouseTestingSpace.py 在我的终端中没有改变任何东西,同样的结果,程序完成后我移动鼠标后出现奇怪的“追赶”混蛋。
【解决方案4】:

我设法使它与鼠标库一起工作。我没有使用mouse.move(x,y,absolute,duration),而是使用了mouse._os_mouse.move_to(x,y)mouse._os_mouse.move_relative(x,y)。考虑到如果你想要一个平滑的效果,你必须自己使用time.sleep(s)之类的东西来实现它。

【讨论】:

    【解决方案5】:

    在 Minecraft 中 Options... 转到 Controls... 转到 Mouse Settings... 然后关闭 Raw Input

    应该这样做(你在 mac 上,我不知道这个设置是否打开 mac版的我的世界)

    【讨论】:

      【解决方案6】:

      我也在为此苦苦挣扎,我发现了以下发现(在 Ubuntu 20.04 上测试):

      如果您激活 RawInput,您可以使用mouse.position=(dx, dy)(尽管它是绝对的)导致头部的相对运动!它也适用于 dx 和 dy 的负值。

      这样更快、更准确。你可以例如链

      mouse.position = (0, -100000) # turn head all the way up
      mouse.position = (0, 600) # turn head exactly to horizon level
      

      当鼠标灵敏度设置为 100% 时,地平线从垂直方向向下 600 个“间距像素”。您不需要在调用之间有任何延迟,而且它们发生得如此之快,以至于在绝大多数情况下,玩家似乎不会在两者之间抬起头,而是立即看向地平线。当我使用关闭原始输入的相对运动时,我需要在两者之间进行睡眠,并且速度也被限制在某个值。

      唯一的问题是,当您在制作屏幕/菜单中时,您需要在这种控制鼠标的黑客方式和使用mouse.move(dx, dy) 或实际绝对屏幕坐标mouse.position=(x, y) 的正常方式之间切换。但我发现,如果你还创建了一个 pynput 鼠标侦听器,你会看到每次进入菜单时 Minecraft 都会将鼠标位置设置到其窗口的中心,并且当你返回游戏时它会再执行两次。所以我用这些作为触发器。

      【讨论】:

      • 你是如何确定 600 的?反复试验?
      • 是的,反复试验。以 10 像素步长移动,从北极到南极数了 120 步。
      猜你喜欢
      • 2010-09-21
      • 2010-11-13
      • 2010-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-02
      • 1970-01-01
      • 2011-12-02
      相关资源
      最近更新 更多