본문 바로가기
Dev log

[Avaratia] Devlog0

by Ladun 2021. 9. 26.

Avaritia Icon

개요

 이 게임을 개발을 시작하고 끝낸 건 2017~2018년도 쯤입니다. 근데 열심히 만든 게임이 그저 깃헙에만 있는게 아까워서 오랜 기억을 꺼내서 개발로그를 적어보려고 합니다. 이 게임을 만들게 된 계기는 시간이 꽤 지났음에도 아직도 또렷히 기억이 납니다. 그 시절 유니티와 같은 게임엔진을 공부하고 개발을 하는데 제가 게임 개발을 하는건지 유니티 사용법을 공부하는건지에 대해서 의문과 회의감이 들어서 로우한 레벨에서 게임을 만들고 싶어서 시작한 프로젝트였습니다. 그래서 이 게임은 Java에서 OpenGL과 DirectX와 같은 Graphic API를 사용하지 않고 개발한 PC Pixel Game입니다. 

 

 이 게임의 대략적인 스토리는 세상의 모든 사람이 다 좀비로 변한 세계에서 살아남기 위해서 도망치는 게임입니다. 원래는 더 큰 기획을 가지고 진행을 했지만 1인 개발이다보니 조금 축소되어서 개발이 되었습니다. 아래는 게임 플레이 영상입니다.

 

게임 플레이

게임 내부에 구현된 무기는 바주카, 권총, 샷건, 돌격소총 총 4가지 정도입니다. 아래 영상은 각 무기별 시연 테스트입니다. 이외에도 사용자의 체력을 회복시켜주는 아이템 2가지, 사용자의 이동속도를 올려주는 아이템이 추가적으로 하나 있습니다.

 

무기 시연

렌더링

 이 게임에서는 별도의 Graphic API를 사용하지 않았기 때문에 기초적인 렌더링을 직접 구현해야 했습니다. 물론 GPU programming이나 별도의 컴퓨터 그래픽스 관련 지식을 가지고 있지 않은 상태로 구현을 하다 보니 최적화 측면에서는 여러 방면으로 떨어졌지만, 간단한 2D를 표현하는 방식에 대해서는 많은 점을 배울 수 있었습니다.

인게임 스크린샷 (라이트 없음)

 위 사진을 실제 인게임 스크린샷입니다. 게임에서 렌더링을 진행하는 방식은 이미지 파일들을 하나의 스크린의 픽셀값을 가지는 배열에 값을 채워넣는 방식으로 구현이 되었습니다. 내부적으로 zDepth값을 통해서 먼저 그려져야하는 것들에 대한 우선순위를 정하고 그려지는 형식으로 UI와 게임 디자인, 게임 디자인 사이의 우선순위를 표현했습니다. 

인게임 스크린샷 (라이트 있음)

  라이트에 대해서 표현을 할 때는 라이트가 투과될 수 있냐 없냐와 같은 값을 저장해서 빛이 투과가능한지를 계산하고, 기존 픽셀값과 빛의 픽셀값을 혼합하여 표현함으로써 라이트 효과를 적용했습니다.

 이외에도 플레이어의 애니메이션을 하나의 큰 스프라이트로 받아서 스프라이트 내부의 offset값을 수정해가면서 애니메이션을 진행하는 등 직접적으로 만들는게 좋은 경험이였습니다. 다만 그래픽스 쪽의 최적화가 많이 부족하여 위와 같이 간단한 게임임에도 불구하여 그려야하는 오브젝트가 많아지면 FPS가 급격하게 떨어지는 문제가 있었습니다. 이를 해결해보려고 렌더링 과정을 따로 쓰레드로 빼보려는 시도도 해봤지만 좋은 성과는 얻지 못했습니다.

물리엔진

게임 내부의 물리엔진은 크게 두 가지로 나누어서 볼 수 있습니다. 첫번째는 맵 전체를 특정 크기의 타일들의 집합으로 간주하고, 각 타일마다 충돌판정 여부에 대한 값을 미리 이미지로 가지고 있어 이 값을 기준으로 충돌판정을 진행합니다.

 간단한 예제로 아래와 같이 72x32크기의 맵을 만든다고 할 때 아래와 같이 미리 충돌가능 영역이나 추가적인 정보에 대한 이미지를 그려놓고, 어떤 오브젝트가 타일에 들어갈 때 충돌체크를 하는 방식으로 맵에 대한 간단한 충돌판정을 진행했습니다.

충돌 맵

 두번째 방법으로는 흔히 사용하는 각 오브젝트들이 사각형의 충돌판정 정보를 가지고, 이 정보를 통해서 충돌을 계산하는 방식입니다. 복잡한 충돌 공식을 필요로 하지 않았기 때문에 회전하지 않은 두 사각형의 충돌을 판별하는 AABB 알고리즘으로 충돌에 대한 판정을 계산했습니다. 아래 이미지에서 초록, 빨강, 파란 점이 같이 있는 검은 박스가 충돌 판정 범위입니다.

Collision Box Bound

 이 게임을 개발하면서 파티클 부분을 개발할 때 렌더링 부분과 물리엔진 부분에서 성능 저하가 예측되서 두 부분을 따로 쓰레드로 빼서 진행해봤는데, 당시에는 해당부분에 대한 지식이 기초적인 수준이라 오히려 성능 저하를 가져오는 안타까운 일이 벌어져 실패했습니다.

 

마무리

  옛날에 만들었던 게임을 오랜만에 보니까 기억 속에서의 모습보다 뭔가 많이 구현되어 놀랐습니다. 이대로 쭉 개발을 했어도 괜찮은 게임이 탄생했을 거 같았습니다. 물론 이 게임은 최적화 문제로 여러모로 부족한 점이 있어서 그래픽과 게임 IP만 가지고 새로 만들어야 합니다. 이 글에서도 계속 언급했듯이 이 게임의 개발이 예상보다 빠르게 마무리되었던건 쌩 java로만 만들다 보니까 여러가지에서 한계를 느껴서입니다. 그래도 이 게임을 개발하면서 엔진의 원리를 찾아보고 적용시켜보려고 했던 시도들이 추후 엔진을 이용한 게임을 만들 때 최적화 문제 부분이나 내부적인 원리에 대해서 생각을 한 번 더 해보게 만든 계기가 되어서 좋은 게임이라고는 말하지 못하지만, 좋은 프로젝트였다고는 할 수 있습니다.

'Dev log' 카테고리의 다른 글

[JobWar] Devlog0  (0) 2021.09.26
[PolyVerse] Devlog0  (0) 2019.03.06