Search

'libgdx'에 해당되는 글 3건

  1. 2018.06.22 libgdx - Viewport
  2. 2018.06.22 libgdx - Renderer
  3. 2018.06.20 Libgdx - 소개 및 주요함수 정리

libgdx - Viewport

컴퓨터공부 2018.06.22 21:49 Posted by 아는 개발자

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 상에서 적용하고 렌더링 객체와 연결한다. 항상 잊지말고 선언하도록 하자.

'컴퓨터공부' 카테고리의 다른 글

jupyter notebook 소개  (0) 2018.08.04
URI (Uniform Resource Identifier)  (0) 2018.07.02
libgdx - Viewport  (0) 2018.06.22
libgdx - Renderer  (0) 2018.06.22
Libgdx - 소개 및 주요함수 정리  (0) 2018.06.20
objdump 를 이용한 바이너리 깨보기  (0) 2018.05.29

libgdx - Renderer

컴퓨터공부 2018.06.22 21:12 Posted by 아는 개발자

ShapeRenderer


컴퓨터 그래픽 소프트웨어에서 '렌더링'은 이진화된 데이터를 컴퓨터 내에 영상을 만들어내는 과정을 뜻한다. 게임 엔진인 libgdx에서도 렌더링 개념을 사용하며 객체 지향적인 관점으로 활용하기 위해 ShapeRenderer라는 클래스를 만들었다. ShapeRenderer 는 화면을 그리기 위한 객체로 개발자가 만들어둔 데이터를 다양한 API를 이용해화면에 출력해주는데 사용된다.

    ShapeRenderer renderer;
    @Override
    public void create() {
        renderer = new ShapeRenderer();


실제 클래스의 내부를 보면 public으로 선언된 함수가 많은데 이중 대부분이 화면에 그리기 위해 사용 할 수 있는 API 들이다. 목적에 따라서 함수를 세가지 종류로 나눌 수 있을 것 같다.


1. 도형함수

public void point (float x, float y, float z) {}
public final void line (Vector3 v0, Vector3 v1) {}
public void rectLine (Vector2 p1, Vector2 p2, float width) {}
public void arc (float x, float y, float radius, float start, float degrees, int segments) {}
public void circle (float x, float y, float radius, int segments) {}

말 그래도 도형을 그리는 함수다. 상위 렌더링 클래스(ImmediateModeRenderer)로부터 받은 기본적인 렌더링 함수를 확장해(점하나 찍는 기능밖에 없지만) 기본적인 도형을 그릴 수 있는 함수로 만들었다. 함수명을 통해서 대강 무슨 기능을 하는지 짐작 할 수 있을 것이다.


강의 들을 때는 이것 만으로도 과제를 다 할 수 있었는데 실제 개발 할 때는 턱없이 부족할 것 같고 새로운 클래스를 만들어 위 도형 함수를 추상화해야 캐릭터도 만들고 배경도 만들 수 있을 것 같다. 정말 순수한 코딩이 많이 필요한 게임 엔진 인 것 같다.


2. 세팅함수

public void setColor (Color color) { };
public void setProjectionMatrix (Matrix4 matrix) { }
public void setTransformMatrix (Matrix4 matrix) { }
public void set (ShapeType type) { }

세팅함수에서는 도형을 그리기 전에 어떤 색으로 그릴 것인지(setColor), 도형 내부 공간은 채울 것인지 말것인지(set) 그리고 만든 완성물을 무엇으로 볼 것인지(setProjectionMatrix, setTransformMatrix)를 결정한다. setProjectionMatrix, setTransformMatrix 함수 모두 인자로 Matrix인데 이 변수는 유저가 게임을 바라보는 시선 결정한다고 보면 될 것 같다. 


3. 시작/종료 함수

    public void render(float delta) {
        shapeRenderer.begin();
        // ...
        shapeRenderer.end();

렌더링의 시작과 끝을 알리는 함수다. begin 함수는 지금부터 이 객체를 이용해서 렌더링을 하겠다는 의미고, end 함수는 이 객체의 렌더링을 끝낸다는 의미다. begin 함수 전이나 end 이후에는 renderer 함수를 호출해도 그림이 그려지지 않으니 주의하도록 하자. 


'컴퓨터공부' 카테고리의 다른 글

URI (Uniform Resource Identifier)  (0) 2018.07.02
libgdx - Viewport  (0) 2018.06.22
libgdx - Renderer  (0) 2018.06.22
Libgdx - 소개 및 주요함수 정리  (0) 2018.06.20
objdump 를 이용한 바이너리 깨보기  (0) 2018.05.29
그래픽 소프트웨어, 라이브러리 정리  (0) 2018.05.06

Libgdx - 소개 및 주요함수 정리

컴퓨터공부 2018.06.20 20:52 Posted by 아는 개발자

Libgdx는 오픈소스로 운영되는 게임엔진이다. 주로 2D용 게임을 개발하는데 사용하며 Mac과 Windows에서만 사용할 수 있는 Unity와는 다르게 Ubuntu 환경에서도 사용할 수 있어 개발하기 편리하고 개발한 코드가 Android, IOS, Desktop 환경에서도 동시에 사용 할 수 있는 cross platform 툴이다. 다만 Unity처럼 강력한 GUI 기능을 제공하지는 않고 직접 코드를 이용해서 일일이 그리는 원시적인 방법을 채택해 초심자들에겐 어려울 수 있으나 반대로 생각하면 무거운 기능을 줄이고 가능한 가볍게 만들었기 때문에 성능이 좋고 새로운 기능을 자신의 입맛에 맞게 추가 할 수 있어 능숙한 개발자들에겐 높은 자유도를 주기도 한다.


공식 홈페이지에 올라온 libgdx 게임은 아래와 같은 것들이 있다. 아마 우리나라 사람들은 대부분 모르는 게임들이다


링크를 클릭하면 더 많은 게임을 볼 수 있다. 


처음 게임을 만들려고 할때는 간단히 Unity를 이용해서 만들려고 했으나 대부분의 개발을 Ubuntu로 하고 있는 현재 컴퓨터에 Unity를 설치할 수가 없고 하루 내일 하고 있는 윈도우 10 노트북에다가 설치할 수 없는 관계로 반강제적으로 libgdx를 채택했는데 생각보다 공부하는 과정은 재밌었다. 오랜만에 수학 공간 도형과 물리 공식을 써보니까 고등학교 추억도 새록새록 나는 것 같기도 하고 또 이론으로만 배웠던 것들을 실제로 시뮬레이션 해보니 신기하기도 했다. 역시 수학/물리 이론은 현실 세계를 반영한 것이었어!


운좋게도 udacity에서 libgdx 강의가 있어 인터넷 블로그 돌아다니며 삽질하는 시간을 줄이고 체계적으로 배울 수 있었다. 강의는 무료인데 듣다보면 왠만한 유료 강의보다 훨씬 좋아서 돈내고 들어야할 것 같은 죄책감이 든다. 혹시나 libgdx에 대해서 공부하고 싶은 분은 꼭 이 강의를 통해 시작하길 바란다. libgdx를 이용해 점, 선을 그리는 것부터 똥피하기 게임을 만드는 것 까지 배울 수 있다. 강의 주소 링크 


사진 속 아저씨 두분이 강사인데 오른쪽 아저씨는 매 class 마지막에 등장해 경험담만 풀어주고 수업은 왼쪽 아저씨가 다한다.


공부한 걸 복습을 위해 Libgdx의 주요 함수들을 정리해보자. libgdx도 안드로이드의 Activity 처럼 기본적으로 채워줘야 하는 오버라이드 함수가 있다. 기본적으로 사용되는 ApplicationListener 인터페이스의 오버라이드 함수를 살펴보자.

    @Override
    public void create() {    }
    @Override
    public void resize(int width, int height) {    }
    @Override
    public void dispose() {    }
    @Override
    public void render() {    }
    @Override
    public void pause() {    }
    @Override
    public void resume() {   }

각 함수의 성질은 안드로이드의 오버라이드 함수랑 비슷하다. 간단히 정리해보자.

  • create() : 이름에서도 짐작 할 수 있듯이 게임이 만들어 질 때 기본적으로 불리는 함수다. 안드로이드의 onCreate()와 같다. 클래스의 변수를 초기화하는데 사용된다.
  • resize(int width, int height) : 게임의 크기가 변할 때 실행되는 함수며 이때 전달 인자인 width와 height는 변경되는 게임 스크린의 크기다. 게임 개발을 안해본 사람들은 크기가 변하면 무슨일을 해야할 지 감이 안올 것이다. Libgdx에서는 주로 이 함수에 viewpoint라는 변수를 재정의 해주는데 이건 다음 포스트에서 정리해야겠다.
  • dispose(): 메모리가 부족할 때 불리는 함수다. 게임 실행중에 특정 변수가 불필요하게 메모리를 많이 잡고 있다면 dispose 함수 내에서 처리해주도록 하자.
  • render(): Libgdx에서 가장 중요한 함수다. 이 함수는 1초에 60번 불리며 실제로 화면을 그려주는 일을 담당한다. 60fps를 적어도 보장하려는 모양이다. 개발자는 이 함수에 자신의 그림을 그린다.
  • pause(): 안드로이드의 onPause()처럼 게임이 중간에 멈추거나 종료될 때 불리는 함수다.
  • resume(): 이것 또한 안드로이드의 onResume()처럼 Pause 상태에서 다시 시작 될 때 불리는 함수다.

이 외에 인터페이스에서도 별도의 오버라이드 함수가 있으나 성격은 위의 함수를 크게 벗어나지 않는다. 이걸 보니까 플랫폼이 애초 객체 지향적 관점으로 설계됐다면 안드로이드든 libgdx든 어디든 통용되는 지식이 있는 것 같다. 공통된 감각을 가지고 있으면 어디든 적용하는건 어렵지 않을 것 같다.

'컴퓨터공부' 카테고리의 다른 글

libgdx - Viewport  (0) 2018.06.22
libgdx - Renderer  (0) 2018.06.22
Libgdx - 소개 및 주요함수 정리  (0) 2018.06.20
objdump 를 이용한 바이너리 깨보기  (0) 2018.05.29
그래픽 소프트웨어, 라이브러리 정리  (0) 2018.05.06
Yocto 내부 파일 분석  (0) 2016.10.02