손으로 하는 테트리스 만들기 (3) SRS 시스템, 프로젝트 중단

2021. 2. 1. 19:29뚝딱뚝딱 만들기 Devlog/프로젝트 Devlog

아두이노 관련 내용을 대충 마무리 짓고 테트리스 만들기로 넘어갔습니다.

굉장히 많은 시행착오가 있었습니다. 처음엔 2차원 배열을 활용한 방식으로 하다가,

충돌처리를 쉽게 하기위해 collider로 충돌 체크를 하다가,

회전이 너무 까다로워서 어쩌지 망설이다가 테트리스 회전시스템인 SRS에 대해 알게됐습니다.

 

 

1. SRS 시스템

 

SRS 설명 링크 : tetris.wiki/Super_Rotation_System

 

-문제 발생

제가 난항을 겪었던 부분이 피스마다 사이즈가 2*2, 3*3, 4*4로 다르다는 점이었습니다.

그래서 한 피스의 position을 결정짓고 그 점을 기준으로 회전시키는게 까다로웠습니다.

렇게 중심점이 다 달랐습니다. 4*4 피스는 블록들의 경계선(꼭지점)에 있고, 3*3피스는 블록의 정가운데 있습니다.

이렇기 때문에 예를들어 피스를 5,5 지점에 놓으라고 하면 4*4나 2*2 피스는 반 칸 밀려서 놓여지는 상태가 됩니다.

이건 근데 if 로 4*4나 2*2 피스만 다르게 처리해주면 되기 때문에 크게 문제되진 않았지만,

회전 체크(회전 할 때 이미 놓여진 블록들과 부딛힌다면 회전이 이루어지면 안됨)이 방법이 없었습니다.

 

-SRS 작동 방식

슈퍼 로테이션 시스템 SRS는 이 문제를 해결합니다. 거기에 덤으로 월킥(Wall Kick)까지 한번에 해결됐습니다.

 

https://tetris.wiki/File:SRS-true-rotations.png

위 이미지처럼 4*4는 5*5로, 2*2는 3*3으로

홀수*홀수 형태로 바꿔 한 피스의 position을 명확히 결정할 수 있게 됏습니다.

하지만 이럴경우 2*2 피스나 4*4 피스는 저희가 익숙한 회전과 다르게 되는데, 여기에 offset table을 이용합니다.

https://tetris.wiki/Super_Rotation_System

기본 방식은 "회전 할 때 특정 offset만큼 피스를 이동시켜서 회전한다" 입니다.

0, R, 2, L은 각각의 회전상태를 시계방향 회전순서로 나타냅니다.

예를들어 I 피스를 0에서 R로 이동하려면 (시계방향 회전)  우선 offset 1을 확인합니다.

(0,0) - (-1,0) = (1,0) 이 offset 1이 되는데, 피스를 이만큼 평행이동 시켜서 부딛히는 블록이 있는지 확인합니다.

있다면 offset 2를 체크하고, 그다음은 3, 쭉 해서 5까지 체크했는데도 계속 부딛히면 이 피스는 회전할 수 없습니다.

하지만 중간에 회전이 가능한 offset이 있다면, 블록을 그만큼 평행이동 시킨 후 회전시킵니다.

 

 

2. 오늘은 여기까지

 

이 시스템 까지 적용해서 나온 결과물입니다.

소프트드롭과 하드드롭까지 구현 했고,

한 줄 완성 시 없애는 부분 외의 다른 부분들은 잘 되네요.

 

 

그리고 추가적으로 자이로센서를 장갑에 부착시켜서 손 회전을 인식할 수 있게 했습니다.

센서를 어떻게 장갑에 붙일지 고민하고 만드는게 재밌었네요.

 

 

하지만 이 프로젝트는 여기까지만 하기로 했습니다.

손 동작을 회전, 좌우 이동으로 번역하는 과정을 어떻게 할지 막막하기도 했지만,

애정이 식었달까요?

다른 하고싶은게 생겨버리고 말았습니다.

 

그래도 이번은 예전과 다르게 미완성된 부분이라도 남겨두기로 했습니다.

다음 프로젝트에서 뵐게요!

깃허브 : github.com/HappyFaceFriend/TetrisWithHand

반응형