我正在尝试将LibGDX Stage用于我的GUI元素,但是我很难让它正确渲染。现在,我正在尝试在屏幕的左下角渲染一个聊天窗口。
以下是GUI对象的构造:
stage = new Stage();
stage.setCamera(controller.getCamera());
uiSkin = new Skin(Gdx.files.internal("res/gui/skin/uiskin.json"));
Table table = new Table(uiSkin);
stage.addActor(table);
table.setSize(300, 260);
table.setPosition(0, 0);
table.setFillParent(false);
table.bottom();
table.left();
table.pad(10);
lblChatLabel = new Label("", uiSkin);
lblChatLabel.setWrap(true);
final ScrollPane scroll = new ScrollPane(lblChatLabel, uiSkin);
txtChatBar = new TextField("do a chat", uiSkin);
txtChatBar.setName("txtChatBar");
table.add(txtChatBar).width(300f);
table.row();
table.add(scroll).expand().fill().colspan(4);
txtChatBar.addListener(new InputListener() {
public boolean keyDown(InputEvent event, int keycode) {
if (keycode == Input.Keys.ENTER) {
sendMessage();
// Close the chat bar
showChat = false;
return true;
}
return false;
}
});
这是我的render()方法:
Log.debug("void", "x: " + stage.getCamera().position.x + ", y: " + stage.getCamera().position.y);
stage.act();
for (Actor a : stage.getActors()) {
a.draw(spriteBatch, 1);
}
在其他地方的另一部分代码中,游戏的相机对象被转换为玩家的中心位置:
camera.translate(targetPosition.x, targetPosition.y);
camera.update();
所有人都说,聊天窗口正确呈现,但它只在0,0处这样做。我也改变了名为stage.draw()而不是单独遍历Actors,但这会导致相同的问题。以下是说明问题的屏幕截图:
http://i.imgur.com/8uz5lV6.jpg
最后,我尝试通过设置视口来手动翻译舞台,但这会导致更奇怪的问题。
float cx = controller.getCamera().getX();
float cy = controller.getCamera().getY();
float width = controller.getCamera().viewportWidth;
float height = controller.getCamera().viewportHeight;
stage.act();
stage.setViewport(width, height, true, cx, cy, width, height);
stage.draw();
图片在这里:
http://i.imgur.com/JpSLq1s.jpg
当然我做错了什么,但我现在还不知道。我会假设舞台跟随相机翻译,但似乎并非如此。欢迎任何建议!谢谢!
答案 0 :(得分:1)
我认为问题在于这行代码:
stage.setCamera(controller.getCamera());
如果我正确阅读,您希望聊天窗口始终从(0,0)渲染,无论相机在屏幕上的哪个位置。如果是这种情况,那么舞台不应该与相机有任何关系,相机会四处移动,只会让舞台处于正确的位置变得更加复杂。
如果没有这行代码,您应该可以只调用
stage.act();
stage.draw();
它应该可以正常工作。