VerticalGroup未使用OrthographicCamera显示元素

时间:2019-05-21 16:00:26

标签: libgdx

我是libgdx的新手,我正在尝试在 VerticalGroup 上使用 ImageButtons 创建菜单。没有 VerticalGroup ,图像将按预期显示,但我无法滚动它们( ScrollPane 接受一个孩子)。将图像包装在 VerticalGroup 中会使图像消失。我怀疑由于坐标/单位的某些不匹配,它们被渲染到了屏幕之外的某个地方,但是我无法将手指放在上面。

下面的代码是一个最小的,可复制的示例。对于上下文,实际应用程序使用多个屏幕。第一个屏幕用作菜单,其余屏幕每个都有一个小游戏。所有屏幕(包括菜单)都扩展了基本屏幕类,该类定义了舞台和正交摄影机。我按照https://xoppa.github.io/blog/pixels/上的说明将相机配置为使用自定义单位。但是由于某种原因,我找不到如何与小部件协调的方法。


public class MyGdxGame extends Game {

    @Override
    public void create() {
        setScreen(new MyScreen());
    }

    private static class MyScreen implements Screen {

        private final static float VIRTUAL_HEIGHT = 4f;//world height is 4m

        private OrthographicCamera cam;
        private Stage stage;


        public MyScreen() {
            cam = new OrthographicCamera();
            stage = new Stage(new ScreenViewport(cam));
            Gdx.input.setInputProcessor(stage);

            Texture texture = new 
            Texture(Gdx.files.internal("some/image.png"));
            Image image = new Image(texture);
            image.setPosition(0, 0);
            image.setSize(1, .5f);

            //this works (the image appears in the bottom left corner)
            stage.addActor(image);

            //if I comment the above line and enable the next one, it stops working (all I can see is the white background with no image)
            //stage.addActor(wrapInVerticalGroup(image));
        }

        private VerticalGroup wrapInVerticalGroup(Actor actor) {
            VerticalGroup verticalGroup = new VerticalGroup();
            verticalGroup.addActor(actor);
            return verticalGroup;
        }

        @Override
        public void render(float delta) {
            Gdx.gl.glClearColor(1, 1, 1, 1);
            Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
            stage.draw();
        }

        @Override
        public void resize(int width, int height) {
            cam.setToOrtho(false, VIRTUAL_HEIGHT * width / (float) height, VIRTUAL_HEIGHT);
        }

        @Override
        public void show() {
        }

        @Override
        public void pause() {
        }

        @Override
        public void resume() {
        }

        @Override
        public void hide() {
        }

        @Override
        public void dispose() {
            stage.dispose();
        }
    }
}

编辑

根据@second的建议,我添加了一个对 verticalGroup.pack()的调用,并使用了更大的 VIRTUAL_HEIGHT 进行了播放,这确认了我正在渲染图像在屏幕之外。

pack()之前添加 verticalGroup.setScale(0.01f); ,并将 VIRTUAL_HEIGHT 保留为原始值4会产生大约与没有 VerticalGroup 的版本具有相同的结果(即,图像显示在屏幕的左下角)。

更新后的代码

        private VerticalGroup wrapInVerticalGroup(Actor actor) {
            VerticalGroup verticalGroup = new VerticalGroup();
            verticalGroup.addActor(actor);
            verticalGroup.setScale(0.01f);
            verticalGroup.pack();
            return verticalGroup;
        }

所以问题是:如何添加垂直组并仍然保留图像的大小和位置?

0 个答案:

没有答案