【问题标题】:How to clear libgdx listeners如何清除 libgdx 侦听器
【发布时间】:2014-02-17 10:56:27
【问题描述】:

所以在菜单中我有 3 个按钮,并且都具有相同的代码。对于这个话题,唯一重要的是

button2.addListener(new InputListener() {
    @Override
    public boolean touchDown(InputEvent event, float x, float y,
    int pointer, int button) {
        game.setGame();
        dispose();
    return true;
    }
});

然后一切都很好,直到:

button3.clearListeners(); // MainMenu.java:174 line in exeption 

然后出现异常:

Exception in thread "LWJGL Application" java.lang.IllegalStateException: Invalid between begin/end.
at com.badlogic.gdx.utils.DelayedRemovalArray.clear(DelayedRemovalArray.java:125)
at com.badlogic.gdx.scenes.scene2d.Actor.clearListeners(Actor.java:261)
at com.racostyle.avdelux.MainMenu.dispose(MainMenu.java:174)
at com.racostyle.avdelux.MainMenu$3.touchDown(MainMenu.java:123)
at com.badlogic.gdx.scenes.scene2d.InputListener.handle(InputListener.java:55)
at com.badlogic.gdx.scenes.scene2d.Actor.notify(Actor.java:165)
at com.badlogic.gdx.scenes.scene2d.Actor.fire(Actor.java:136)
at com.badlogic.gdx.scenes.scene2d.Stage.touchDown(Stage.java:277)
at com.badlogic.gdx.backends.lwjgl.LwjglInput.processEvents(LwjglInput.java:300)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:200)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:114)

编辑:如果我不删除侦听器,它们仍然处于活动状态并且可以点击,afc with exeptions.

【问题讨论】:

    标签: java libgdx


    【解决方案1】:

    您似乎在 actor.touchdown 侦听器中调用 MainMenu.disposeMainMenu.dispose 清除按钮上的所有侦听器。 LIBGX 不允许这样做。

    为什么?因为 LIBGDX 正在对很多演员调用触摸事件。您真的不希望您的游戏根据添加到您的舞台的顺序按钮而有所不同。

    所以,请在其他地方调用 clear listeners。

    由于您无论如何都是在 dispose 方法中执行此操作,我建议您根本不要删除您的按钮侦听器,因为您已为其注册侦听器的演员不应再次使用。

    【讨论】:

      【解决方案2】:

      不允许在没有事件的情况下只调用 clearListeners();

      你会在 jsfiddle 中发布你的代码吗.. 我会尝试调试它并添加一些代码.. 谢谢..

      【讨论】:

      • 正如我所见,jsfiddle 是用于 javascript 而不是用于 java?但对于那些明确的听众。它清除所有其他侦听器,因此在 button1 和 button2 中。问题就在最后一个,被点击/触摸
      • 请问按钮3是做什么的??它会正确退出一切
      • 按钮通过主干类调用新屏幕(扩展游戏类)并删除当前屏幕。但是没有问题。问题是如果我离开那个监听器垃圾收集器不会删除它们(我已经尝试过),所以我在屏幕上有“幽灵按钮”,因为我不能做出动作来中继触摸事件。
      • 我找到了解决方案。我认为这只是一个临时解决方案,因为我仍然必须找出为什么我会得到例外。 gdx.input.setInputProcessor(null);
      猜你喜欢
      • 2020-01-18
      • 2012-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-26
      • 1970-01-01
      相关资源
      最近更新 更多