BMS 파싱 및 리듬게임 개발 (C#) - 2

posted-at2013.08.28 16:52 :: posted-inProject/게임개발 :: posted-byNarrL


참조 문서.

http://bit.sparcs.org/~tokigun/article/bmsguide.php (bms 파일형식)

http://smilejsu.tistory.com/380 (BPM 계산 방식과 배속 구현)



지난번 BMS 파싱 및 리듬게임 개발 (C#) 에 이어서 다시 제작에 들어간 bms구동기이다.


가장 까다로웠던 이벤트 채널도 사실상 구현이 완료되었고.


이벤트 채널은 실제로 오브젝트를 배치하지는 않지만 곡이 재생될 때 발생하는 이벤트(BGA 변경, 배경음 재생 등)를 지정하는 데 사용한다.
channel #01: 배경음 채널
지정한 키값을 배경음으로 재생한다. 이 배경음은 어떤 경우에라도 항상 재생된다. 존재하지 않는 키값은 무시한다.
channel #02: 마디 단축
이 채널은 다른 채널과는 다르게 데이터로 숫자를 받는다. 지정한 실수 배로 해당 마디의 길이를 줄이거나 늘린다. (0.5일 경우 원래 길이의 반으로, 2.0일 경우 원래 길이의 두 배로) 이는 BPM의 조정과 다르며, 해당 마디가 재생되는 시간 자체가 그만큼 짧아지거나 길어지는 것을 의미한다.
channel #03: BPM 채널
해당하는 위치에서, BPM을 지정한 16진수 숫자(1부터 255까지)로 바꾼다. 예를 들어서 78은 BPM 120을 의미한다.
channel #04: BGA 채널
현재 표시되고 있는 배경 이미지 파일을 해당하는 키값에 지정된 이미지 파일로 바꾼다. 지정된 이미지는 다른 이미지가 이 채널에서 지정될 때까지 계속 보여진다.
channel #05: BM98 확장 채널
이 채널은 BM98에서만 사용할 수 있다. 따라 오는 데이터들을 순서대로 해당 마디의 에 넣는다. 그리고 오브젝트 채널에서 명령을 내릴 때, 해당 마디의 큐가 비어 있지 않으면 나오는 순서대로 00이 아닌 키값에 큐에서 키값을 꺼내서 그 키값에 대응하는 스프라이트를 기본 오브젝트 모양 대신 출력한다. 키값에 대응하는 스프라이트 번호는 미리 지정되어 있으며 부록에 그 목록이 있다.
channel #06: Poor BGA 채널
사용자가 오브젝트를 입력하지 못 했을 때 표시될 배경 이미지를 해당 키값의 이미지로 바꾼다. 일반적인 BGA 채널과는 달리 Poor BGA 채널은 하나 뿐이며, 투명색 등은 모두 무시된다.
channel #07: BGA 레이어 채널
현재 표시되고 있는 배경 이미지 파일을 해당하는 키값에 지정된 이미지 파일로 바꾼다. channel #04와 다른 점은 이 이미지는 channel #04에서 지정한 이미지 위에 표시된다는 것이다. (검은색, 즉 투명색으로 되어 있는 부분은 아래의 일반 BGA 이미지가 비쳐 보이게 된다.) 그래픽 편집 툴의 레이어 기능과 흡사하다.
channel #08: 확장 BPM 채널
해당하는 위치에서, BPM을 지정한 키값에 지정된 BPM 값(#BPMxx 명령으로 지정한 값)으로 변경한다.
channel #09: 시퀀스 정지 채널
해당하는 위치에서, 지정한 키값에 지정된 시간(#STOPxx 명령으로 지정한 값) 만큼 오브젝트가 움직이는 것을 멈춘다. 이미 재생되던 배경음은 그대로 재생되지만 다른 모든 것은 해당하는 시간만큼 멈춰 있게 된다.



롱노트, 배속조절, BGA(이미지, 동영상) 까지 모두 구현되었으니 기본적인 BMS 파싱 작업은 완료되었다고 볼 수 있다.



약 100개 정도의 유명 BMS 파일들로 테스트해본 결과 모두 무사히 통과,

간혹 로딩한 이미지 메모리가 뻥튀기 된다던가, 동영상 프레임이 이상해지는 문제는 해결해야할 버그사항들 이다.



네트워크는 제로보드 호스팅을 통한 DB 사용으로 로그인, 레벨, 포인트 등의 기능을 연동해놓은 상태이다. (임시)

http://kobi3000.cafe24.com/xe/



그래픽 작업은 지인들 동원해서 진행중..



아래는 현재까지 작업에 대한 동영상. (그래픽 작업 미적용)






회사일과 병행하면서 하다보니 진행속도가 만족스럽지는 않다..

  1. guest icon이가람2013.12.06 17:50

    안녕하세요, 이번에 포트폴리오로 리듬게임을 제작하고 있는 취준생입니다.
    조금 실례지만(ㅎㅎ) 몇가지 질문 드리고자 합니다.
    혹시 BMS데이터을 읽어 들어서 노트를 생성할 때
    모든 노트를 미리 생성한 다음에 본 게임이 진행되는 방식인가요?
    아니면 본 게임이 진행되는 상황에서 유동적으로 노트를 제때제때 생성하는 방식인가요?

    소중한 답변 부탁 드립니다. 감사합니다.

    • guest icon NarrL2013.12.10 14:34 신고

      미리 생성해놓고 스크롤하는 방식입니다.

  2. guest icon이가람2013.12.11 11:51

    답변 감사합니다^^.

  3. guest icon이가람2013.12.12 17:39

    질문 하나 더 드려도 될까요?

    배속 구현 할 때, 혹시 멀티 쓰레드 형식으로 구현하셨나요?(당연히 그러겠지만...)

    예를 들어

    노트를 내려오게 하는 쓰레드하고
    노트 배속을 관리하는 쓰레드 이런 식으로

    따로 관리하는 방식을 취하셨나요?

    그렇다면 어떤 식으로 관리하셨는지 조금 알 수 있을까요?

    현재 제가 유니티로 개발하고 있어서 배속 기능을 비슷하게 구현하고 있지만

    조금 끊기는 문제가 있네요...

    • guest icon NarrL2013.12.16 10:26 신고

      제꺼에서는 구조상 배속을 다른 쓰레드로 나눌 필요가 없네요..
      배속 조절을 해도 실제 노트 간격이 늘어나는 것이 아니라 Draw시의 노트위치만 변경해주는 방식이라..
      유니티 경우에는 끊김이나 프레임드랍은 고질적인 문제라고 알고있어요. 가비지컬렉터 문제도 있고..

    • guest icon이가람2013.12.17 21:03

      허... 그렇군요ㅎㅎ... 이 놈의 배속이 문제네요 ㅠㅠ 시간 내주셔서 감사합니다^^.

  4. guest icon2014.12.10 08:00

    비밀댓글입니다