Как перезапустить экран в LibGDX, используя методы Init()?
Я создал простую игру в LibGDX с несколькими экранами. Я хочу перезагрузить определенный экран после нажатия кнопки перезагрузки, но я не уверен, как это сделать. Я провел некоторое исследование по этому поводу, и все ответы приводят не к загрузке моих активов в show(), а скорее к методу init(), с которым я не очень знаком. Я хочу знать, как я могу перезагрузить экран, используя этот метод init(). На данный момент я поместил большую часть своей инициализации в конструктор, а некоторые были инициализированы в таких методах, как метод restartButton(). Любые другие исправления или улучшения в моем коде будут высоко оценены. Вот фрагмент моего кода:
public class LevelOneScreen implements Screen {
public MainShooter app;
private Stage stage;
private Stage stageCoin;
private Stage stageScore;
private Stage stageEnemies;
private Stage stageFX;
private Stage stageButton;
public Image aImage;
public Image bImage;
public Image cImage;
public Image dImage;
public Array<AntAnimation> AntAnimate;
public Array<CrumbAnimation> CrumbAnimate;
public Array<CoinAnimation> CoinAnimate;
public Texture firstTex;
public Texture secTex;
public Texture thirdTex;
public Texture fourthTex;
public LevelOneScreen(final MainShooter app){
this.app = app;
this.stage = new Stage(new StretchViewport(app.screenWidth, app.screenHeight, app.camera));
this.stageCoin = new Stage(new StretchViewport(app.screenWidth, app.screenHeight, app.camera));
this.stageScore = new Stage(new StretchViewport(app.screenWidth, app.screenHeight, app.camera));
this.stageEnemies = new Stage(new StretchViewport(app.screenWidth, app.screenHeight, app.camera));
this.stageFX = new Stage(new StretchViewport(app.screenWidth, app.screenHeight, app.camera));
this.stageButton = new Stage(new StretchViewport(app.screenWidth, app.screenHeight, app.camera));
AntAnimate = new Array<AntAnimation>();
CrumbAnimate = new Array<CrumbAnimation>();
CoinAnimate = new Array<CoinAnimation>();
restartButton();
levelOneBackground();
coinScore();
}
public void show() {
inputMultiplexer = new InputMultiplexer();
inputMultiplexer.addProcessor(stageCoin);
inputMultiplexer.addProcessor(stageScore);
inputMultiplexer.addProcessor(stageEnemies);
inputMultiplexer.addProcessor(stageFX);
inputMultiplexer.addProcessor(stageButton);
Gdx.input.setInputProcessor(inputMultiplexer);
}
public void levelOneBackGround(){
//code for the background
}
public void coinScore(){
//code for coinScore
}
public void restartButton(){
firstTex = MainShooter.manager.get("button.png", Texture.class);
aImage = new Image(firstTex);
stageButton.addActor(aImage);
aImage.addListener(new ActorGestureListener() {
public void touchDown(InputEvent event, float x, float y, int pointer, int button) {
// Creating new LevelOneScreen somehow affects the fps of my game.
app.setScreen(new LevelOneScreen(app));
}});
}
//some other codes like dispose, hide, etc.
}
Это редактирование является ответом на ответ, предоставленный IronMonkey, который, кажется, решает проблему, но нуждается в дополнительном коде. Проблема здесь в том, что всякий раз, когда игра перезапускается, акторы с перезапущенного экрана располагаются поверх актеров на предыдущем экране (экран перед перезапуском). Вот новый фрагмент моего кода, показывающий, как перезапустить игру, используя мой GameInit():
public void GameInit(){
levelOneBackground();
scoreInt = 0;
coinInt = 0;
}
public void levelOneBackground(){
Runnable runAntAct1 = new Runnable(){
public void run(){
antAct1();
}
};
Runnable runAntAct2= new Runnable(){
public void run(){
antAct2();
}
};
Runnable runAntAct3 = new Runnable(){
public void run(){
antAct3();
}
};
Runnable runCoins = new Runnable(){
public void run(){
coinScattered();
}
};
levelOneTexture = CoinAssets.manager.get("woodenTable.png",Texture.class);
levelOneImage = new Image(levelOneTexture);
levelOneImage.setSize(app.screenWidth,app.screenHeight);
levelOneImage.setPosition(0,0);
stage.addActor(levelOneImage);
levelOneImage.addAction(sequence(run(runAct1),delay(2f),run(runAct2),delay(2f),run(runAct3),delay(2f),run(runCoins)));
}
public void restartButton(){
//some code for the position, size, texture of the button.
restartButton.addListener(new ActorGestureListener() {
public void touchDown(InputEvent event, float x, float y, int pointer, int button) {
GameInit();}});
}
public void antAct1(){
for(int i = 1; i < 4; i++){AntAnimate.add(new AntAnimation(app));}
AntAnimate.get(1).setPosition(x,y);
stageEnemies.addActor.(AntAnimate.get(1));
AntAnimate.get(1).addAction(//some actions);
AntAnimate.get(2).setPosition(x,y);
stageEnemies.addActor.(AntAnimate.get(2));
AntAnimate.get(2).addAction(//some actions);
AntAnimate.get(3).setPosition(x,y);
stageEnemies.addActor.(AntAnimate.get(3));
AntAnimate.get(3).addAction(//some actions);
}
public void antAct2(){
//almost the same with antAct1()
}
public void antAct3(){
//almost the same with antAct1()
}
public void coinScattered(){
//almost the same with antAct1()
}
1 ответ
show() вызывается автоматически при первом показе экрана.
Метод init () - это тот, который вы создаете сами. Вы можете называть это как хотите. Вы не должны загружать все ресурсы в init (), просто установите все, оценка = 0, player.setPosition(0,0) и т. Д.
Поэтому, когда вы впервые вызываете init (), вы устанавливаете все переменные. Когда вы снова вызываете init (), вы устанавливаете их снова. (переустановлено)
После редактирования вопроса:
В методах, вызываемых из GameInit (), вы загружаете файлы, которые уже загружены, и добавляете актеров на этапы, где эти актеры уже есть и, следовательно, теперь перекрываются. Вы также добавляете действия и создаете объекты, уже созданные.
Все, что должен делать GameInit () - это устанавливать значения для уже созданных объектов. Итак, в основном:
private void GameInit(){
AntAnimate.get(1).setPosition(x,y);
AntAnimate.get(2).setPosition(x,y);
AntAnimate.get(3).setPosition(x,y);
levelOneImage.setPosition(0,0);
scoreInt = 0;
coinInt = 0;
}
Загрузка и создание объектов не должны выполняться более одного раза. Попробуйте просто добавить мой метод GameInit (), назовите его GameReset() и вызовите его с помощью кнопки сброса.