桌面上的libgdx - 确定鼠标是否在窗口外

Phi*_*son 7 java libgdx

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

Gdx.input.getX()Gdx.input.getY()限制在Windows上的我的应用程序窗口(但不是在Mac上).

我试过Gdx.input.setCatched(true)它确实使它不受约束,但它也将鼠标完全绑定到我的应用程序.因此,在我将alt + tab添加到其他应用程序之前,Windows不会获得任何鼠标事件.

我也尝试过编写一个InputProcessor,但是mouseMoved只在窗口内被触发.TouchDragged在外面工作,但当然只有在按下鼠标按钮并保持在窗口内时才会触发.

任何帮助非常感谢.

Phi*_*son 6

我找到了一种方法,但天哪,这有点废话。它利用了lwjgl 后端 Mouse.isInsideWindow() 方法(感谢 Khopa 提供链接)。

如果有人感兴趣,这里是...

在您的 libgdx 核心模块中创建一个接口...

public interface MouseWindowQuery {

    public boolean isMouseInsideWindow();
}
Run Code Online (Sandbox Code Playgroud)

将 MouseWindowQuery 字段添加到您的主 AplicationListener 类(这将是为很多人扩展 Game 的类)并将其保存在某处...

public class SampleApp extends Game
{
    private MouseWindowQuery mouseWindowQuery;

    public FirstLibgdxApp(MouseWindowQuery mouseWindowQuery) {
        this.mouseWindowQuery= mouseWindowQuery;
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

现在在桌面模块中,您可以按如下方式实现接口...

public class MouseWindowQueryImpl implements MouseWindowQuery {

    @Override
    public boolean isMouseInsideWindow() {

        return Mouse.isInsideWindow();
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,将它从 DesktopStarter 类(带有该main方法的类)传递给您的主 ApplicationListener 类。

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

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

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

呼!我真的希望对某人有所帮助!