개발/기술

libgdx - Viewport

kwony 2018. 6. 22. 21:49

Viewport 정의/종류


Renderer 클래스를 통해 화면에 그려진 결과물을 게임 스크린의 크기에 맞춰 비율을 조정할 수 있는 객체다. 여러 가지 종류가 있는데 이번 포스트에서는 대표적인 세개만 다루고자 한다.


1. StretchViewport


렌더링 결과물을 화면 크기에 맞춰 재조정 해주는 객체다. 주로 윈도우 그림 파일의 가로/세로 크기를 임의 조정할 때 볼 수 있는데 글로 설명하는 것보다는 그림을 보는게 훨씬 이해하기 쉬울 것 같다.



코드상에서는 화면 중앙에 동그란 원을 그렸는데 게임 스크린의 가로 길이가 세로보다 길어 화면 비율에 맞추다보니 원이 타원형으로 보여지고있다. 사각형도 정사각형을 그렸는데 실제로 보이는건 가로가 더 긴 직사각형이다. 


2. FitViewport


화면 비율에 따른 재조정 없이 렌더링한 코드 그대로를 화면에 보여주는 객체다. FitViewport를 사용하면 위의 그림이 아래처럼 바뀌게 된다.



가로 길이가 더 긴 게임 스크린이라도 원본 코드 그대로 렌더링을 유지하고 표시할 수 없는 부분은 검은색 배경으로 남겼다. 휴대폰을 돌리지 않고 사진을 촬영했을 때 양쪽 여백이 나오는 것과 같은 원리다.


3. ExtendViewport



Fitviewport와 달리 검은 배경은 한쪽으로 몰빵한다. 왜 이런 Viewport를 만들었는지 아직 이해가 되진 않지만... 그래도 이런 Viewport가 있다는 것도 기억은 해두자 언젠간 써먹을 일이 있겠지


Viewport 사용법


Viewport는 주로 create, resize, render 함수에서 사용된다.

@Override
    public void create() {
        /// ...
        viewport = new ExtendViewport(WORLD_WIDTH, WORLD_HEIGHT);
    }

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

    @Override
    public void render() {
        // ...
        viewport.apply();
        renderer.setProjectionMatrix(viewport.getCamera().combined);
    }

각 함수에서 viewport의 역할을 간단히 정리해보자.


create() : viewport 객체를 초기화하는 작업이다. 사용하려는 Viewport의 종류에 맞춰서 선언하고 두개의 인자로 렌더링하려는 화면 크기를 전달한다.


resize() : 변경된 게임 스크린의 크기에 맞춰서 viewport의 크기도 변경해야 한다. 이때 세번째 인자로 true 값을 전달하는데 이건 렌더링한 화면의 중심으로 보겠다는 의미다. true로 설정하지 않으면 코드상에서는 열심히 그렸는데 초점은 다른데를 보고 있어 스크린상에 안보이는 경우가 발생한다.


renderer() : apply 함수로 viewport를 render 상에서 적용하고 렌더링 객체와 연결한다. 항상 잊지말고 선언하도록 하자.