LibGDX - 相机缩放不起作用

时间:2017-05-17 12:27:23

标签: java camera libgdx viewport scaling

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

为此,我尝试创建FitViewportOrthographicCamera,以便视口始终与屏幕尺寸完美匹配,并且所有内容都会自动缩放。

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

谢谢!

1 个答案:

答案 0 :(得分:0)

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

因此,您的LoadingScreen.render()来电super.render(),会在AbstractScreen.spriteBatch中设置相应的投影矩阵,但之后您正在使用LoadingScreen.spriteBatch进行绘制。

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

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