我在实现程序的对话框方面遇到了困难。主程序没有使用舞台。但是当用户生命值为0时,我想弹出一个对话框,让用户选择重新开始游戏或退出游戏。
我使用以下代码创建了一个独立的 Dialog 类。
public class GameOver {
//dialog game over
private Dialog dlgGameOver;
private Skin skin;
private Stage stage;
private TextButton btnMain;
private TextButton btnTryAgain;
private GameScreen gameScreen;
public GameOver(final GameScreen gameScreen){
//create the game over dialog
this.gameScreen = gameScreen;
skin = new Skin(Gdx.files.internal("uiskin.json"));
dlgGameOver = new Dialog(" ",skin);
stage = new Stage();
btnMain = new TextButton("Main", skin);
btnTryAgain = new TextButton("Try Again", skin);
dlgGameOver.text("Game over!");
dlgGameOver.button(btnTryAgain);
dlgGameOver.button(btnMain);
dlgGameOver.show(stage);
btnMain.addListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
System.out.println("Button Pressed");
}
});
btnTryAgain.addListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
gameScreen.setIntLives(3);
gameScreen.setIntScore(0);
System.out.println("Button Pressed");
}
});
Gdx.input.setInputProcessor(stage);
}
public Stage getStage() {
return stage;
}
}
主游戏界面不使用舞台。在更新方法中,如果生命值为0,则创建GameOver类。
if(intLives == 0) {
if(!boolGameOver) {
dlgGameOver = new GameOver(this);
boolGameOver = true;
} else if(intLives !=0) {
boolGameOver = false;
}
}
在render方法中,我绘制了舞台。
if(intLives == 0) {
dlgGameOver.getStage().draw();
} else {
//<rest of normal update code follows here>
}
第一次创建对话框时,这个功能完美运行。当点击重新开始时,游戏将重新开始(或者实际上是重置得分和生命)。然而,第二次你没有生命时,对话框会像预期的那样显示,但按钮不起作用。不知何故,第二次似乎未初始化clicklistener。
我在这里做错了什么根本性的事情吗?如果我的方法完全错误,我也很乐意听到它。