暂停菜单是 "moving down" & 改进代码

Pause Menu is "moving down" & improving the code

我的暂停屏幕有问题。我制作了一个简单的启动画面,然后是主菜单,您可以在其中开始或结束游戏,然后是随机图片。如果用户按下 Esc,它会切换到暂停屏幕,这与主菜单非常相似。唯一不同的是,如果用户点击 "Continue",它不会生成新图片,而只是再次渲染游戏画面。但是,如果我再次继续后按 Esc 键,暂停菜单在屏幕上的显示位置会低于应有的位置。如果我重复按 Continue 和 Escape,按钮最终会移出显示的屏幕。我还没有找到解决方案,所以我在这里注册了一个帐户,因为到目前为止这个网站对我帮助很大。 此外,我想知道是否有我可以改进的地方。我刚开始使用 libGDX,所以可能有很多事情我可以做得更好,我想知道这一点。因此,如果您有一些改进,我很乐意阅读它们:)!

这是代码:

import com.badlogic.gdx.Game;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input.Keys;
import com.badlogic.gdx.Screen;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.TextureAtlas;
import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.actions.Actions;
import com.badlogic.gdx.scenes.scene2d.ui.Image;
import com.badlogic.gdx.scenes.scene2d.ui.Label;
import com.badlogic.gdx.scenes.scene2d.ui.Skin;
import com.badlogic.gdx.scenes.scene2d.ui.Table;
import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;

public class GameScreen implements Screen{

    private Texture[] monsterTextures = {new Texture(Gdx.files.internal("Ressources/DemonHunter.jpg")), new Texture(Gdx.files.internal("Ressources/WingedDemon.jpg")),
                                        new Texture(Gdx.files.internal("Ressources/Viking.jpg")), new Texture(Gdx.files.internal("Ressources/DemonWarrior.jpg"))};
    private Image[] monsterImages = {new Image(monsterTextures[0]), new Image(monsterTextures[1]), new Image(monsterTextures[2]), new Image(monsterTextures[3])};
    private Stage gameStage = new Stage(), pauseStage = new Stage();
    private Table table = new Table();
    private Skin menuSkin = new Skin(Gdx.files.internal("skins/menuSkin.json"),
                            new TextureAtlas(Gdx.files.internal("skins/menuSkin.pack")));
    private TextButton buttonContinue = new TextButton("Continue", menuSkin),
                       buttonExit = new TextButton("Exit", menuSkin);
    private Label title = new Label ("Game", menuSkin);
    private int randomMonster;

    public static final int GAME_RUNNING = 0;
    public static final int GAME_PAUSING = 1;
    public static final int GAME_PAUSED = 2;
    private int gamestatus = 0;

    @Override
    public void show() {

        randomMonster = 0 + (int)(Math.random() * ((3-0) + 1));
        gameStage.addActor(monsterImages[randomMonster]);

    }

    @Override
    public void render(float delta) {

        if(Gdx.input.isKeyJustPressed(Keys.ESCAPE)) pauseGame();

        if(gamestatus == GAME_RUNNING) {
            Gdx.gl.glClearColor(0,0,0,1);
            Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
            gameStage.act();
            gameStage.draw();
        }

        if(gamestatus == GAME_PAUSING) {
            buttonContinue.addListener(new ClickListener(){
                public void clicked(InputEvent event, float x, float y) {
                    Gdx.gl.glClearColor(0,0,0,1);
                    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
                    gamestatus = GAME_RUNNING;
                }
            });
            buttonExit.addListener(new ClickListener(){
                public void clicked(InputEvent event, float x, float y) {
                    Gdx.app.exit();
                }
            });

            table.add(title).padBottom(40).row();
            table.add(buttonContinue).size(150, 60).padBottom(20).row();
            table.add(buttonExit).size(150, 60).padBottom(20).row();
            table.setFillParent(true);
            pauseStage.addActor(table);
            Gdx.input.setInputProcessor(pauseStage);

            Gdx.gl.glClearColor(0, 0, 0, 1);
            Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
            pauseStage.act();
            pauseStage.draw();
            gamestatus = GAME_PAUSED;
        }

        if(gamestatus == GAME_PAUSED) {
            Gdx.gl.glClearColor(0, 0, 0, 1);
            Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
            pauseStage.act();
            pauseStage.draw();
        }
        }



    public void pauseGame() {
        gamestatus = GAME_PAUSING;

    }

    @Override
    public void resize(int width, int height) {
        // TODO Auto-generated method stub

    }

    @Override
    public void pause() {
        pauseGame();

    }

    @Override
    public void resume() {
        // TODO Auto-generated method stub

    }

    @Override
    public void hide() {
        // TODO Auto-generated method stub

    }

    @Override
    public void dispose() {
        for(int i = 0; i < monsterTextures.length; i++) {
            monsterTextures[i].dispose();
        }
        gameStage.dispose();
        pauseStage.dispose();
        menuSkin.dispose();
    }

}

谢谢,Joshflux

我认为您的 render() 方法正在做它不应该做的事情。就像创建 clickListener 并向 table 添加按钮(可能还有其他一些项目)。

渲染方法每 "frame" 被调用一次。你不想重新创建这个,比如每秒 60 次。你想做一次(比如当你创建特定的屏幕时)然后每帧绘制(渲染)它。

重组您的代码以执行一次 "Creation" 的事情。 render() 方法应该只是绘制它。我认为您不断向 table 每一帧添加项目可能是导致按钮移出屏幕的原因。