LibGDX - 相机缩放不起作用

LibGDX - Camera scaling does not work

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

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

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

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();
    }
}

谢谢!

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

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

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

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