1. 게임을 만들다




제비뽑기 용도로 흔히 사용하는, 사다리타기라고 하는 소박한 게임의 프로그램을 구현해 봤습니다.


이것을 만든 계기는 최근 티스토리 초대장 배포에 사용한 추첨 방식, 사다리타기에 대한 관심입니다.


(코코넛냠냠의 모든 행동의 동기부여 내지 원동력은 주로 호기심 같은 것들에서 비롯된다고 합니다.)


2018/08/12 - [초대장] - 티스토리 초대장을 나눠 드립니다 (其2) - 결과


이 때 구현했던 프로그램에서 프레임율을 높이고 몇 가지 반짝거리는 효과를 추가해서 배포할 수 있을 정도로 다듬은 것이 지금의 버전입니다.


2. Pixel


모든 그래픽은 OpenGL 기반의 Pixel이라는 2D 게임 라이브러리를 이용해서 구현했습니다.


Pixel은 GLFW의 확장 같은 것인데, 2차원 벡터나 3D 게임 개발에 쓰는 변환 행렬 따위의 개념을 적용해서 2D 그래픽 처리를 할 수 있게 해 주는 것이 특징입니다.


벡터랑 행렬 다룰 때 그 무슨, 역행렬, 아핀 변환, 정규화 어쩌고 저쩌고 하는 기본적인 산술 정도는 간편하게 할 수 있도록 여러 가지 편리한 도구들이 들어있습니다.


그리고 도형, 스프라이트, 텍스트 등을 상태머신을 통해서 그림으로 그려 넣어서, 그래픽 버퍼에 저장해 두고, 필요할 때마다 도장 찍듯이 화면에 뿌려 내는 그런 원리로 동작한답니다.

Pixel이라는 라이브러리가 추상화가 잘 되어 있어서, 쓰면서 OpenGL API나 GLFW 객체에 직접 접근하는 일은 거의 없었습니다.

다만, GL로 만들어진 창이 리사이즈되는 때에 호출되는 콜백 등, Pixel 클래스만으로 할 수 없는 세부적인 조작들이 종종 있습니다.


그래서 꼭 그런 것을 하고 싶을 때만, 메모리를 직접 읽는다고 하는 핵을 써 가면서 private 변수에 강제로 접근하고 GLFW 함수를 손수 호출해 주었습니다.


그런 흔치 않은 몇 가지 경우를 제외하면, Pixel이가 전반적으로 기능이 충실하고, 간단한 2D 게임 개발용으로 무리 없이 쓸 만한 프레임워크인 것 같습니다.


3. 구현한 것


여러가지를 손수 구현했답니다.


먼저는 사다리의 데이터 구조랑 길 찾기 알고리즘을 나름대로 디자인했습죠.


그리고 게임 화면의 시점을 정하기 위해서, 게임과 화면의 크기를 디자인하고, 카메라도 만들었습니다.


카메라가 있으니, 월드 변환 행렬이랑 그 역 변환부터 구현하고, 카메라의 조작시 XY 좌표축 이동, 줌인/줌아웃, 회전 등을 선형 보간을 통해서 부드럽게 한다던가 하는 식으로 간단한 물리도 만들어 주었어요.


기본적인 메시지 루프랑 이벤트 처리 루틴을 만들고 그 안에서 작동하는 델타 타임 계산기를 구현했습니다.


그래서 이런저런 이펙트랑 애니메이션이 델타 시간에 맞추어서 프레임마다 하나하나 업데이트할 수 있도록 만들어 주고 스레드 안전을 위한 상호배제도 추가했습니다.


그러면서 몇 번 리팩토링하고, 자잘한 효과도 한두 개 더 만들고, 바이너리에 리소스 새겨 넣고 불러오기, 대화상자, JSON 로드, 음악 재생 등 이것저것 덧붙였더니, 이거 계속 깊게 파고 들면 밑도 끝도 없겠구나 하는 생각이 들면서 대충 마무리가 되더군요.


4. 게임 특징


1) 기본 기능


제비뽑기를 위한 무작위 형태의 사다리를 생성하고 길을 찾아 주는 것이 전부입니다.


이 때 참가자의 수나, 건널 수 있는 다리와 계단의 갯수 따위를 무제한으로 설정할 수 있습니다.


그 설정을 메모장 등의 텍스트 에디터로 쉽게 편집할 수 있는 JSON 형식의 파일로 저장해 두었다가, 게임의 로드 때에 불러올 수 있습니다.


그밖에 전체화면 모드로 전환하거나 창의 경계를 붙잡고 드래그해서 그 크기를 리사이즈하는 등의 조작으로 변경될 수 있는 여러 가지 해상도를 지원합니다.


2) 호환성의 높음 (크로스 플랫폼)


우선은 데스크탑 타겟이기는 한데, OpenGL 기반인데다가 Win32, 리눅스 GUI, 코코아 API를 모두 지원하고 있어서, 윈도우즈랑 리눅스랑 맥 전부 잘 돌아갈 거에요.


윈도우즈랑 리눅스에서는 일단 잘 실행되는 것을 확인했지만 맥은 가진 것이 없어서 빌드를 못해 봤습니다.


전체 코드는 거의 순수한 Go언어로 작성되었으므로, 가벼우며 모든 플랫폼에서 컴파일할 수 있고 빌드가 매우 빠르고 손쉽다는 장점이 있습니다.


최종 생성되는 바이너리(실행 파일)가 작고 부담이 없습니다.


OpenGL 3.3 이상이라는 요구사항만 충족하면 바로 실행되니까, 플랫폼 의존성이 낮은 편입니다.


3) 쓸 데 없이 사양을 요구함


단점인데, 작은 사다리일 때는 괜찮지만 이게 다리도 많아지고 좀 커지면 메모리(램)랑 내장 그래픽 자원을 엄청나게 잡아먹습니다.



많은 다리라는 것은 지금 내가 사용하는 노트북을 기준으로 2만 개 정도로, 참가자가 단지 열 명이나 스무 명이나 하는 그 정도 내외라면 성능이 별로 문제는 되지 않을 것입니다.


그래서 제대로 하려면 고쳐야겠지만, 귀찮아서 그냥 방치해 둔 상태입니다.


5. 배포


실행 파일 다운로드 링크

- v0.1 윈도우즈용

- v0.1 리눅스용



프로그램 소스 코드 및 부연설명

https://github.com/NaniteFactory/amidakuji



Top