【问题标题】:LibGDX game: Check if button is touched when touchDown is calledLibGDX 游戏:调用 touchDown 时检查按钮是否被触摸
【发布时间】:2026-01-25 10:40:01
【问题描述】:

我目前正在为 Android 设备制作 libGDX 游戏。我想要一个在调用 touchDown 时调用函数的方法,而不是在单击按钮时调用函数。这是因为我正在为炮塔设置目标,并且在单击按钮时它不应旋转。

我现在的代码是

@Override
public boolean touchDown(int screenX, int screenY, int pointer, int button) {
    if (state != STATE.GAMEOVERLOST && state != STATE.PAUSED
            && state != STATE.EXITMENU && !slowButton.isOver()
            && !pauseButton.isPressed())
        turret.setTargetAngle(screenX, screenY);
    return true;
}

这会覆盖我的类实现的 InputProcessor 类中的函数。

此代码有效:

@Override
public boolean touchDragged(int screenX, int screenY, int pointer) {
    if (state != STATE.GAMEOVERLOST && state != STATE.PAUSED
            && state != STATE.EXITMENU && !slowButton.isPressed()
            && !pauseButton.isPressed())
        turret.setTargetAngle(screenX, screenY);
    return true;
}

touchDragged 有效但 touchDown 的事实并不表示该按钮直到第一个实例之后才被标记为“按下”。

我也尝试过使用 Button.isOver() 而不是 Button.isPressed() 但这仍然无法按预期工作。

有人有什么建议吗?

【问题讨论】:

    标签: java android button touch libgdx


    【解决方案1】:

    可以使用hit(x, y, touchable)的方法 按钮上。它在提供的坐标处找到最深的演员。您应该从舞台上调用它,如果它返回 pauseButton,则单击 pauseButton。如果它返回的不是slowButton 或null,那么它没有被点击。更多关于命中检测的信息on the Libgdx wiki

    所以你会做这样的事情:

    @Override
    public boolean touchDown(int screenX, int screenY, int pointer, int button) {
        if (state != STATE.GAMEOVERLOST && state != STATE.PAUSED
                && state != STATE.EXITMENU && !slowButton.isOver()
                && !stage.hit(screenX, screenY, true).equals(pauseButton))
            turret.setTargetAngle(screenX, screenY);
        return true;
    }
    

    但是,您可能需要将屏幕坐标转换为舞台坐标,具体取决于您的坐标系设置。

    【讨论】:

    • 我刚刚检查了 stage.hit(screenX, screenY, true) == null ,因为按钮是舞台上唯一的演员。感谢您为我指明正确的方向!