Libgdx:Stage仅渲染为(0,0)

时间:2014-03-02 16:15:43

标签: libgdx

我正在尝试将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

当然我做错了什么,但我现在还不知道。我会假设舞台跟随相机翻译,但似乎并非如此。欢迎任何建议!谢谢!

1 个答案:

答案 0 :(得分:1)

我认为问题在于这行代码:

stage.setCamera(controller.getCamera());

如果我正确阅读,您希望聊天窗口始终从(0,0)渲染,无论相机在屏幕上的哪个位置。如果是这种情况,那么舞台不应该与相机有任何关系,相机会四处移动,只会让舞台处于正确的位置变得更加复杂。

如果没有这行代码,您应该可以只调用

stage.act();
stage.draw();

它应该可以正常工作。