프레임워크에 있는 터치 이벤트 관련 클래스들로 터치 판정을 구현하였습니다.
지금까지 개발하면서 가장 힘든 부분이 바로 이 터치 이벤트가 아니었나 싶습니다. 터치 이벤트로 인해 게임 플레이 중 성능에 영향을 주어선 안 되기 때문에 멀티 스레드로 작성하였습니다.
멀티 스레드로 작성하게 되면 중단점을 놓아도 무용지물이기 때문에 버그를 처리하는데 많은 시간이 들어 힘들었습니다.
일반 노트의 판정 구현
터치 이벤트의 상태변화는 ‘누르지 않음’과 ‘최초로 누름’, ‘계속 누르는 중’, ‘누르면서 움직임’, ‘이젠 누르지 않음’ 이렇게 5가지로 분류를 해놨습니다.
롱 오브젝트는 계속 같은 자리를 눌러야 하기 때문에 ‘계속 누르는 중’이라는 상태를 추가하였습니다.
하얀색 오브젝트는 판정을 ‘Perfect’, ‘Good’, ‘Miss’ 총 3가지로 나뉩니다. ‘Perfect’는 가장 정확한 타이밍에 버튼을 터치했을 때 나오는 가장 좋은 판정, ‘Good’은 살짝 아쉬운 타이밍에 버튼을 터치했을 때 나오는 판정, ‘Miss’는 틀린 타이밍에 버튼을 터치했을 때나 아예 터치하지 않았을 때 나오는 판정입니다.
주황색 롱 오브젝트는 판정을 ‘Perfect’, ‘Miss’ 총 3가지로 나뉩니다. ‘Perfect’는 살짝 아쉬운 타이밍에 버튼을 꾹 터치해도 나오는 가장 좋은 판정, ‘Miss’는 틀린 타이밍에 버튼을 꾹 터치했을 때나 아예 터치하지 않았을 때 나오는 판정입니다.
노브의 판정 구현
노브에 대한 판정은 하얀색 객체와 롱 오브젝트보다 더 복잡해서 터치 구현 중 가장 오래 걸렸습니다.
위 사진을 보시면 이 게임의 원작인 ‘사운드 볼텍스’의 조작방법입니다. 양쪽의 장치를 돌려 커서가 노브 안에 걸려야 합니다.
이와 비슷하게 터치 슬라이드 형식으로 커서를 움직여 노브 객체에 맞추는 그런 형태로 진행하게 하였습니다.
처음엔 커서 없이 왼쪽, 오른쪽으로 터치 슬라이드만 하면 알아서 판정하는 그런 형태로 제작하였습니다. 그리고 몇 달 뒤, 커서를 추가하여 완전한 모습으로 수정되었습니다.
터치 판정을 구현하면서 MSAA라는 멀티 샘플링 방식을 사용하여 안티엘리어싱을 적용하였습니다.
게임 성능에 큰 영향을 주지 않지만, 차후에 설정에서 안티엘리어싱을 켜고 끌 수 있는 기능을 추가할 예정입니다.