如何使用libgdx正确实现对话框

我正在努力在程序中实现一个对话框。主程序不使用阶段。但是,当用户的生存时间为0时,我想弹出一个对话框,以重新启动游戏或退出游戏。

我使用以下代码为对话框创建了一个单独的类。

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>

}

第一次创建对话框时,这可以完美地工作。当点击重新启动时,游戏将重新启动(或实际上重置比分并生效)。但是,第二次用尽该对话框时,将按预期方式显示该对话框,但这些按钮将不起作用。似乎单击监听器没有第二次初始化。

我在这里做错什么吗?如果我的方法是完全错误的,我也很高兴听到它。

回答:

对话框类有点直​​觉,无需仔细研究。

这就是为什么我提供一个小的工作示例:

import com.badlogic.gdx.ApplicationAdapter;

import com.badlogic.gdx.Gdx;

import com.badlogic.gdx.graphics.GL20;

import com.badlogic.gdx.scenes.scene2d.Stage;

import com.badlogic.gdx.scenes.scene2d.ui.Dialog;

import com.badlogic.gdx.scenes.scene2d.ui.Skin;

import com.badlogic.gdx.utils.Timer;

import com.badlogic.gdx.utils.Timer.Task;

public class TestGame extends ApplicationAdapter

{

Dialog endDialog;

Skin skin;

Stage stage;

@Override

public void create()

{

skin = new Skin(Gdx.files.internal("uiskin.json"));

stage = new Stage();

Gdx.input.setInputProcessor(stage);

endDialog = new Dialog("End Game", skin)

{

protected void result(Object object)

{

System.out.println("Option: " + object);

Timer.schedule(new Task()

{

@Override

public void run()

{

endDialog.show(stage);

}

}, 1);

};

};

endDialog.button("Option 1", 1L);

endDialog.button("Option 2", 2L);

Timer.schedule(new Task()

{

@Override

public void run()

{

endDialog.show(stage);

}

}, 1);

}

@Override

public void render()

{

Gdx.gl.glClearColor(1, 0, 0, 1);

Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

stage.act();

stage.draw();

}

@Override

public void dispose()

{

stage.dispose();

}

}

每次单击“对话框”选项(选项1或选项2),结果对象都会打印在system.out(此处1L或2L,可以是任何对象)上,并在1秒后再次显示对话框。

uiskin来自libgdx测试。

为了使其更适合您的需求,您可以将结果方法更改为:

protected void result(Object object)

{

if (object.equals(1L))

{

gameScreen.setIntLives(3);

gameScreen.setIntScore(0);

System.out.println("Button Pressed");

} else {

// Goto main menut

}

};

并添加如下所示的按钮:

endDialog.button("Retry", 1L);

endDialog.button("Main Menu", 2L);


请注意,Dialog类仅实例化一次。(所以我的评论不正确)


只是为了让您了解如何使用它:

由于可以使用任何对象,因此可以使用反射:

try

{

endDialog.button("doX",

ClassReflection.getDeclaredMethod(this.getClass(), "doX"));

endDialog.button("doY",

ClassReflection.getDeclaredMethod(this.getClass(), "doY"));

} catch (ReflectionException e)

{

// TODO Auto-generated catch block

e.printStackTrace();

}

结果方法如下所示:

protected void result(Object object)

{

try

{

((Method) object).invoke(TestGame.this);

} catch (ReflectionException e)

{

// TODO Auto-generated catch block

e.printStackTrace();

}

};

现在,您只需要实现以下方法:

public void doX()

{

System.out.println("doX");

}

public void doY()

{

System.out.println("doY");

}

只是给您一些想法。

以上是 如何使用libgdx正确实现对话框 的全部内容, 来源链接: utcz.com/qa/400088.html

回到顶部