【问题标题】:LibGDX - Camera scaling does not workLibGDX - 相机缩放不起作用
【发布时间】:2017-05-17 12:27:23
【问题描述】:

我对 LibGDX 有疑问。我正在尝试创建一个应用程序,为了便于使用,我想以固定分辨率 (1920x1080) 绘制所有内容。

为此,我正在尝试创建一个FitViewport 和一个OrthographicCamera,以便视口始终很好地适应屏幕尺寸,并且所有内容都会自动缩放。

在我的Screen 类中,我创建了这样一个视口和一个相机:

AbstractScreen() {
    camera = new OrthographicCamera(Constants.VIRTUAL_WIDTH, Constants.VIRTUAL_HEIGHT);
    viewport = new FitViewport(Constants.VIRTUAL_WIDTH, Constants.VIRTUAL_HEIGHT, camera);
}

(其中VIRTUAL_WIDTH 是 1920,VIRTUAL_HEIGHT 是 1080)

现在,当我尝试渲染 1920x1080 像素的图像时,只绘制了该图像的三分之一!

这是应该绘制的截图:screenshot

这是应该完全绘制的图像:image

public abstract class AbstractScreen implements Screen {

    private Viewport viewport;
    private OrthographicCamera camera;

    protected SpriteBatch spriteBatch;

    AbstractScreen() {
        camera = new OrthographicCamera(Constants.VIRTUAL_WIDTH, Constants.VIRTUAL_HEIGHT);
        viewport = new FitViewport(Constants.VIRTUAL_WIDTH, Constants.VIRTUAL_HEIGHT, camera);

        spriteBatch = new SpriteBatch();
    }

    @Override
    public void show() {
        viewport.apply();
    }

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

        camera.update();
        spriteBatch.setProjectionMatrix(camera.combined);
    }

    @Override
    public void resize(int width, int height) {
        viewport.update(width, height);
    }

    @Override
    public void pause() {

    }

    @Override
    public void resume() {

    }

    @Override
    public void hide() {

    }

    @Override
    public void dispose() {

    }
}

这是实际的屏幕实现:

class LoadingScreen extends AbstractScreen {

    private SpriteBatch spriteBatch;
    private Texture texture;

    @Override
    public void show() {
        super.show();
        spriteBatch = new SpriteBatch();
        texture = new Texture("textures/test.png");
    }

    @Override
    public void render(float delta) {
        super.render(delta);

        spriteBatch.begin();

        spriteBatch.draw(texture, 0, 0);

        spriteBatch.end();
    }
}

谢谢!

【问题讨论】:

    标签: java camera libgdx viewport scaling


    【解决方案1】:

    您的 LoadingScreen 正在创建自己的名为 spriteBatch 的 SpriteBatch,它隐藏 AbstractScreen 超类中的 spriteBatch

    所以你的LoadingScreen.render() 调用super.render(),它在AbstractScreen.spriteBatch 中设置了适当的投影矩阵,但是你使用LoadingScreen.spriteBatch 进行绘图。

    所以删除 LoadingScreen 中的 spriteBatch 字段,不要在那里实例化它。使 AbstractScreen 中的 spriteBatch 受保护,以便您可以从子类访问它。

    顺便说一句,SpriteBatches 必须放在dispose() 中,否则会泄漏内存。更好的是,不要在 Screen 内实例化 SpriteBatch。在 Game 中实例化一个 SpriteBatch 并将其传递给 Screen 的构造函数,这样所有东西都可以共享同一个实例,而不是在每次切换屏幕时浪费时间处理和实例化新实例。 SpriteBatch 是一个重物。

    【讨论】:

    • 哦,哇,这总是最简单的错误。感谢您的帮助以及其他提示!
    猜你喜欢
    • 2015-07-24
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 2011-01-03
    • 2015-05-26
    相关资源
    最近更新 更多