랜덤맵 제작 3

2020. 4. 3. 18:09개발일지

방 사이 타일 생성 1

지난번에 이어 랜덤맵 제작을 이어가겠다. 이번에는 맵에 타일을 더 많이 깔고 부술수 없는외벽을 치는 작업을 했다.

네크로댄서는 방과 방 사이 통로 말고도 벽을 부숴서 이동할 수 있다.

지난번 사용한 사진에서 예를 들자면, 타일 사이의 간격이 가까운 공간들을 메꿔 벽을 부수고 이동할 수 있는 자리로 만든다. 아래에서 파랗게 칠한 부분들을 채워 맵에 지나다닐수 있는 공간을 더 넓게 해주는게 이번 작업이다.

1차적으로 새로운 방을 생성할때 이전 생생된 방과 좌표 차이를 계산하여 타일을 채워주었다.

왼쪽이나 오른쪽으로 통로를 뚫었다면 방의 y좌표가 겹치는 곳을 채우고,

위나 아래쪽으로 통로를 뚫었다면 방의 x좌표가 겹치는 곳을 채웠다.

 

그 결과 다음 사진처럼 다음방으로 통로를 통해서 뿐만 아니라 벽을 부숴서 이동할 수 있는 타일이 생겼다.

 

외벽 생성

다음 작업으로 지나갈 수 없는 외벽을 생성했다. 

외벽은 벽 타일을 순회하며 상하좌우 + 대각선 4방향을 조사해 아무 타일이 없다면 외벽을 설치했다.

이때 조심할 점은 반복문 순회를 돌면서 생성할 경우 자칫 무한루프에 빠질 수 있다는 점이었다. 새로 생성한 타일이 반복문 안에 포함되 그곳에서 다시 조사를 한다면 무한히 외벽을 생성하는 루프에 빠질 수 있다.

이를 방지하기 위해 set을 이용했다. 

먼저 벽 타일을 순회하며 빈 공간 찾으면 좌표를 set에 포함시키고, set에 포함된 좌표에 타일을 생성하도록 분리하였다.

외벽을 설치했지만 아직 문제점이 하나 남았다.

위에서 한 방 사이 타일 생성은 생성이 전후관계일때만 된다.

즉 1번방과 2번방이 순서대로 생성된다면 1번방과 2번방 사이에만 타일을 추가로 생성하지만, 만약 2번방 다음으로 생성된 3번방은 1번방과 가까운 거리에 있더라도 추가로 타일 생성을 하지 않게 된다.

그래서 아래 사진처럼 가까운 거리에 있는 방임에도 외벽으로 지나가지 못하는 공간이 생기게 된다.

 

방 사이 타일 생성 2

외벽을 생성한 것과 로직은 비슷하다. 순회를 돌면서 주변에 타일이 없으면 3칸과 2칸 떨어진 곳을 조사해 그곳에 타일이 존재한다면 그 사이 좌표들을 set에 넣어준다.

주의할 점이 몇가지 있는데, 벽이 아니라 바닥이 없는지 조사해야 통로가 벽으로 막히는 것을 막을 수 있다.

그리고 상 하 좌 우 모든 방향을 조사할 필요는 없고 오른쪽과 아래쪽만 검사하면 모든 케이스를 검사할 수 있다.

마지막으로 순회 한번에 2가지 방향을 동시에 조사하면 실행결과 빈 공간이 생길 수 있다.

한쪽 방향을 먼저 순회하여 생성된 타일들도 조사 대상에 포함해 줘야 빈 공간을 완전히 메울 수 있다.

실행 결과 방의 생성 순서와 상관 없이 가까운 거리에 있는 방 사이는 타일이 채워지게 된다.

이로써 처음에 구현했던 방 생성순서에 영향받는 타일 생성 구현은 필요가 없어졌다.

열심히 좌표계산을 했었는데...

그래도 더 짧고 좋은 방법이 생각났으니 좋은것이다 ^_^

'개발일지' 카테고리의 다른 글

플레이어 공격 1  (0) 2020.04.07
랜덤 몬스터 스폰  (0) 2020.04.04
랜덤맵 제작 2  (0) 2020.04.03
랜덤맵 제작 1  (0) 2020.04.01
명령패턴을 활용한 이동 구현  (0) 2020.03.29