gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 19:32:30 25 4
gpt4 key购买 nike

我正在努力在我的程序中实现一个对话框。主程序不使用舞台。但是,当用户的生命为 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;
}
}

在渲染方法中我绘制舞台

if(intLives == 0) {
dlgGameOver.getStage().draw();
} else {
//<rest of normal update code follows here>
}

这在第一次创建对话框时非常有效。当点击重新启动时,游戏将重新启动(或实际上重置分数和生命)。然而,当您第二次用完生命时,对话框会按预期显示,但按钮将不起作用。不知何故,clicklistener 似乎没有第二次初始化。

我在这里做错了什么吗?如果我的方法完全错误,我也很乐意听到。

最佳答案

如果不仔细看,Dialog 类有点不直观。

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

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();
}
}

每次点击Dialog选项(option 1或option 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");
}

只是给你一些想法。

关于java - 如何使用 libgdx 正确实现对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33062574/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com