2013-06-05 1 views
0

저는 2D 타일 기반의 세계를 가지고 있습니다.이 세계는 간단한 배열 인 World [100] [100]을 사용하여 만들어졌습니다.2D 타일 기반 세계 타일 오브젝트를 보유하려면 어떤 유형의 컨테이너를 사용해야합니까?

게임 멀티 플레이어를 제작할 계획이므로, SERVER가 플레이어를 둘러싼 모든 타일과 클라이언트에게 필요한 정보 만 보내도록하는 것이 좋을 것이라고 생각합니다. 렌더링 할 텍스처/스프라이트와 그것을 렌더링 할 위치.

이렇게하려면 tileType (Grass, Sand, Water 등)이 있고 10 개의 TileObjects 배열을 보유하고있는 고유 한 TILE 클래스를 만드는 것이 좋을 것이라고 가정합니다. TileObject는 objectType (문자입니까? 나무입니까? 바위입니까?), int objectID (객체가 실제로 무엇이든간에 링크되어있어서 Character가 "Leeroy"임을 알고 있습니다. 젠킨스 "하고는. 렌더링을 위해 클라이언트에 Leeroy의 애니메이션 & 방향을 보낼 수)하고 필요한 경우 타일에서 & Y objectPosition (X는.이 타일을 넘어 확장 할 수 있습니다.)

를이와 내가 방법을 잘 모르겠습니다 만 하나의 타일 (충돌이 많은 타일을 사용하는 Dragon과 같은)보다 큰 물체 나 문자는 처리 할 것이지만 최상의 디자인이라고 할 수 있습니다.

TILE 클래스에 TileObjects를 저장하려면 어떤 유형의 컨테이너를 사용해야합니까? 지금은 배열이 있지만 성능에 좋을지는 의심 스럽습니다. 어떤 타일은 0 개의 TileObjects를 가질 수있는 반면, 다른 타일은 5+를 가질 수 있습니다. 벡터,지도, 연결리스트, 배열 : 나는 심각하게 나는 완전히 다른 컨테이너 유형을 주장 다양한 튜토리얼과 책을 읽고 < (10)

class Tile 
{ 
private: 
    TileObject TileObjects[10]; //up to 10 objects on a single tile 
    TileTerrainType tileTerrainType; //GFX to display Grass, Sand, Water, Swamp, etc. 
} 

아무것도 이제까지 초과 의심 때문에 10을 사용했다. 나는 TileObject를 저장하는 것이 최선인지 모른다. (어떤 것들은 끊임없이 움직일 수 있고, 파괴되거나 아이템을 떨어 뜨리거나 추가하는 것과 같이 추가 될 수 있으며, 어떤 것들은 나무 나 바위처럼 움직이지 않을 수도있다.)

+0

그냥 명확하게 - 움직이지 않는 것들 (지형 유형)과 움직이는 것들 (문자, 아이템)을 나타 내기 위해 타일을 사용하고 있습니까? – Patashu

답변

0

전 세계 좌표계에서 map이 있어야한다고 생각합니다. 세계의 좌표계에 포함 된 내용이 vector입니다. 내가 게임 공간에있을 수있는 모든 일을 나타내는 클래스 Thingxy 매개 변수를 가진 클래스 Position이있는 경우

에서와 같이,이있을 것입니다 :

map<Position, vector<Thing>>

은 게임의 모든 위치 (모두 10000 개)에 대해 처음에 비어있는 vector<Thing>으로 초기화됩니다.

유용한 속성을 제공합니다.

공간 분할. 내가 주변에 어떤 것들이 있는지 알아 내고 싶다면지도를 9 가지 위치에서 확인해야합니다. 만약 내가 다른 방향으로 가고, 하나의 큰 listThing s가 어디에 의해 파티션되지 않은, 내가 게임에서 모든 하나의 Thing 나를 가까이에있을 수 있는지 확인하기 위해 모든 Thing 봐야했을거야 .

이것은 큰 속도 향상을 제공합니다. 1)지도가 더 커지면 2) 더 많은 것이 Things으로 나타납니다. 3) 더 복잡한 종류의 지역 상호 작용이 필요합니다.당신이 ThingID을 가지고 있고 그와 관련된 Thing을 얻을 필요가 경우가 어디 있는지, 무엇을


을 모르고? 이를 해결하기 위해 큰 map<int, Thing>ThingID에서 Thing으로 설정하고 거기를 들여다 볼 수 있습니다. 물론 여기에 약간의 중복성이 있습니다. 평면도 또는 위치 별지도에 Thing을 저장할 수 있고 다른 위치는 다른 위치를 참조 할 수 있습니다 (전자의 경우 현재 위치 만 포함). - 후자의 경우 ThingID 만 포함) 동기화 상태를 유지해야합니다.

Things가 플랫 맵에 있고 단순히 참조가 바이 포지션 맵에 저장되어 있으면 드래곤이 플랫 맵에 하나의 항목을 가질 수 있으며 점유하고있는 각각의 위치에 대해 하나씩), 동일한 위치를 가리키는 위치 별지도에서. 그런 다음 두 개의 위치에서 찾았 기 때문에 객체와 두 번 상호 작용하지 않도록 조심해야하는 코드를 작성해야합니다.

+0

감사합니다. 실제로 문제에 대답 할 수있는 지식이 풍부한 사용자가 있음을 알면 좋습니다. 실제 문제에 대답 할 수있는 아주 소수의 사용자 중 한 명이되어 주셔서 감사합니다. 나는 대부분의 질문과 답변이 아마추어 일뿐만 아니라 희망을 잃고있었습니다. 귀하의 답변은 전문적이며 많은 도움이됩니다. 매우 감사드립니다. –

+0

@ user15875 필자는 내 대답을 '전문적'인 것으로 생각하지 않을 것입니다. 주제에 관해서 내가 알고있는 것입니다. 나는 그것이 당신이 당신의 프로그램을 어떻게 쓸 것인지를 개념화하는 데 도움이되기를 바랍니다. :) – Patashu