Libgdx中正确处理屏幕的方法

8

如何完全处理Libgdx中的屏幕?目前,如果我在上一个屏幕上单击按钮所在的位置,该按钮仍会执行与该屏幕相同的操作。我应该在dispose()方法中尽可能地.dispose()所有东西吗?还是有更简单的方法来处理屏幕上的所有内容?

3个回答

19

很不幸,没有更简单的方法。这些类没有任何共同的"Disposable"接口或其他自动执行此操作的方式。当不再需要拥有dispose()方法的所有内容时,需要手动清理。

对于Screens本身也是如此。切换Screens时它们不会自动被清理,但您需要自己进行清理(在调用Game.setScreen()之前)。

另一方面,这并不是什么大问题。只需浏览您Screen中的所有内容,并检查它是否需要清理。如果存在一个dispose方法,请在Screendispose()中调用它。

但这并不能解释您上一个Screen中看不到按钮的行为。我想您使用了Stage并且使用了Gdx.input.setInputProcessor(stage);。当您更改屏幕时,这种设置不会更改,您必须将输入处理器设置为当前ScreenStage或处理当前Screen输入的任何其他组件。这样,“旧”的舞台就不会再捕捉到任何输入了。


所有的变量怎么处理? - Chris
@user2341336 您具体指的是哪些变量?我将大多数需要处理的内容作为屏幕类自身的私有属性保留在屏幕切换中,因为它们从逻辑上属于屏幕。 - noone

2

我可以确认,这个问题是因为输入处理器没有通过新阶段。这将导致如所描述的“幽灵”按钮。


0

不幸的是LibGDX API文档中提到:

请注意,dispose()不会自动调用。

所以我在Screen的hide()方法中处理所有可处理的对象(例如StageSkinTexture等),因为hide()方法会自动调用,这样做非常有效!

例如:

public class GameScreen implements Screen {
...
    @Override
    public void hide() {
        mainStage.dispose();
        playGroundStage.dispose();
        controller.dispose();
        labelActor.dispose();
    }
...
}

1
我不建议在hide()方法内部处理对象的释放,因为如果有人调用你的方法,这个方法会在Android上被调用。 - Green_qaue

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接