如何正确设置libgdx中的屏幕

3
我目前正在制作一款2D无尽跑酷游戏,计划在万圣节发布。我已经完成了游戏本身,并添加了主菜单,目前正在制作暂停菜单。但是我在设置屏幕时遇到了一个大问题。从主菜单进入游戏的屏幕设置非常完美,但是当我将屏幕设置回主菜单时会出现一些奇怪的情况:
  1. spriteBatch中的所有内容都不会被呈现,所有东西都只是黑色的框(MainMenuScreen)
  2. 如果我选择返回游戏,我发现并没有像最初设置为GameScreen时那样重置所有内容

这里是问题的视频

这是我如何切换屏幕的代码:

从打开游戏到主菜单:

public class RadiationPigeon extends Game {

public static final float PPM = 100;

public static SpriteBatch batch;


@Override
public void create () {
    batch = new SpriteBatch();
    setScreen(new MainMenuScreen(this));
}

@Override
public void render () {
    super.render();
}


@Override
public void dispose () {
    batch.dispose();
}}

从 MainMenuScreen 到 GameScreen:

private RadiationPigeon radiationPigeon;

public MainMenuScreen(RadiationPigeon radiationPigeon){
    this.radiationPigeon = radiationPigeon;
}

playButton.addListener(new InputListener() {
        public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) {

            return true;

        }

        public void touchUp (InputEvent event, float x, float y, int pointer, int button) {

            radiationPigeon.setScreen(new GameScreen(radiationPigeon)); 
//I give GameScreen radiationpigeon so that the screen can be set back to MainMenu

        }
    });

从游戏界面到主菜单:

private RadiationPigeon radiationPigeon;

public GameScreen(RadiationPigeon radiationPigeon){

    world.setContactListener(new ContactListener());
    Timer timer = new Timer();
    timer.schedule(new BatAttackChanceCounter(), 0, 1000);
    this.radiationPigeon = radiationPigeon;
}

pauseButton.addListener(new InputListener() {
        public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) {

            return true;

        }

        public void touchUp (InputEvent event, float x, float y, int pointer, int button) {

            //paused = true;
            radiationPigeon.setScreen(new MainMenuScreen(radiationPigeon));

        }
    });

仅供参考,这是我两个屏幕的渲染方法:
主菜单屏幕:
@Override
public void render(float delta) {

    Gdx.gl.glClearColor(1, 1, 1, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    stage.act();
    RadiationPigeon.batch.begin();
    stage.draw();
    RadiationPigeon.batch.end();

}

游戏屏幕:

@Override
public void render(float delta) {

    update(delta);

    Gdx.gl.glClearColor(0, 0,0, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

    RadiationPigeon.batch.setProjectionMatrix(pigeoncam.combined);

    RadiationPigeon.batch.begin();

    //RadiationPigeon.batch.draw(pausedScreen, pigeoncam.position.x - (250 / RadiationPigeon.PPM), pigeoncam.position.y - pigeoncam.viewportHeight / 2, 5, 5);


    RadiationPigeon.batch.end();


    b2dr.render(world, pigeoncam.combined);

    stage.draw();

    hud.stage.draw();
}
1个回答

2
经过多次尝试和错误,我终于解决了我的问题。我设置屏幕的方式没有问题(对于任何遇到设置屏幕问题的人,我提供的代码是有效的)。问题出在实际的按钮和图像上。我把其中一些变成了静态的,因为我需要在GameScreen中使用相同的按钮样式和字体。我认为这可以节省内存,但是一旦它们被访问到创建它们的屏幕之外(MainMenuScreen),它们就会失去所有值,实质上变成空的而不是null。
对按钮工作原理的缺乏理解导致了这个问题。
编辑:
事实证明,对静态变量工作原理的理解不足才是真正的问题。在Android上,当你最小化一个应用程序时,Java周期并不会停止,因此这些项目会“保持活动状态”。

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