java - 如何正确设置 libgdx 中的屏幕

标签 java libgdx

我目前正在制作一款 2d 无限跑酷风格游戏,发布日期为万圣节。我几乎已经完成了游戏本身,我刚刚添加了一个主菜单,目前正在制作暂停菜单。不过,我在设置屏幕时遇到了一个大问题。将屏幕从主菜单设置到游戏中效果非常好,但是当我将屏幕设置回主菜单时,会发生一些奇怪的事情:

  1. spriteBatch 中没有任何内容渲染,一切都只是一个黑框(MainMenuScreen)
  2. 如果我选择返回游戏,我会发现并非所有内容都会像屏幕最初设置为 GameScreen 时那样重置

Here's a video of the issue

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

从游戏第一次打开到主菜单:

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/

相关文章:

java - Android 和 Unity3D - Unity 生成的 R.java?

java - 如何计算构建哈希表所需的最大/最小探针数

java - 允许在 eclipse 插件中进行单一选择的对话框

java - 使用java运行时(在Windows机器上)将Linux命令发送到Linux服务器

java - eclipse 火星 : rebuild index of maven central repository stuck

android - 调整文本按钮中的文本大小

java - 在 libgdx 中显示大文本

java - LibGDX 将 BitmapFont 绘制到中间位置(spritebatch)

java - libgdx 在相机的某个 X 坐标处渲染平铺贴图

java - 如何查看 libgdx 中是否触摸了纹理?