프로젝트 리듬게임 Java Swing

Java Swing으로 리듬 게임을 만들 때 가장 어려웠던 건 그래픽이 아니라 시간이었다.
<노트 낙하 화면 이미지 필요>
노트가 음악과 어긋나기 시작하면 플레이어는 바로 불편함을 느끼고, 판정에 대한 신뢰를 잃는다.

처음 구현에서는 프레임 기준으로 노트 위치를 계산했는데 곡이 길어질수록 오차가 누적되는 드리프트가 생겼다.

이 문제를 해결하기 위해 기준을 프레임에서 재생 시간(ms)으로 바꿨다.
<판정 라인과 타이밍 표시 이미지 필요>
노트의 현재 위치를 매 프레임 누적 이동으로 계산하는 대신, 현재 재생 시간과 목표 판정 시점의 차이로 다시 계산하게 만들었다.

그 후에는 입력 판정도 같은 시간축에서 처리해서 Perfect, Good, Miss 경계를 일정하게 유지했다.

핵심은 “보이는 위치”가 아니라 “들리는 시점”에 맞춰 판정해야 한다는 점이었다.

Swing 환경에서는 게임 엔진처럼 루프가 자동으로 정교하게 돌아가지 않아서 UI 처리와 게임 로직을 분리하는 작업도 필요했다.
<점수/콤보 UI 화면 이미지 필요>
렌더링이 잠깐 밀리는 상황에서도 판정 로직은 흔들리지 않게 따로 유지했고, 화면은 그 결과를 보여주는 역할로만 제한했다.

재시작이나 곡 전환 시에는 리스너와 타이머를 확실히 정리해서 중복 이벤트 때문에 판정이 두 번 들어가는 문제를 막았다.

결과적으로 사용한 기술은 단순했지만, 적용한 방식은 꽤 시스템적이었다.

입력 시각과 노트 기준 시각의 차이 계산, 판정 임계값 분류, 가장 가까운 노트 우선 판정 같은 알고리즘을 조합해 안정성을 확보했다.

엔진이 없는 환경일수록 알고리즘과 상태 정리가 더 중요하다는 걸 강하게 알게 되었다.

P.S

이 프로젝트는 리듬 게임에서 화려한 연출보다 시간 기준을 정확히 잡는 알고리즘 설계가 완성도를 결정한다는 걸 느끼게 해준 것 같다.

Author avatar

웨이호프

WordPress creator and blogger.

View all posts