sharksym's MSX World

sharksym.egloos.com

포토로그


구글 애드센스


스프라이트를 33개 이상 출력하려면... by sharksym

스프라이트 재사용(Sprite recycling)에 관해서 지난 ASO 게시물에 잠깐 언급했었는데요.

이번 주중에 좀 테스트를 해봤더니, 생각만큼 쉽지않더군요.


요게 뭐냐면...

MSX의 VDP는 화면에 총 32개의 스프라이트가 출력이 가능한데요. (HW 제한입니다.)

33개 이상의 스프라이트를 한 화면에 출력하는 방법입니다.

(비슷한 기술로 팔레트 재사용 기법이 있습니다~ ㅎ)


구현하는 방법은,

VDP가 스프라이트 출력시에는 매 스캔라인 마다 VRAM을 읽어서,

해당 위치에 존재하는 스프라이트를 그려주게 됩니다.

이때 이미 화면에 출력된 스프라이트의 테이터를 바꿔서,

다른 위치/모양의 스프라이트를 출력하도록 해주는 것이지요.


예를 들어 두개의 스프라이트를 좌표 (100, 20) 과 좌표 (200,100) 에 레이어 0번을 공유해서 출력하는 경우,

VDP가 화면 좌표 (100, 20) 에 스프라이트 레이어 0번에 출력이 완료된 후,

다른 좌표 (200, 100) 에 스캔라인이 도달하기 전에, 스프라이트 데이터를 바꾸면

레이어 0번에 스프라이트 두개가 나타납니다.


스캔라인 체크를 하려면 일단 BASIC의 속도로는 불가능하고요, 어셈이나 C로 코딩하면 됩니다.

VDP의 H-blank 인터럽트를 써서 타이밍 맞춰 VDP를 조작하면 되는데요,

근데, 막상 해보니, ASO 같은 슈팅게임에서 재사용 가능한 레이어를 나누고 실시간으로 처리하는게 쉽지않더군요.


각 스프라이트의 수직 위치로 판단해서 어느정도 거리가 떨어진 경우 재사용 하도록 해봤는데,

일단 동작은 합니다. 근데 코딩이 쉽지가 않더군요. ㅎ.ㅎ

화면에 64개 스프라이트를 출력하려면,

일단 기존의 스프라이트 어트리뷰트 테이블 2개를 4개로 늘려야했고,

레이어 공유가 불가능한 경우 두개의 테이블에 중복으로 어트리뷰트 설정을 해야됬었고,

특히 스크린5 모드의 멀티 컬러 스프라이트를 쓰는 경우는,

컬러 테이블(레이어 한개당 16바이트 데이터)을 매번 써야되는 방법뿐이더군요.


너무 CPU 부하가 커서, 현상태로는 ASO에 적용하는 건 보류했습니다. ㅋ

적 총알 처럼 모양과 컬러가 같은 레이어 전용으로 적용해볼까 싶네요.


현재 ASO에 구현된 스프라이트 출력은,

고전적인 스프라이트 깜박임 방식을 사용하고 있습니다.

갯수가 늘어나면, 매 프레임 출력하는게 아니라 한 프레임씩 건너 뛰는 방식이죠.

예를 들어 레이어0 스프라이트를, 홀/짝 프레임 나눠서 두개의 스프라이트를 출력하고 있습니다.


아무래도 스프라이트 재사용은,

스프라이트의 수직 위치가 서로 제한된(겹치거나 근처에 오지않는) 경우에 쓰면 좋을 것 같습니다.


예를 들어, 제비우스의 전투기와 지상 조준기 처럼, 절대 겹치지도 않고 거리도 적당히 떨어져있으면,

한 레이어로 두개 모두 출력가능하겠지용~


암튼 국딩/중딩 때는 구현해보려는 시도도 못해봤던걸... 지금에서야 해보니~ 하핫... 약간 재밌네요. ㅎ.ㅎㅋ


그리고 참고로 팔레트 재사용은,

스프라이트 레이어 대신, 팔레트 세팅을 바꿔서 한화면에 여러개의 컬러를 보여주는 방법입니다.

화면이 상단/하단으로 표시가 나눠진 게임에서 활용이 가능합니다.

싸이코 월드, 프린세스 메이커 등의 게임에서 쓰이는걸 볼수 있어요.


덧글

  • 틸더마크 2011/08/07 20:19 # 답글

    우와 그야말로 신비의 세계(...)네요. 하드웨어의 한계까지 사용하는 것도 부족해서 그 이상을
    써보려고 궁리하던 그 시절 본좌들은 정녕 외계인(...)이 틀림없습니다. 으허허.
  • sharksym 2011/08/07 21:08 #

    MSX1 용 게임들은 스프라이트 수평 제한 4개에 쉽게 걸리는 문제가 골치아팠었지요.
    스프라이트를 깜박거림(주기적 on/off)으로 처리하거나...
    아예 코나미처럼 스프라이트를 거의 안쓰는 경우가 많았습니다.

    참... 아이러니한 것이...
    애플 등 타 8BIT 컴 유저들은 MSX의 스프라이트를 많이 부러워했었는데,
    실제로 겜 만들어보면 이게 쉽지 않았다는 것이죠. ㅎ.ㅎ;

    물론, 움직이는 캐릭터가 몇개 없는 경우에는 정말 편리한 기능인건 사실입니다.
댓글 입력 영역



구글 애드센스 (작은사각형)

MSX rating

구글 애드센스 (세로 직사각형)