【问题标题】:LibGDX Screens overlapping when changing screensLibGDX 切换画面时画面重叠
【发布时间】:2015-01-16 09:17:28
【问题描述】:

您好,我是 libGDX 的新手,我只是在创建一个简单的游戏应用程序。我的游戏有一个主菜单屏幕和一个关卡屏幕。我已将启动屏幕初始化为主菜单。当我单击主菜单屏幕中的“播放”按钮时,我想将屏幕切换到关卡选择屏幕,但发生的情况是它确实改变了屏幕,但旧屏幕也在后面渲染。这就是我点击播放按钮时发生的事情:http://prntscr.com/57teri

游戏类:

public class BallJump extends Game {

MainMenu menu;
LevelSelect levelSelect;


@Override
public void create () {
    menu = new MainMenu(this);
    levelSelect = new LevelSelect(this);

    setScreen(menu);

}

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

}

@Override
public void resize(int width, int height) {
    super.resize(width, height);

}

@Override
public void dispose() {
    super.dispose();


}


}

主菜单屏幕:

public class MainMenu implements Screen{

BallJump game;
Stage stage;
GameButton playButton, exitButton;
Texture title;
Sprite test;
SpriteBatch batch;
OrthographicCamera camera;

public MainMenu(BallJump game) { 
    this.game = game;
}



@Override
public void render(float delta) {
    Gdx.gl20.glClearColor(0, 0, 0, 1);
    Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT);
    System.out.println("main menu");

    stage.act();
    stage.draw();

    batch.begin();
    test.draw(batch);
    batch.end();


}

@Override
public void show() {
    camera = new OrthographicCamera();
    title = new Texture(Gdx.files.internal("images/title.png"));
    test = new Sprite(title);


    batch = new SpriteBatch();

    stage = new Stage();

    test.setPosition(Gdx.graphics.getWidth()/7f, Gdx.graphics.getHeight()/1.75f);



    playButton = new GameButton("PLAY");
    playButton.setPosition(Gdx.graphics.getWidth()/2.5f, Gdx.graphics.getHeight()/2);
    playButton.setHeight(50f);
    playButton.setWidth(150f);
    playButton.addListener(new InputListener() {
        public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) {
            game.setScreen(game.levelSelect);
            dispose();

                return true;
        }});

    stage.addActor(playButton);

    exitButton = new GameButton("EXIT");
    exitButton.setPosition(Gdx.graphics.getWidth()/2.5f, Gdx.graphics.getHeight()/3);
    exitButton.setHeight(50f);
    exitButton.setWidth(150f);
    exitButton.addListener(new InputListener() {
        public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) {

                return true;
        }});

    stage.addActor(exitButton);

    Gdx.input.setInputProcessor(stage);
}



@Override
public void hide() {


}

@Override
public void resize(int width, int height) {
     camera.viewportWidth = width;
     camera.viewportHeight = height;
     camera.update();

}

@Override
public void dispose() {
    batch.dispose();
    stage.clear();
    stage.dispose();
    title.dispose();



}

关卡选择界面:

public class LevelSelect implements Screen{

BallJump game;
Stage stage;
TextButton l1, buttonExit;
Texture title;
Sprite test;
SpriteBatch batch;
OrthographicCamera camera;

public LevelSelect(BallJump game) { 
    this.game = game;
}





@Override
public void show() {
    batch = new SpriteBatch();
    stage = new Stage();

    title = new Texture(Gdx.files.internal("images/level_select.png"));
    test = new Sprite(title);
    test.setPosition(Gdx.graphics.getWidth()/7f, Gdx.graphics.getHeight()/1.75f);



    stage.addActor(l1);

}





@Override
public void render(float delta) {
    stage.act();
    stage.draw();

    batch.begin();
    test.draw(batch);
    batch.end();
    System.out.println("level select");

}

【问题讨论】:

    标签: java libgdx screen overlapping


    【解决方案1】:

    您的LevelSelect 屏幕需要在绘制之前清除缓冲区。如果不这样做,菜单中最后渲染的帧将始终在缓冲区中。

    @Override
    public void render(float delta) {
       Gdx.gl20.glClearColor(0, 0, 0, 1);
       Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT);
    
       ...
    }
    

    【讨论】:

    • 天啊,我不知道我是怎么忘记的...我为自己感到羞耻,浪费了 2 个小时试图找出原因...非常感谢:D
    • @user3650664 只是我在当前项目中使用的一个小“技巧”​​:我在Game 类中调用Gdx.gl20.glClearColor(0, 0, 0, 1);Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT);(在你的情况下为BallJump 类),正确在致电super.render(delta) 之前。因此,在 Game 类为 Screen 调用 render(delta) 之前,它会清除所有内容。
    猜你喜欢
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-13
    • 1970-01-01
    相关资源
    最近更新 更多