2014-11-19 3 views
0

Привет, я являюсь новым для libGDX, и я просто создаю простое игровое приложение. У меня есть экран главного меню и экран уровня для моей игры. Я инициализировал начальный экран в главном меню. Когда я нажимаю кнопку «Воспроизвести» на экране главного меню, я хочу переключить экран на экран выбора уровня, но происходит то, что он меняет экран, но старый тоже делает за ним. Это то, что происходит, когда я нажимаю на кнопку воспроизведения: http://prntscr.com/57teriЛинии LibGDX перекрываются при смене экранов

Класс игры:

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"); 

} 

ответ

2

Ваш Окно LevelSelect необходимо очистить буфер перед рисованием. Если вы этого не сделаете, последний отображаемый кадр из меню всегда будет находиться в буфере.

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

    ... 
} 
+0

OMG, я не знаю, как я забыл, что ... мне стыдно за себя, впустую 2 часа на том, чтобы выяснить, почему ... спасибо так много: D – user3650664

+0

@ user3650664 Да, это происходит для всех нас в какой-то момент. – MadEqua

+0

@ user3650664 немного «трюк», который я использую в моем текущем проекте: я называю 'Gdx.gl20.glClearColor (0, 0, 0, 1);' и 'Gdx.gl20.glClear (GL20.GL_COLOR_BUFFER_BIT);' in класс 'Game' (в вашем случае класс' BallJump'), rigth перед вызовом 'super.render (delta)'. Поэтому перед тем, как класс 'Game' вызывает' render (delta) 'для' Screen', он очищает все. – Springrbua

Смежные вопросы