我目前正在制作一款 2d 无限跑酷风格游戏,发布日期为万圣节。我几乎已经完成了游戏本身,我刚刚添加了一个主菜单,目前正在制作暂停菜单。不过,我在设置屏幕时遇到了一个大问题。将屏幕从主菜单设置到游戏中效果非常好,但是当我将屏幕设置回主菜单时,会发生一些奇怪的事情:
- spriteBatch 中没有任何内容渲染,一切都只是一个黑框(MainMenuScreen)
- 如果我选择返回游戏,我会发现并非所有内容都会像屏幕最初设置为 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();
}}
从主菜单屏幕到游戏屏幕:
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();
}
最佳答案
经过多次尝试和错误,我终于解决了我的问题。我设置屏幕的方式没有任何问题(对于任何在设置屏幕时遇到问题的人,我提供的代码都可以工作)。问题出在实际的按钮和图像上。我将其中一些设置为静态,因为我需要在 GameScreen 中使用相同的按钮样式和字体。我认为这会节省内存,但是,一旦在创建它们的屏幕(MainMenuScreen)之外访问它们,它们就会丢失所有值,本质上使它们为空而不使它们为空。
对按钮如何工作缺乏了解是导致问题的原因
编辑:
事实证明,缺乏对静态变量如何工作的理解才是真正的问题。在 Android 上,当您最小化 Android 应用程序时,Java 循环不会停止,因此项目“保持 Activity 状态”
关于java - 如何正确设置 libgdx 中的屏幕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52685452/