2024년 2월 21일 수요일

TapTapRevolution 제작 #2 - 화살표를 넣으려면?

화살표(노트)를 그려넣고 스크롤 하는 것 자체는 V9938의 비트맵 전송커맨드와 수직스크롤을 쓰면 됩니다.

근데 화살표를 어디에 그려야하는지 먼저 알아야되잖아요? ㅎ.ㅎ


DDR에서는 노트 타이밍(박자)에 맞춰 화살표가 그려집니다.

실제로는 한화면 스크롤이 된후 상단에 왔을 때가 정 타이밍이니까, 미리 그려야겠죠?


먼저 이 노트 데이터를 만들기 위해, 간단한 프로그램을 하나 만듭니다.

목적은 원곡이 플레이되는 모습을 그대로 영상으로 캡쳐해서 그래픽을 분석하는 것이죠.


노트 타이밍은 정박자, 1/2박자, 1/3박자 등으로 나오게 되는데요.

일단 간단하게 정박자, 1/2박자를 쓰는 곡으로 골라봅니다.

DDR하면 제일 먼저 떠오르는 노래? '버터플라이이' 아이아이야~~ㅋ


플스용 DDR에는 연습메뉴가 있어서, 배경의 춤추는 아자씨(?) 없이 노트값만 쉽게 볼 수 있어요.





아래처럼 각 프레임에서 노트가 적중(!)하는 타이밍을 디텍션해서 해당 화살표값을 테이블로 만듭니다.




좌,하,상,우 각각 1비트로 표시하면, 더블 모드(1P+2P) 노트를 다 넣어도 8비트(1바이트)면 충분하군요.

반(1/2)박자 처리를 위해 BPM을 두배로 계산해서 테이블로 만들어둡니다.

툴을 구동하면 노트정보를 텍스트로 보여준 후 테이블값만 파일로 저장합니다.




B0036 = L  R [90]  <-- 36 BEAT(x2 박자)에 L R 노트가 나온다는 의미입니다. [90]은 테이블에 저장될 HEX 값이구요.



그럼, 이 데이터로 화살표를 그려보아요~ ㅎ.ㅎ


24 x 24 사이즈의 비트맵을 복사해서 그리는 것이라서 CPU, VDP에 부담이 조금 됩니다만,

박자 간의 여유가 있으니 로드(부하)를 잘 분산하면 큰 무리없이 그려낼 수 있습니다요.




참고로, 테두리 컬러(빨강, 파랑, 초록 등)로 나오는 부분은 각 루틴에서 CPU를 점유하는 시간을 나타냅니다.

VDP가 1프레임을 출력하는 동안이죠.

여담이지만, 넌인터레이스 60Hz 모드로 출력중이니까 총 스캔라인은 262개입니다.

에뮬에서 보이는 것 보다는 조금 더 많습니다요.

현재 CPU IDLE은 30~40% 정도 될 것 같네요. (스샷에 노란색으로 표시해놨슴다)


화살표 색깔이 다른 놈(?)은 반박자 노트입니다.

오리지널 DDR에서도 저렇게 다른색으로 보여주고 있어요. 플레이어가 실수하지 않게~ ㅎ.ㅎ


버튼(발판?)을 누르는 타이밍 표시는 스프라이트를 점멸해서 반투명으로 보여주고 있습니다.

회색 화살표 4개를 표시하려면 16x16 표준 스트라이트 12개가 필요합니다ㅋ

수평으로 6개를 쓰고 있어서, 더블모드 또는 2인모드를 구현하려면 스프라이트가 24개 필요한데요.

VDP의 제약으로 점멸(6개씩 교대로 깜빡임)을 쓸 수 밖에 없습니다요 ㅎ.ㅎ



여기까지만 보면 간단한 듯 한데요.

사실 반박자 노트가 연속으로 나오면, 아래처럼 화살표 2개가 겹쳐서 표시됩니다.




VDP에서 비트맵 논리연산 복사를 사용하면 쉽게 겹치도록 만들 수 있습니다.

(보통 이걸 소프트 스프라이트라고 부르죠)


근데, 이걸 실제로 쓰면 VDP 부하가 늘어나니까 조금 위험해질 수 있어요 ㅎ.ㅎ

일반 비트맵 복사는 메모리읽기 1번 + 쓰기 1번인데,

논리연산을 넣으면 메모리읽기 2번 + 쓰기 1번으로 처리되니까...

VDP 부하를 줄이기위해(실제로는 부하를 일정하게 만들기 위해), 겹치는 화살표를 미리 다 그려놓습니다.


정박자 화살표랑 반박자 화살표 2세트가 있으니까, 조합하면 4세트의 화살표가 있으면 됩니다.

그리고 스크롤 완료 후 화살표를 지울 때에도 반박자 화살표는 반쪽만 지워야하니까... 한세트 추가요~

화살표가 총 5세트가 되었네요!




실제 게임화면에서는 이렇게 나오게됩니다.




화살표 그리기는 요렇게 완성되었습니다.


그럼, 다음편에서 보아요~ ㅎ.ㅎ/


댓글 없음:

댓글 쓰기