타일 ​​맵과 유닛 간의 종속성을 관리하는 방법


11

작품에 2D 타일 기반 전략이 있습니다. 지도와지도의 단위 간의 관계를 처리하는 방법을 방황하고 있습니다.

타일 ​​좌표가 주어지면 유닛이 서있을 수 있어야합니다. 동시에 단위가 주어지면 단위의 좌표를 얻을 수 있기를 원할 것입니다.

나는 이것에 대한 두 가지 해결책을 보았다. 첫 번째 해결책은 유닛이 좌표를 저장하고지도 저장 유닛 참조를 타일에 저장하는 것입니다. 이는 맵과 단위 사이에 주기적 종속성을 작성합니다. 유닛이 움직일 때 모든 유닛의 맵이 동기화되어 있는지 확인해야합니다.

두 번째 해결책은 단위 만 좌표를 추적하도록하는 것입니다. 타일에 단위가 포함되어 있는지 확인하고 해당 단위를 얻으려면 전체 단위 세트를 반복하여 일치하는 좌표가있는 단위를 찾습니다. 순환 의존성을 제거하지만 첫 번째 솔루션이 맵에서 단위를 찾는 데 필요한 O (1) 속성을 잃습니다. 경로 찾기, 이동 범위 결정 및 주어진 단위에 대한 유효한 목표 찾기와 같은 것들에 대해 정기적으로지도를 스캔하고 싶을 때 추가 될 수 있습니다.

또한지도에 단위를 저장할 수 없습니다 (또는 할 수 있습니까?). 부대는 플레이어 또는 AI의 "군대"와 관련이 있습니다. 군대는 모든 부대를 쉽게 접근하고 반복 할 수 있어야합니다.

이것이 전략 게임에서 일반적인 문제인 것처럼 보이기 때문에 단위 / 맵 관계 관리에 대해 설명한 두 가지 패턴 외에 다른 패턴이 있습니까?

답변:


3

널리 사용되는 패턴은 아니지만 관계형 데이터베이스 세계는 세 번째 방법을 제공합니다. 여러 키가있는 데이터 구조를 사용하십시오. 표 형식으로 다음과 같이 보일 수 있습니다.

Unit id    Location
-------------------
  1309     13,15
  2357      7,93
  8552      7,93

“장치 2357은 어디에 있습니까?”라고 물을 수 있기를 원합니다. 7,93으로 돌아옵니다. “위치 7,93은 무엇입니까?” 2357 및 8552를 다시 가져옵니다. 여러 키를 검색 할 수있는 데이터 구조가 있습니다. 종속성을 제거하려는 경우이를 유닛 외부와 맵 외부에 저장할 수 있습니다.

그러나 실제로는 각 유닛에 위치를 저장하는 것이 더 일반적이며, 측면에서 주어진 영역에 어떤 유닛이 있는지 알려주는 공간 분할 데이터 구조를 사용하십시오. 별도의 구조이므로 영역이 그리드 공간 일 필요는 없습니다. 그들은 더 큰 영역이 될 수 있습니다.

가장 쉬운 방법 (두 번째 솔루션)을 수행하는 것이 좋습니다. 나중에 성능 문제인 경우 공간 파티션을 추가하여 조회 속도를 높일 수 있습니다.


따라서 공간 파티션 데이터 구조는 맵 일 수 있습니다 (제 경우에는 2D 타일 그리드입니다). 나는 장치가 움직일 때 (또는 추가되거나 제거 될 때) 여전히 장치와 공간 분할 구조를 모두 동기화하여 동기화해야한다고 가정합니다. 아마도 내가 함께해야 할 것들 중 하나입니까?
AJM

1
예, 맵은 가장 미세한 공간 파티션입니다. 모든 장치의 전체 목록은 가장 거친 입자 파티션입니다. ;) 파티션을 사용하기 전에 업데이트 만하면됩니다. 항상 사용한다면 유닛을 움직일 때마다 업데이트하고 싶을 것입니다. 그러나 업데이트 논리의 일부 단계에만 사용하는 경우 한 번의 통과로 장치 목록을 살펴보고 파티션 데이터 구조를 계산 한 다음 완료되면 버릴 수 있습니다. 그렇게하면 항상 동기화 상태를 유지할 필요가 없습니다.
amitp

5

플레이어 당 수천 단위가 아니라면 메모리 사용에 대해 걱정하지 않고 첫 번째 솔루션을 사용하십시오. 메모리는 CPU보다 저렴합니다.

실제로 플레이어 당 4000 단위를 가지고 있지만 두 개의 정수를 사용하여 위치를 저장하고 8 명의 플레이어는 2MB 만 사용하지만 첫 번째 솔루션에서는 O (1) 좌표 게터를 사용합니다. O (n) (정렬되지 않은 것으로 가정). 단위가 많으면 느려질 수 있습니다.

대부분의 게임은 타일이 아닌 픽셀 기반 인 것 같습니다. 이제는 며칠 동안 유닛이 좌표를 저장하기 만하면됩니다.


메모리 사용에 대해 걱정하지 않고 (Object Oriented Design 의미에서) 종속성 관리에 더 관심이 있습니다. 그것은 첫 번째 솔루션이 나를 걱정하게 만드는 여분의 메모리가 아니며, 내가 O (1) coord getter를 좋아하는 것처럼 내가 leery하고있는 순환 종속성입니다. 또한 지금은 많은 게임이 픽셀 기반이라는 것을 알고 있지만 타일을 좋아하므로 사용하고 있습니다. : P
AJM

@ AJM과 마찬가지로 Android에서 출시 할 유료 앱은 타일을 사용합니다.
Ray Britton
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.