Java LIBGDX:如何在二维/三维混合设置中拦截用户界面上的点击?

Java LIBGDX:如何在二维/三维混合设置中拦截用户界面上的点击?,java,input,libgdx,lwjgl,scene2d,Java,Input,Libgdx,Lwjgl,Scene2d,我使用lwjgl呈现游戏环境,同时使用scene2d.UI构建一个包含输入的表 目前,如果我点击UI,它会做出反应,但游戏环境也会做出反应。显然是因为我还没处理好。 这里的问题是——在哪里——我应该处理输入,这样在UI上单击鼠标就不会激活环境的输入处理 我的想法是将侦听器附加到UI表,并将输入处理移动到侦听器。我只是不知道怎么设置。 我应该在桌子上、孩子们身上设置ClickListener,还是应该在这里做其他事情 这是在渲染循环中运行的方法: private void processI

我使用lwjgl呈现游戏环境,同时使用scene2d.UI构建一个包含输入的表

目前,如果我点击UI,它会做出反应,但游戏环境也会做出反应。显然是因为我还没处理好。 这里的问题是——在哪里——我应该处理输入,这样在UI上单击鼠标就不会激活环境的输入处理

我的想法是将侦听器附加到UI表,并将输入处理移动到侦听器。我只是不知道怎么设置。 我应该在桌子上、孩子们身上设置ClickListener,还是应该在这里做其他事情

这是在渲染循环中运行的方法:

    private void processInput() {
    //Handle user input here
    //[...]
    //Mouse input
    if(Gdx.input.isButtonPressed(Input.Buttons.LEFT) && lastClick == null) {
        //lastClick = new Vector2(Gdx.input.getX() + CameraOrigen().x, (CameraOrigen().y+camera.viewportHeight)-Gdx.input.getY());
        lastClick = ScreenToWorld(new Vector2(Gdx.input.getX(),Gdx.input.getY()));
        gridIntersect = WorldToTileCoord(lastClick);
    }
    else if (!Gdx.input.isButtonPressed(Input.Buttons.LEFT) && lastClick != null) { lastClick = null; }
}
这就是我目前构建UI的方式:

//------------- UI Construction ------------//
    table.align(Align.top);
    Table debugTable = new Table();
    debugTable.add(debugMouseTable);
    debugTable.add(debugTileSelectTable);
    table.add(debugTable).expandX().height((float)(game.VIRTUAL_HEIGHT * 0.85));
    table.add(spTest).width((float)(game.VIRTUAL_WIDTH * 0.2)).height((float)(game.VIRTUAL_HEIGHT * 0.85)).bottom();
    table.row();
    table.add(sbTileTypes).align(Align.left).expandY();
    table.add("corner");

    spDebug.pad(10).defaults().expandX().space(4);
    for (AtlasRegion aReg : hmTiles.get(TileType.FLOOR)) {
        spDebug.add(new Button_TilePreview(aReg, skin, sbTileTypes.GetSelectionValue(), this, brush));
        spDebug.row();
    }
    spDebug.invalidateHierarchy();
    //------------------------------------------//

不要对输入使用轮询机制(
Gdx.input.isXXX(…)
)。它不是很稳定,因为您可能会错过一些事件,而且它还依赖于帧率

为您的游戏输入实现一个
InputProcessor
。然后使用
InputMultiplexer
让两个处理器(
Stage
和您的
GameplayInputProcessor
)都有机会处理事件

这应该如下所示:

InputMultiplexer multiplexer = new InputMultiplexer();
multiplexer.addProcessor(stage);
multiplexer.addProcessor(gameplayInputProcessor);
Gdx.input.setInputProcessor(mutliplexer);

这样,您的舞台将首先获得赛事。如果您的UI已经处理了输入事件,您不希望第二个处理器接收这些事件,那么您需要在阶段的处理方法中
返回true

不要对输入使用轮询机制(
Gdx.input.isXXX(…)
)。它不是很稳定,因为您可能会错过一些事件,而且它还依赖于帧率

为您的游戏输入实现一个
InputProcessor
。然后使用
InputMultiplexer
让两个处理器(
Stage
和您的
GameplayInputProcessor
)都有机会处理事件

这应该如下所示:

InputMultiplexer multiplexer = new InputMultiplexer();
multiplexer.addProcessor(stage);
multiplexer.addProcessor(gameplayInputProcessor);
Gdx.input.setInputProcessor(mutliplexer);

这样,您的舞台将首先获得赛事。如果你不想让你的第二个处理器接收输入事件,如果你的UI已经处理了它们,那么你需要在这个阶段的处理方法中
返回true

好的,我明白你的意思了。我现在正在查看文档,我想你让我走上了正确的轨道。谢谢你的帮助:)嗨,我了解多路复用器是如何工作的,如果stage可以处理输入,它就不用麻烦让gameplayinputprocessor来处理输入了。我应该让舞台覆盖UI吗?否则它会跑进游戏区,试着处理那边的点击,对吗?好的,我明白你的意思了。我现在正在查看文档,我想你让我走上了正确的轨道。谢谢你的帮助:)嗨,我了解多路复用器是如何工作的,如果stage可以处理输入,它就不用麻烦让gameplayinputprocessor来处理输入了。我应该让舞台覆盖UI吗?否则它会跑进游戏区,试着处理那边的点击,对吗?