对Inputlistener LIBGDX感到困惑

时间:2018-11-27 16:58:00

标签: libgdx listener

我有

  • 主测试类创建一个阶段,在该阶段添加一个Actor并将Inputprocessor设置到该阶段

  • 扩展了组类,并添加了几个Actor。在该组的构造函数中,我添加了一个InputListener。

未启动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);
        }
    };

}

*更新*

我发现了问题。侦听器未找到我的演员的任何区域。 我必须使用setBounds()显式设置Region。

我的问题已解决,但我仍然感到困惑。为什么我必须自己设定界限。我确定以后会和每个演员一起忘记这一点,因为这对我来说是不合逻辑的。这是我必须采取的方式,还是我理解这个概念不正确?

1 个答案:

答案 0 :(得分:1)

Group是一个骨架类,可用于开发您自己的功能,因此它不会假定任何东西,即使它的子参与者对其边界做出贡献的方式也是如此。 (例如,您可能不想让某些演员参与其中,因为它们在视觉上很繁荣,例如粒子。)您可以扩展Group来创建自己的基类以满足您的需求。

那么LibGDX为什么不包含这样的类?在LibGDX中,舞台主要用于UI系统。尽管它被设计为可扩展为各种目的,但除非您使用的是基于它的完全烘焙的UI实施,否则它仅包含一个用于执行此操作的框架。该UI实现确实包含一个名为WidgetGroup的Group子类,该子类可以实现您期望的范围。

IIRC的作者,几年前在libgdx.com上写了一篇博客文章,讨论了他如何尝试将Stage用作简单的游戏果酱游戏的游戏玩法,并得出的基本结论是,这使他的游戏更加混乱,或至少花费更多的时间进行编码。

我亲自将其用于回合制游戏中,这非常有用。我使用动作系统对游戏片段进行了漂亮的动画过渡。但是我认为,与创建适合您特定游戏的组织结构相比,实时游戏会更加复杂。如果您要创建更复杂的游戏,则可以查看LibGDX的Ashley插件。

在任何一种情况下,您都绝对应该将其用于GUI上,因为这是完全实现的,并且可以节省大量时间。