对 Inputlistener 感到困惑 LIBGDX

Confused about Inputlistener LIBGDX

我有

未触发 InputListener。谁能告诉我为什么不这样做以及如何做?

public class Test extends ApplicationAdapter implements ApplicationListener {

    public void create() {
        stage = new Stage(new ScreenViewport());
        specialScene = new SpecialScene();
        stage.addActor(specialScene);    
    Gdx.input.setInputProcessor(stage);

    }


}


public class SpecialScene extends com.badlogic.gdx.scenes.scene2d.Group {
    public SpecialScene {
        <add some actors ...>
        addListener(specialListener);       
    }

    private static InputListener specialListener = new InputListener() {
        public boolean touchDown (InputEvent event, float x, float y, int pointer, int button)        {
            return true; //or false
        }

        @Override
        public void touchUp(InputEvent event, float x, float y, int pointer, int button) {
            super.touchUp(event, x, y, pointer, button);
        }

        @Override
        public void enter(InputEvent event, float x, float y, int pointer, Actor fromActor) {
            super.enter(event, x, y, pointer, fromActor);
        }
    };

}

* 更新 *

我发现了问题。 Listener 没有找到我的 Actor 的任何区域。 我必须使用 setBounds() 明确设置区域。

我的问题解决了,但我还是很迷茫。为什么我必须自己设置界限。我敢肯定,我以后会和每个演员一起忘记这一点,因为这对我来说是不合逻辑的。这是我必须的方式,还是我对这个概念的理解有误?

Group 是一个框架class,可用于开发您自己的功能,因此它不假定任何东西,甚至不假定其子 actor 对其边界的贡献方式。 (例如,您可能有一些不想贡献的演员,因为它们是一种视觉效果,例如粒子。)您可以扩展组来创建自己的基础 class 以满足您的需要。

那么,为什么 LibGDX 没有包含这样的 class?在LibGDX中,Stage主要用于UI系统。虽然它被设计为可扩展到各种目的,但它只包含一个框架供您执行此操作,除非您使用基于它的完全烘焙的 UI 实现。该 UI 实现确实包括一个名为 WidgetGroup 的 Group 的子 class,它可以满足您对边界的期望。

IIRC,Stage 的作者几年前在 libgdx.com 上写了一篇博客 post 讨论了他如何尝试使用 Stage 来实现一个简单的 game jam 游戏的玩法,并基本得出结论:导致他的游戏更加复杂,或者至少编码更耗时。

我个人曾将它用于回合制游戏即兴游戏,这对它来说非常有用。我使用 Actions 系统对游戏片段进行漂亮的动画转换。但我认为,与创建适合您的特定游戏的组织结构相比,这会使实时游戏更加复杂。如果您正在创建更复杂的游戏,您可以查看 LibGDX.

的 Ashley 插件

无论哪种情况,您绝对应该将它用于 GUI 东西,因为它已完全实现并且可以节省大量时间。