제한된 개발 환경을 가진 과거에는 각종 압축 기법들을 있는 대로 적용하여 최대한 많은 것들을 그 작은 환경에서 담아내었다. 이러한 압축의 지혜 속에서 고전 게임만의 아름다움이 드러난다. 본 프로젝트는 과거의 제한된 환경 속에서 그 시대의 감성을 살린 게임을 만드는 것이 목적이다.
Aruino UNO, C++, TVout
메모리와 연산 성능이 한정되어 있기 때문에 기존의 충돌 알고리즘을 사용할 수 없다. AABB, Radius 는 각각 길이/너비, 반지름을 추가로 저장해야하고, 각 객체마다 한번씩 충돌 검사를 하기 때문에 O(n)의 시간 복잡도를 갖는다.
따라서 우리는 특정 경우에 성립하는 Map-based 충돌 알고리즘을 고안하여 O(1)안에 추가적인 메모리 를 사용하지 않고 충돌을 검사하였다. 맵 장애물과 이를 파괴하였을 때 스폰되는 아이템은 6*8 맵 배열안에 자신의 위치 좌표와 대응되도록 저장 되어있다. 캐릭터의 실제 좌표를 맵 타일의 크기인 16 으로 나누면 맵 배열 안에서의 위치를 알 수 있다. 캐릭터와 타일의 크기를 고려하여 간단한 연산을 거치면, 캐릭터 이동 방 향에 장애물/아이템이 존재하는지 검출할 수 있다.
Map-based 충돌 알고리즘은 맵 배열안에 정보가 저장되는 배경 장애물, 아이템의 충돌에 사용하였다. 배 경장애물 - 캐릭터, 배경 장애물 - 투사체, 아이템 - 캐릭터간 충돌을 검사하며, 그 외 투사체 - 캐릭터 충돌은 AABB 충돌 검사로 진행하였다.
NTSC 신호를 생성하기 위한 아두이노 TVOut 라이브러리에도 기본적인 렌더링 보조 함수들이 존재하나, 실행 속도가 더 빠른 함수들이 필요했다. 배경 Tile, 캐릭터, 투사체, 아이템, UI 와 같이 다양한 요소를 시간안에 렌더링하기 위해 각각의 특성에 최적화된 렌더링 함수들을 제작하였다.
DecodeTile 함수는 배경 타일을 렌더링하는 함수이다. 배경 타일은 좌표가 16 의 배수로 나타나며, 화면 바깥에 나가지 않는 특징이 있다. TVout 의 프레임버퍼는 용량 최적화를 위해 각 비트 하나 당 픽셀 하나가 할당되는데, 이로 인해 8bit 단위로 저장되는 특성을 지닌다. 배경 타일 좌표는 16 의 배수이므로 별다른 연산없이 빠르게 프레임버퍼에 이미지를 복사할 수 있다.
DecodeSprite 함수는 캐릭터를 렌더링하는 함수이다. 캐릭터는 배경 타일과 달리 좌표가 어떤 값이든 가질 수 있으며, 화면 바깥에 나가는 경우도 존재한다. 따라서 8bit 씩 나눠진 프레임 버퍼에 이미지를 복사하 기 위해서는 좌표를 8 로 나눈 나머지만큼 이미지에 Bitwise Shift 연산을 가하여야 한다. 화면 바깥으로 나가는 경우 또한 조건문으로 검사하여 클리핑 처리를 하였다.
위 두가지 함수를 기본 바탕으로 DecodeItem, DecodeBullet, DecodeUI, DecodeSpriteReverse 등과 같은 렌더링 함수들을 제작하였다. 렌더링 함수를 복잡하게 만드는 주 요인은 8 픽셀 단위로 저장하는 프레임버퍼의 특성이었으나, 이미지를 미리 Shift 하여 저장하는 등의 기법을 통해 극복하였다. 속도 측면에서 생각하였을 때, 8bit 씩 한번에 복사하는 특징은 렌더 속도를 8 배 빠르게 할 수 있는 이점이기도 하다. 렌더링 함수를 제작할 때 이를 최대한 이용하여 가져갈 수 있는 이점을 모두 가져가려 노력하였다.