1

我正在使用 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();
    //------------------------------------------//
4

1 回答 1

5

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

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

这应该如下所示:

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

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

于 2014-04-08T06:32:14.407 回答