Lobsters

Making a game for the GBA and PC from the same codebase

GBA와 PC용 게임을 같은 코드베이스로 만들기

개발자는 GBA·e-Reader용 게임 Eridin을 PC판과 함께 개발하고 있습니다. e-Reader 카드 제조 실패를 대비하면서 C 기반 엔진에 플랫폼별 API 구현을 나눴고, PC판에는 같은 240×160 화면 구성 위에 고해상도 렌더링과 부드러운 스크롤을 더합니다.

AI 요약

개발자 Matt Greer는 세 번째 e-Reader 개발 프로젝트로 판타지 턴제 전략 게임 Eridin을 만들고 있습니다. 이번에는 GBA·e-Reader판만 출시하지 않고 PC판도 같은 코드베이스에서 함께 개발합니다. e-Reader 카드 제조가 계속 불안정하기 때문에 한 플랫폼에만 출시를 걸지 않으려는 선택입니다.

카드 제조 문제를 피하기 위한 PC판

첫 번째 e-Reader 게임에서는 카드를 안정적으로 인쇄하는 업체를 찾았지만, 다음 게임 Pixel Pup에서 상황이 달라졌습니다. e-Reader 버전을 완성하고 카드까지 제작한 뒤, 인쇄 업체가 하드웨어와 소프트웨어 장비를 바꾸면서 카드가 더 이상 제대로 스캔되지 않았습니다. 결국 e-Reader판 출시를 취소하고 Pixel Pup을 일반 GBA 게임으로 출시했습니다.

e-Reader 카드는 일반 인쇄물보다 훨씬 정밀하게 만들어야 합니다. 판매 가능한 품질과 스캔 성능을 동시에 맞추려면 여러 차례 테스트가 필요하지만, 인쇄 업체 입장에서는 소량 주문인 게임 카드에 큰 작업 비용을 쓰기 어렵습니다. 개발자는 미국 전역의 인쇄 업체 약 12곳에 문의했지만, 원하는 조건을 맡겠다는 곳을 찾지 못했습니다.

그래도 e-Reader만 가능한 방식으로 게임을 만들고 싶었기 때문에 Eridin 개발을 시작했습니다. 카드 제조 방법을 계속 찾으면서 PC판도 병행합니다. 카드 생산에 실패하면 PC판만 출시할 수 있도록 위험을 분산한 셈입니다. 다만 PC판에서 e-Reader의 카드 스캔을 단순히 흉내 내면 번거로운 장식처럼 보일 수 있으므로, 두 버전에서 모두 자연스럽게 작동하는 게임 구조를 찾고 있습니다.

C 엔진과 플랫폼별 API

GBA 쪽은 DevKitPro와 libtonc를 사용해 C로 작성하고, PC 쪽은 SDL2를 사용합니다. 출발점은 Pixel Pup에서 만들었던 엔진입니다. 기존 엔진을 분리해 API 계층을 만들고, e-Reader 자체에 게임용 API가 내장된 점에서 설계 아이디어를 얻었습니다.

예를 들어 스프라이트를 불러오는 함수와 핸들 반환 방식은 공통 헤더에서 정의합니다. 실제 구현은 플랫폼별 파일로 나눕니다. GBA 구현은 타일 데이터를 VRAM에 넣고 팔레트를 설정한 뒤 OAM 엔트리를 구성합니다. SDL2 구현은 스프라이트 목록에 항목을 추가하고 텍스처를 불러옵니다. 원문에 제시한 코드는 실제 코드가 아니라 구조를 보여주는 단순화된 예시입니다.

각 플랫폼의 Makefile은 공통 소스와 플랫폼 전용 소스를 함께 빌드합니다. 스프라이트, 배경, 폰트, 오디오처럼 기본 기능을 API로 정리한 뒤에는 엔진 대부분을 플랫폼과 무관하게 유지할 수 있었습니다. 현재 게임 코드에서 플랫폼 전용 파일은 일부에 그치며, 개발 초기인 만큼 앞으로 달라질 가능성은 남아 있습니다.

같은 GBA 화면 구성, 다른 렌더링 품질

PC판도 GBA의 240×160 해상도를 기본 화면 크기로 유지합니다. 다만 현대 모니터에서 우표처럼 보이지 않도록 화면을 크게 확대합니다. 원문에 나온 영상은 1200×800으로 렌더링하며, 확대 배율은 바꿀 수 있습니다. 전체적인 인상은 Pipistrello and the Cursed Yoyo처럼 GBA 미학을 따르는 현대 게임에 가깝습니다.

PC판에는 편의 기능과 그래픽 효과를 더합니다. 대표적인 차이는 스크롤 방식입니다. GBA판은 60fps 제한과 하드웨어 특성 때문에 맵이 다소 끊겨 움직이지만, PC판은 더 높은 해상도에서 서브픽셀(subpixel) 위치를 사용해 움직임을 부드럽게 처리합니다. PC판은 60fps에 묶이지 않고 컴퓨터가 처리할 수 있는 프레임 속도로 렌더링하므로 애니메이션과 조작감도 더 매끄럽습니다.

개발자는 두 플랫폼의 프레임 속도 차이를 일반적인 개발 과정에서 최대한 감추는 데 집중했다고 설명합니다. PC판이 단순히 GBA판을 확대하는 데 그치지 않으면서도, 화면 구성과 미학은 GBA 게임처럼 유지하려는 방향입니다. 고전 게임의 감각을 현대적인 렌더링 환경에서 재현하는 REKKR을 비슷한 사례로 들었습니다.

원문: mattgreer.dev / 번역·요약: Trawling