본문 바로가기
스크래치/스크래치 리듬게임

리듬게임 만들기2. 노트 스프라이트 만들기

by 할거없네 2017. 12. 17.

이번에는 노트를 만들 예정입니다. 리듬게임에서 만들기 어려운 부분이 노트를 생성하는 부분인 것 같습니다. 그래서 노트 생성 부분 강좌는 약간 구체적으로 나누어서 진행하도록 하겟습니다



이번 포스팅에서는 노트가 원하는 시간에 원하는 위치에 떨어지도록 만들어 줍니다.




먼저 노트 스프라이트를 만들어 줍니다. 노트의 모양은 적당히 노트게 어울리는 모양으로 넣었습니다.




일단 기본적으로 이 노트가 악보에 따라 생성해 주어야 합니다. 일단 a라인 하나만 만들기로 하는데, 4개 라인을 동시에 만들어 가기 힘드므로, 한개 라인을 먼저 완성 시킨 후 나머지라인으로 사하여 넣을 예정입니다. 그래서 일단 노트는 a라인에만 만들기로 합니다. 이 라인에서 노트가 생성되는 것은 '악보'가 있어야 하는데 악보는 리스트로 꾸며줄 예정입니다. 그래서 리스트에서 숫자를 넣어주면 해당 타이밍에 정확히 키를 눌러야 인식하도록 만들어 주어야 합니다. 에를 들면 리스트에 3이 있으면 3초에서 노트가 y좌표 -120에 있어야 합니다. 그렇게 만들기 위해서는 약간의 수학적인 계산이 필요합니다. 그 부분은 뒤에 설명이 됩니다.




먼저 노트의 원본은 악보 리스트를 정의해주고, 다음에 초기값과 만들어 주는 행동을 하도록 했습니다. 이후에 만들어주는 블록인 note_create_a는 순서대로 계속해서 노트를 생성해 주기 위해서 루프안에 들어갈 예정입니다. 현재는 테스트용으로 루프없이 만들어 주기로 합니다.




각각의 블록은 위와 같이 되어 있습니다. note_list에서는 3의 값 하나만 추가되는데, 노트가 발생하면 3초후에 -120의 위치에 정확히 들어오도록 노드가 발생하는 타이밍을 계산해 줄 예정입니다note_create_aa라인에서의 노트 생성하도록 하는 블록인데, 단순히 복제를 하여 노트가 떨어지도록 되어 있습니다. 이 부분은 추후에 좀 더 리듬게임에 맞게 수정될 예정입니다.

여기서 한가지 언급해야 할 것은 '타이머'를 사용한다는 것인데, 타이머를 사용함으로써 노드의 위치를 결정해 주기 위한 것입니다. 만약에 타이머를 사용하지 않고 '~초 기다리기'의 블록 사용을 하게 되면 오차가 발생하기 때문에 타이머의 사용은 불가피할 것으로 보입니다.



노트의 추가적인 무한루프로써, y_shift변수를 타이머값에 음의 비례하도록 만들었습니다. 만약에 타이머가 1초라면 y_shift-1이 되고, 3초라면 y_shift-3이 됩니다. 시간이 지날수록 y_shift는 더 작아지면서 노트들을 아래로 떨어지도록 하기 위한 변수입니다.



이제 노트들이 복제를 하면 순서대로 위에서 아래로 떨어지도록 합니다. , 여기서 생각해야 할 조건을 생각해야 하는데요,


1. 리스트이 값에 따라서 정확한 순간에 y좌표 -120으로 가야함 (3이라면 3, 5라면 5초가 됬을 때 -120이 되도록 속도에 따라서 생성이 되야함)

2. 노트가 일장 값 이하면 사라짐 (사라짐 조건)


정도가 되겠네요. 이제 각 블록들이 어떻게 만들었는지 살펴봅니다.




먼저 초기값으로는 노트 데이터가 0보다 크면 보이도록 하였습니다즉 어떤 값이 있다면 보이도록 합니다. 추후에는 보이는 조건을 좀더 강화해서 노트가 화면안에 있는 좌표일 때로 추가 수정할 예정입니다.

다음은 움직이는 조건입니다. y좌표를 다음과 같이 공식을 넣었습니다.

y좌표: 속도*(노트가 도착해야 할 시간+y_shift)*20-120

속도가 빠르면 노트가 더 빨리 내려옵니다. 하지만 속도에 상관없이 노트가 도착해야 할 시간과 y_shift의 합이 0이면 항상 -120의 값이 됩니다. , 속도가 빠를수록 더 빨리 내려오지만 도착해야 할 시간에 맞춰서 -120좌표로 이동되는 것으로 만족합니다. 20을 곱한 것은 속도의 배율로써, 1이면 20, 2이면 40이 되도록 하는 단순한 비례값입니다.

마지막으로 노트가 사라지는, 혹은 숨겨지는 조건을 넣은 부분으로써, 175보다 크면 숨기고, 그렇지 않으면 -150보다 작으면 숨긴 후 복제본 삭제입니다. 만약에 데이터가 없는 상태인 경우 단순히 숨기기로 넣었습니다. 이 부분은 일단 적당히 넣은 것으로 추후에 수정될 예정입니다.






이제 노트가 위와 같이 3, 5, 7초에 정확히 y좌표 -120에 도달하는지 테스트를 해봄으로써 해당 스크립트가 잘 동작하는지 확인할 수 있습니다.



스크립트 확인하기:

https://scratch.mit.edu/projects/194074126/


댓글