Ваша проблема в том, что вы расширяете Game, реализуете Screen и вызываете super.update()
.
libgdx вызовет метод render
класса Game.
Пока класс Game содержит экран и вызовметод render
текущего экрана, который вы установили с помощью setScreen()
.
Когда мы смотрим на метод render
класса Game
:
@Override
public void render () {
if (screen != null) screen.render(Gdx.graphics.getDeltaTime());
}
screen
это экран, который вы установили с помощью setScreen()
Итак, вызов Libgdx => вызов Game.render () и вызов Game.render () => Screen.render (delat float)
Теперь, когда мы смотрим на ваш код.Вы переопределяете метод: render(float delta)
, который является методом рендеринга экрана.(Метод рендеринга в Game не имеет параметров).
Итак, первый вызов libgdx Game.render();
вызывает метод рендеринга Screen1 и в конце вашего переопределенного Screen1.render (float delta);метод, вы снова вызываете функцию Game.render () с super.render();
.
, поэтому вы рекурсивно вызываете метод Screen1.render(float delta);
.По этой причине вы переполняете память.
Я рекомендую вам не расширять Game и реализовывать Screen в одном классе. Класс, который будет создан в DesktopLauncher, должен расширять Game.
В моемcase TextAdventure:
public class TextAdventure extends Game {
@Override
public void create () {
setScreen(new Screen1(this));
}
@Override
public void render() {
Gdx.gl.glClearColor(1, 1, 1, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
super.render();
}
}
А в классе Screen1 только реализует Screen и не вызывает super.render()
!:
public class Screen1 implements Screen {
Game myGame;
public Screen1(Game myGame) {
this.myGame = myGame;
}
public void changeToScreen2(){
myGame.setScreen(new Screen2(myGame));
}
...
}
Чтобы изменить Screen в Screen1, передайте класс Game вКонструктор.