Search code examples
libgdx

Every viewports acts as stretchviewport


I have a viewport and camera setup, but whenever I render, the viewport acts as a StretchViewport and fills my entire screen instead of keeping the aspect ratio and adding black bars. Does anyone know, what I am doing wrong or how to fix it?

I got this code in my GameScreen class to setup the camera and viewport:

private static final int VIRTUAL_WIDTH = 468;
private static final int VIRTUAL_HEIGHT = 293;

private OrthographicCamera camera;
private FitViewport viewport;

@Override
public void show() {
    camera = new OrthographicCamera();
    viewport = new FitViewport(VIRTUAL_WIDTH,VIRTUAL_HEIGHT,camera);
    viewport.apply();

    camera.position.set(camera.viewportWidth/2,camera.viewportHeight/2,0);
}

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

    Gdx.gl.glClearColor(0, 0, 0, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

    batch.setProjectionMatrix(camera.combined);
    batch.begin();
    // do drawing
    batch.end();
}

@Override
public void resize(int width, int height) {
    viewport.update(width,height);
    camera.position.set(camera.viewportWidth/2,camera.viewportHeight/2,0);
}

Full code:

package com.Sidescroll.game;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Screen;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.utils.viewport.FitViewport;

public class GameScreen implements Screen {

    private static final int VIRTUAL_WIDTH = 468;
    private static final int VIRTUAL_HEIGHT = 293;

    private SpriteBatch batch;
    private BitmapFont font;

    private OrthographicCamera camera;
    private FitViewport viewport;
    private int deltaCount;
    private float deltaSum;
    private float fps;

    private Level level;
    private Player player;

    @Override
    public void show() {
        level = new Level();
        player = new Player(level.getSpawn());
        batch = new SpriteBatch();
        font = new BitmapFont();
        camera = new OrthographicCamera();
        viewport = new FitViewport(VIRTUAL_WIDTH,VIRTUAL_HEIGHT,camera);
        viewport.apply();
        System.out.println(camera.viewportWidth);
        camera.position.set(camera.viewportWidth/2,camera.viewportHeight/2,0);
    }

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

        Gdx.gl.glClearColor(0, 0, 0, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        player.update(delta);

       deltaCount += 1;
       deltaSum += delta;

        if(deltaSum >= 1) {
            fps = 1/(deltaSum/deltaCount);

            deltaCount = 0;
            deltaSum = 0;
        }

        batch.setProjectionMatrix(camera.combined);
        batch.begin();
        level.draw(batch, player);
        font.draw(batch, "FPS: " + fps, 0, 293);
        batch.end();
    }

    @Override
    public void resize(int width, int height) {
        viewport.update(width,height);
        camera.position.set(camera.viewportWidth/2,camera.viewportHeight/2,0);
    }

    @Override
    public void pause() {}

    @Override
    public void resume() {}

    @Override
    public void hide() {}

    @Override
    public void dispose() {
        font.dispose();
        batch.dispose();
        level.dispose();
    }

}

Solution

  • Forgot to also call resize in the class extending game

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