아트 팀원이 그토록 보고 싶어했던 신규 우주선 그래픽!

그러나 구현에 있어서는 매우 까다롭습니다.
벽이 어떤 모양으로 생겨야 하는가를 정하기 위해, 벽이 속한 타일뿐만 아니라 인접한 타일들과 인접한 다른 벽들이 어떻게 되어 있는지를 모두 따져야 하거든요... 🫠
가지치기 없이 모든 경우의 수를 따지면 2^12 = 4096 가지 경우가 나옵니다...
이 모든 경우에 대해 if-else를 쓸 수는 없잖아요.
효율적인 가지치기를 위해 구조화가 필요하죠. 🍃
우선, 벽 하나를 6등분합니다.
벽이 두 타일 사이에 걸쳐 있으므로 얇게 반으로 잘라서 한쪽 타일에만 놓이는 조각으로 만듭니다.
이것을 1:1:1로 또 잘라서 왼쪽 코너, 중앙, 오른쪽 코너로 나눕니다. 🧩
자, 중앙(straight) 조각에는 어떤 스프라이트가 와야 하는지 자명합니다.
벽이 있으면 직선 벽 스프라이트를 두고, 없으면 비워 두면 되죠.
문제는 양쪽 코너 조각에 들어갈 스프라이트를 결정하는 것입니다.
신규 우주선 그래픽에서는 이 코너가 인접한 벽과 어떻게 이어지느냐에 따라서 모양이 바뀌기 때문입니다.


코너에 들어갈 수 있는 일반 벽의 종류를 이렇게 여섯 종류로 추렸습니다!
하나의 타일 코너에 놓일 벽 조각을 대각선으로 잘라 두 조각으로 만들었기 때문에 가능한 일이죠! 🚫
예를 들어 타일의 우상단 코너는 타일 위쪽 벽의 오른쪽 코너 조각 하나와 타일 오른쪽 벽의 위쪽 코너 조각 하나로 구성됩니다.
그 중에서 타일 위쪽 벽의 오른쪽 코너 조각 하나만 고려하기로 합시다!
다른 코너 조각들(총 8종류)은 회전과 뒤집기를 해서 얻을 수 있기 때문이죠.
이 하나의 코너 조각에 들어갈 수 있는 일반 벽 스프라이트가 위 사진과 같다는 겁니다.
자 이제 이 코너 조각에 6가지 스프라이트 중 어느 것을 표시해야 할까요?
주변에 놓인 다른 벽을 모두 고려해야 합니다.
어질어질하죠?
경우가 너무 많습니다.
이때 좋은 생각이 났습니다!
바로 진리표(truth table)를 그리는 것이죠! 🧑🎓
그러면 4096개의 행이 나오지 않냐고요?
논리적인 고민을 통해 압축할 수 있는 경우는 압축해야죠!
예를 들어 벽의 중앙 조각이 빈 스프라이트라면 코너도 항상 빈 스프라이트여야 합니다.
네, 벌써 1024개의 경우를 걸러냈습니다!
이런 식으로 진리표를 채워 나가면 모든 경우에 대해 고려할 수 있고, 가지치기도 할 수 있으며, 각 경우에서 어떻게 그래픽이 그려져야 하는지를 비교하며 정할 수도 있습니다!
이렇게 말이죠!


드디어 실마리를 찾았습니다!
이제 신규 우주선 그래픽을 클라이언트에 띄우는 것은 시간문제입니다!
물론, 아트 팀원이 몇 가지 스프라이트를 새 구조에 맞게 수정해 준다면요.
내일 마저 작업하겠습니다!! 😄
이전 포스트
댓글 0개
첫 번째 댓글을 작성해 보세요!