簡體   English   中英

LibGDX-相機縮放不起作用

[英]LibGDX - Camera scaling does not work

我對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)

現在,當我嘗試渲染1920x1080px的圖像時,只繪制了該圖像的三分之一!

這是應該繪制的屏幕截圖屏幕截圖

這是應該完全繪制的圖像

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隱藏 spriteBatch在AbstractScreen超。

因此,您的LoadingScreen.render()調用super.render() ,它在AbstractScreen.spriteBatch設置了適當的投影矩陣,但是隨后您正在使用LoadingScreen.spriteBatch進行繪制。

因此,請刪除LoadingScreen中的spriteBatch字段,不要在spriteBatch實例化該字段。 使AbstractScreen中的spriteBatch受保護,以便您可以從子類訪問它。

順便說一下,必須將SpriteBatches放在dispose()否則您將泄漏內存。 更好的是,不要在屏幕內實例化SpriteBatch。 在您的游戲中實例化一個SpriteBatch並將其傳遞給Screen的構造函數,以便所有內容都可以共享同一實例,而不是在每次切換屏幕時浪費時間來實例化和實例化新實例。 SpriteBatch是重物。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM