我已经阅读了 libgdx 的scene2d features,包括 UI 元素,但我无法让它们工作。他们似乎都使用了皮肤对象,我该如何创建一个?
我已经完成了创建一个简单的 libgdx 游戏在桶中捕捉雨滴的精彩教程,并且我通过加载带有纹理图集的图像创建了一个简单的棋盘游戏应用程序。然而,scene2d 听起来像是控制棋盘游戏应用程序中移动棋子以及任何按钮和菜单的更好方法。
要加载皮肤,您可以从 libgdx 测试项目中使用的示例皮肤文件开始。
这个问题有更多细节,我发现我必须将文件移动到资产的子目录中以避免 HTML 版本中的错误。(如果我将文件留在资产文件夹中,我会看到一条错误消息,例如“GwtApplication:异常:读取文件数据/uiskin.json 时出错。”)
我发布了一个显示单个按钮的完整示例,有趣的代码都在游戏类中。该示例非常简单,您只需要两个成员变量来保存场景和按钮。
private Stage stage;
private TextButton button;
要创建皮肤,您只需加载数据文件。
Skin skin = new Skin(Gdx.files.internal("data/uiskin.json"));
将按钮连接到舞台。
stage = new Stage();
button = new TextButton("Click Me!", skin);
stage.addActor(button);
将监听器连接到按钮中,并注册舞台以接收事件。
button.addListener(new ClickListener() {
@Override
public void clicked(InputEvent event, float x, float y) {
button.setText("Clicked!");
}
});
Gdx.input.setInputProcessor(stage);
该render()
方法基本上是对stage.draw()
.
Gdx.gl.glClearColor(1, 1, 1, 1);
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
stage.act(Math.min(Gdx.graphics.getDeltaTime(), 1 / 30f));
stage.draw();
然后,您只需要在调整屏幕大小时对其进行布局。
button.setPosition(
(width-button.getWidth())/2,
(height-button.getHeight())/2);
如果您的屏幕更复杂,请考虑使用Table。
如果要使用不同的字体,可以使用Hiero生成字体文件和图像文件。完成此操作后,您必须获取新字体图像并使用TexturePacker将其与其他皮肤资源重新打包。
现在 Libgdx 提供了 Git 仓库来获取皮肤,你可以从:https ://github.com/libgdx/libgdx-skins 下载它,复制资产:https ://github.com/libgdx/libgdx-skins/tree/master/皮肤/visui/资产到您的项目