Skip to content

20th-centuary-meseum/uno-render

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

경희대난투

제한된 개발 환경을 가진 과거에는 각종 압축 기법들을 있는 대로 적용하여 최대한 많은 것들을 그 작은 환경에서 담아내었다. 이러한 압축의 지혜 속에서 고전 게임만의 아름다움이 드러난다. 본 프로젝트는 과거의 제한된 환경 속에서 그 시대의 감성을 살린 게임을 만드는 것이 목적이다.

실제 게임 영상

https://youtu.be/JcJlRpM3kWw

개발 환경/사용 라이브러리

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 배 빠르게 할 수 있는 이점이기도 하다. 렌더링 함수를 제작할 때 이를 최대한 이용하여 가져갈 수 있는 이점을 모두 가져가려 노력하였다.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published