본문 바로가기
Coding Study/Python

pygame 모듈을 활용한 리듬게임 제작 과정 (ing)

by 최듀렉 2023. 10. 15.

※ 모든 요소는 <DJMAX RESPECT V> 게임을 참고하여 구현하였음을 안내드립니다.
 

 

 

시작은 이 영상에서부터였다.

 

https://www.youtube.com/watch?v=KJKcLS6sAZg&ab_channel=MIN

파이썬 개발(리듬게임) PyBeat

 

당시의 글쓴이는 python의 다양한 모듈을 활용하는 방법을 배우고 있었다.

리듬게임에 꽤나 관심이 있는 나는 이 영상을 보자마자 직접 만들어보고 싶은 마음이 커졌어서,

당시 제일 좋아한 리듬게임인 DJMAX RESPECT V의 가벼운 카피 프로젝트 느낌으로 시작하였다.

 


 

 


첫번째로 pygame.draw.rect와 pygame.draw.line을 사용하여 노트가 내려오는 기본 틀을 작성하였다.
플레이어가 현재 무슨 키를 누르고 있는지 즉각 확인이 필요하다 생각하여
키를 누르면 판정선 아래 사각형을 채우는 방식으로 표시하였다.
 


골머리 썩고 있는 문제는 노트 입력과 출력 과정이었다.
 
(내 지식의 한계 때문에)
pygame 모듈을 사용하여 게임 루프를 돌릴 때,
1틱당 소요되는 시간을 계산하여 타이밍에 맞춰서
노트를 입력 및 출력하여야 된다는 사실이었다.

일단은 마비노기st.의 구시대적인 방법으로 구현하는 수 밖에 없었다. (...)
노트 입력을 할 수 있는 메모장을 따로 만들고,
.split() 함수를 사용하여 : 단위로 list로 분해한다.
이후 1틱마다 리스트의 한 칸을 읽어 노트에 해당하는 숫자가 있으면 노트를 출력하는 방식이다.

물론 입력할 때에도 직접 계산하여야 한다.

이 방식은 나중에 꼭 개선하여야 하는 방식이다..

동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.

 
판정 범위를 알맞게 조정하기 위해,
판정 범위 내에서 노트를 누를 때 알맞은 판정으로 처리되는지 확인하기 위하여
초록색 선과 파란색 선으로 표시하였다. (초록색 범위는 PURE, 파란색 범위는 GREAT)
이외의 범위에서 노트를 누르거나 지나쳤을 때 자동으로 MISS 처리가 되도록 구현하였다.
 
다만 노트를 누를 때 위의 텍스트로만 표시되는 것은
판정을 순간적으로 확인하기 위해선 역부족이라 생각하였어서,
노트를 누르면 나오는 이펙트를 추가하여 조금 더 가시성이 돋보이도록 하였다.

 


추가로 기본 틀 옆에 사운드바가 들어가면 좋을 것 같아

matplotlib.pyplot과 scipy.io를 활용하여 wav파일의 그래프를 생성하여

그래프를 list로 변환한 뒤, 한 틱당 list의 한 칸을 읽어서

그래프 높이만큼 출력되도록 하였다.

또한 BGA를 넣는 방식을 고민하다가,
OpenCV를 활용하여 영상을 프레임 단위로 저장한 후
1틱당 1프레임으로 출력하기로 했다.
결과는 아래처럼 나왔다.
 

동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.


사운드바와 노트들은 잘 출력되는 모습이다.
그러나 BGA 처리 속도 때문에 프레임이 느려지는 점, 이펙트가 제대로 출력되지 않는 점, 노트 가시성이 부족한 점 등이 있었다.
 

 

먼저 노트의 가시성을 돋보이게 하기 위해,
가운데인 s와 k에서 내려오는 노트를 파란색으로 변경하였다.
결과는 아래와 같다.

동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.


플레이어 입장에서 노트 가시성이 한결 좋아진 느낌이다.


이후 이펙트에 대한 고민에 휩싸였다.
원래는 동그란 원이 판정선 위에서 커지는 이펙트로,
PURE일 때는 원의 테두리 두께, 즉 width=3으로, GREAT는 width=1으로 출력되도록 구상하였으나

구현 과정에서 머리가 도저히 버티지 못하여(..) 이후 좀 더 쉬운 방법을 찾아보았고
결과적으로 이펙트 모양을 변경하게 되었다.

하얀 원이 판정선 위에 그려지면서 랜덤한 방향으로 움직이며 작아진다.
원이 그려지는 갯수를 통해  PURE와 GREAT를 구분하도록 하였다.
(PURE는 8개, GREAT는 5개)

동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.

 
바뀐 이펙트가 더욱 타격감이 좋아 마음에 들었다.
 

 
아래는 앞으로 해결해야 할 과제들이다. 

 

  • 노트 입출력 방법 개선하기
  • BGA 처리 속도 해결하기
  • 롱노트 구현하기

 

 

문제들을 모두 해결하고 난 이후 추가하고 싶은 기능들이다.

 

  • 곡 선택 화면 만들기
  • 다른 곡 추가하기
  • 노트가 내려오는 속도를 인게임에서 조절할 수 있는 기능
  • 노트가 내려오는 기본 틀 뒷배경의 불투명 정도를 조절할 수 있는 기능
  • BGA를 ON/OFF 할 수 있는 기능