2014-03-29 2 views
0

Когда моя игра заканчивается, я пытаюсь изменить экран на конечный игровой экран, но вместо этого он просто мигает текущим экраном игры.Смена конца экрана игры в libgdx

Я верю, что он очищает сцену, но затем снова рисует ее, не переходя к следующему экрану? Как будто его по-прежнему зацикливает вызов рендеринга.

Можете ли вы посоветовать, как правильно переключать экран.

@Override 
public void render(float v) { 
    Gdx.gl.glClearColor(0, 0, 0, 1); 
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 
    if (state == gamestate.PAUSED) { 
     // draw pause screen 
    } 
    else if (state == gamestate.GAMEOVER || score <= 0) { 
     game.setScreen(new endGameScreen(game, score)); 
     stage.clear(); 
     return; 
    } 
    else { 
     player.update(); 

     stage.draw(); 
     batch.begin(); 
     mBtn.setPosition((cam.position.x - (Gdx.graphics.getWidth()/2)) + 10, (cam.position.y - (Gdx.graphics.getHeight()/2)) + 10); 
     pBtn.setPosition((cam.position.x + (Gdx.graphics.getWidth()/2)) - pauseWidth, (cam.position.y - (Gdx.graphics.getHeight()/2)) + 10); 

     batch.draw(player.getCurrentFrame(), player.getPosition().x, player.getPosition().y); 

     cam.position.set(player.getPosition().x, Gdx.graphics.getHeight()/2, 0); 
     batch.setProjectionMatrix(cam.combined); 
     cam.update(); 

     batch.end(); 

     if(player.getPosition().x >= finishLine.getX()) { 
      System.out.println("End Game!!!"); 
      endGame(); 
     } 
    } 
} 

Хорошо, поэтому полный код для метода визуализации вверх. Я переместил настройку входного процессора на метод show().

Эта проблема может быть вызвана тем, что метод game.setScreen находится в методе визуализации, но я не уверен, как это реализовать в методе show, так как это происходит, когда актер достигает определенного местоположения, t слушайте входной контакт или что-то еще.

Конец игры экрана

public class endGameScreen implements Screen { 

int score = 0; 
String scoreTxt = ""; 
Stage stage; 
SpriteBatch batch; 
BitmapFont font; 
Game game; 

public endGameScreen(Game game, int score){ 
    this.score = score; 
    this.game = game; 
} 

@Override 
public void render(float v) { 
    batch.begin(); 
    font.setColor(1.0f, 1.0f, 1.0f, 1.0f); 
    font.draw(batch, scoreTxt, 25, 100); 
    batch.end(); 
} 

@Override 
public void show() { 
    batch = new SpriteBatch(); 
    font = new BitmapFont(Gdx.files.internal("font.fnt")); 
    stage = new Stage(Gdx.graphics.getWidth(),Gdx.graphics.getHeight(),true); 
} 
+3

Недостаточно вашего кода, чтобы увидеть проблему. – Chase

+0

Почему вы устанавливаете свой входной процессор при каждом вызове рендера? Разве это не достаточно, если вы делаете это при показе экрана? Вы тестировали, когда-либо попадаете в ту часть, где ему говорят, чтобы перейти к EndGameScreen? Как правило, я не знаю, действительно ли это такая практика, чтобы сделать все это в вашем цикле рендеринга. Просто постарайтесь сделать это на основе событий ... всякий раз, когда вы достигаете точки, в которой вы меняете свое игровое состояние на игру, просто вызовите метод setScreen(). Или, как только вы узнаете паузу в игре, покажите сцену, на которой включен экран Pause. Я не думаю, что в каждом вызове рендеринга необходимо проверить ... – evident

+0

Хорошо, плохой ход. Да, это доходит до этой точки, потому что я вижу изменение игры. – Wayneio

ответ

1

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

Так что просто добавьте линию glClear, как в другом классе.

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