2025년 7월 16일 수요일

DW의 지하실 제작 #4 - 사운드 넣기

게임이 MSX2 기본 사양(물론 VRAM은 128KB)이라, 사운드도 그냥 PSG만 사용합니다.

CPU 여유가 되면 FM도 넣어볼까 생각은 해봤었는데, 그래픽 때문에 좀 불가능할 것 같네요

BGM과 효과음도 모두 PSG만 사용하니까, 효과음 출력 시 BGM 한채널이 MUTE되는 걸 볼 수 있겠습니다!


먼저 타이틀에 쓰일 곡으로 '드뷔시 달빛'을 템포를 약간 올려서 넣었구요.

게임 메인 BGM은 '라데츠키 행진곡'입니다.

제목은 기억 못하더라도(제가 그랬...ㅋ) 곡 자체는 귀에 익으실 겁니다요 ㅎ.ㅎ


사운드 루틴은 VDP의 스캔라인 인터럽트를 활용합니다.

아무래도 V블랭크 구간에서는 그래픽 작업때문에 CPU가 바빠서 사운드 타이밍을 밀었습니다~


아래는 CPU로드 그래픽을 켠 상태이니, 참고하세요.

색칠된 스캔라인 개수가 CPU로드를 나타낸다고 보시면 됩니다.

사운드는 한 프레임 출력의 절반쯤에서 처리되고 있어요.




사운드는 딱히 설명할 부분이 없네요. 으흠...

그냥 영상으로 구경하시죠~ ㅎ.ㅎ/



그럼, 다음 편에서 뵈어요~ ㅎ.ㅎ/


2025년 7월 13일 일요일

DW의 지하실 제작 #3 - 스프라이트 구성

아시다시피 MSX의 스프라이트는 컬러코드가 4BIT입니다.

V9938의 G7(스크린8)에서는 그래픽은 RGB 8BIT 출력이 됩니다만, 스프라이트는 여전히 4BIT죠.


근데, 한가지 문제라면,

스크린8에서는 스프라이트가 16컬러로 고정되어 출력됩니다. 팔레트 레지스터의 영향을 받지않아요.

바꿔말하면 MSX1의 스프라이트랑 비슷한 색으로 나옵니다. 실제로는 EGA 16컬러에 더 가까운 듯요 ㅎ.ㅎ


암튼 잡설은 여기까지구요, 스프라이트를 만들어봅시다요!

이전 글에서 언급했지만, 플레이어는 비트맵 그래픽(16 x 24)로 구현되어 있습니다.

나머지 몬스터와 잡다 효과용 패턴만 스프라이트를 적용합니다.


먼저 그림판으로 밑그림을 그려보아요.



이제 스프라이트 데이터를 만들어야하는데요.

예전엔 주로 DD구락부를 썼지만, 이번엔 그냥 YY-CHR 프로그램을 사용했습니다. (귀찮 귀찮...ㅋ)

'2BPP MSX' 포맷으로 놓으면, 연속한 번호(짝, 홀)의 패턴 두개를 2BIT 컬러로 보여주는데요.

실제 MSX2에서는 스프라이트 OR 연산된 출력과 같은 효과를 얻을 수 있습니다. 

적 캐릭터 하나당 8개의 패턴이 필요하고, 애니메이션 효과를 위해 4배의 패턴을 그려야합니다.



참고로, 실제 VRAM에는 아래처럼 1BPP 데이터로 들어갑니다요.



VDP는 8 x 8 패턴 256개의 스프라이트를 처리합니다.

보통 게임에서는 16 x 16 패턴을 쓰니까, 64개의 스프라이트라고 보면 되겠죠?

여기서 캐릭터가 상하좌우 등의 여러가지 모습을 보여주려면, 실제 한번에 쓸 수 있는 패턴 수가 팍팍 줄어버립니다.

결국 전체 패턴 메모리를 여러벌로 쓰는 방법밖에는 없죠.


아래는 VRAM Page 0의 가용 메모리를 쪼개서 스프라이트로 할당한 모습입니다.

참고로 스프라이트 어트리뷰트도 2벌을 쓰고 있습니다. 테어링을 막는 가장 쉬운 방법이죠. 페이지 플립이요!




그럼, 실제 화면에서는 어떻게 나오는지 보아요.

애니메이션은 6프레임 당 한번씩 패턴이 바뀝니다. 바꿔말하면, 초당 10프레임으로 애니메이션이 진행됩니다.




그럼, 다음 편에서 뵈어요~ ㅎ.ㅎ/


2025년 7월 10일 목요일

DW의 지하실 제작 #2 - 그래픽(비트맵) 구성

그래픽 데이터를 만들어봅시다.

모든 스크린샷은 에뮬에서 캡쳐한 것이니 참고하시구요.


먼저 부팅 후 게임 오프닝에 나올 X-II의 모습입니다.

256 x 192 사이즈로 맞춘 비트맵입니다.




다음은 타이틀 화면에 나오는 컴컴한 지하실의 모습이네요ㅋ




스크린8에서는 VRAM 페이지 용량이 64KB입니다. 결국 2페이지로 게임 구현이 되어야합니다.

페이지 1에는 플레이어, 아이템, 배경 등에 쓰일 그래픽이 들어가겠구요.

그래픽 처리를 쉽게 할 수 있도록, 게임 화면의 백업 데이터를 남겨둡니다.




아래는 페이지 0에 표시된 게임 화면입니다. 표시영역은 256 x 192 픽셀이욤.

아래쪽에 보이지 않는 부분(256 x 64 픽셀)은 스프라이트 데이터로 쓰이겠습니다.




대충 어떤식으로 보여지는지 아시겠죠?


그럼, 다음 편에서 뵈어요~ ㅎ.ㅎ/