Libgdx在桌面上-确定鼠标是否在窗口之外

7

我需要检查鼠标是否在运行在Windows桌面上的libgdx应用程序窗口之外。

Gdx.input.getX()Gdx.input.getY() 在Windows上被限制在我的应用程序窗口中 (但不适用于Mac)。

我尝试过使用 Gdx.input.setCatched(true),它确实使其不受限制,但它也将鼠标完全绑定到了我的应用程序上。因此,Windows在我切换到其他应用程序之前不会接收到任何鼠标事件。

我还尝试编写了一个InputProcessor,但是 mouseMoved 仅在窗口内触发。 TouchDragged 的工作区域在窗口外,但是这只有在鼠标按下并在窗口内按住时才有效。

非常感谢任何帮助。


我认为仅使用libgdx是不可能实现的。 - Murat Karagöz
1
“在Windows上,它们受限于我的应用程序窗口(但在Mac上不是)。”您的意思是,在Mac上,当鼠标移出游戏窗口但窗口仍然聚焦时,您仍然可以使用上述函数获取鼠标坐标吗? - Crembo
@Crembo:是的,那正是我所指的。 - Phil Anderson
刚在我的 Mac 上确认了一下。它们肯定会返回屏幕外坐标,但在 Windows 上不会。 - Phil Anderson
1个回答

6
我找到了一种方法,但是有点麻烦。它利用了lwjgl backend Mouse.isInsideWindow() method(感谢Khopa提供的链接)。
如果有人感兴趣,这里是具体步骤...
在libgdx核心模块中创建一个接口...
public interface MouseWindowQuery {

    public boolean isMouseInsideWindow();
}

在您的主要AplicationListener类中(对于许多人来说,这将是扩展Game的类),添加一个MouseWindowQuery字段,并将其保存在某个地方...
public class SampleApp extends Game
{
    private MouseWindowQuery mouseWindowQuery;

    public FirstLibgdxApp(MouseWindowQuery mouseWindowQuery) {
        this.mouseWindowQuery= mouseWindowQuery;
    }
    ...
}

现在在桌面模块中,您可以按照以下方式实现接口...
public class MouseWindowQueryImpl implements MouseWindowQuery {

    @Override
    public boolean isMouseInsideWindow() {

        return Mouse.isInsideWindow();
    }
}

最后,将此内容传递给您的主ApplicationListener类,该类来自DesktopStarter类(具有main方法)。

现在,您可以随意使用传递的实例。

如果您有其他模块(例如Android),则必须传入一个空实现(即MouseWindowQuery的实现,只返回false)。

如果您想知道,接口和实现是必需的,以避免在核心中引入对桌面的依赖。

哇!我真的希望这能帮助到某个人!


你能解释一下 Mouse.isInsideWindow() 是什么吗?我在 libgdx API 中找不到 Mouse 类? - Crembo
它不在标准API中,而是在桌面后端JAR包中...确切地说,是在gdx-backend-lwjgl.jar中。这就是为什么你只能从桌面代码中调用它的原因。 - Phil Anderson
你应该提供一个文档链接 -> Mouse.isInsideWindow。另外值得注意的是,libgdx的后端lwjgl实现确实缺少对这个lwjgl方法的绑定。 - Khopa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接