暂停菜单“向下移动”&改进代码

时间:2015-07-11 13:26:41

标签: libgdx

我的暂停屏幕出现问题。我制作了一个简单的启动画面,然后是主菜单,您可以在其中开始或结束游戏,然后是随机图片。如果用户按下Esc,则切换到暂停屏幕,这与主菜单非常相似。唯一不同的是,如果用户点击“继续”它不会生成新图片,而只是再次渲染游戏屏幕。但是如果我再次继续按Esc后,屏幕上的暂停菜单会低于应有的值。如果我重复按“继续”然后“退出”,则按钮最终会移出显示的屏幕。我还没有找到解决方案,所以我在这里开了一个帐户,因为这个网站到目前为止帮助了我很多。 此外,我想知道是否有可以改进的事情。我刚开始使用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

1 个答案:

答案 0 :(得分:1)

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

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

重构代码以执行&#34;创建&#34;东西一次。 render()方法应该只是绘制它。我认为你不断在你的桌子上添加项目,每一帧可能是导致按钮离开屏幕的原因。