2014-04-07 3 views
0

나는 던전 게임에서 몇 명의 친구들과 일하면서 길 찾기를하고있다. 이 게임은 타일 기반 및 우리가 구현할 계획하고 길 찾기이 있습니다 :벡터지도, 나쁜 접근 자

클래스 PathMapper 모든 타일

클래스의 몬스터가 특정 방향으로 여행이 그리드를 사용하여 주어진 타일에서있는 거리의 격자를 생성 타일 ​​(당장은 항상 플레이어)

우리는 4 명의 플레이어를 가질 계획이지만 우리는 스크립트에서 동적 인 번호를 지원하고 싶습니다. 각 플레이어는 정수 형태의 ID를 가지고 있습니다.

각 플레이어마다 PathMapper로 생성 된 하나의 그리드가 필요하며 모든 몬스터가이를 공유 할 수 있습니다. 그리드를 생성하는 속도가 느려지므로 모든 몬스터에 대해 플레이어 당 한 번만 수행하면 길 찾기에 적합한 솔루션처럼 보입니다.

필자는 "PathMapper"라는 클래스를 가지고 있습니다.이 클래스는 시작, 타일의 타일을 거리의 격자로 생성합니다. 이론적으로, 이들 중 4 개가 생성 될 것입니다 - 각 플레이어마다 하나. 플레이어가 길을 찾을 때, 플레이어의 ID를 물어볼 것이고, 길 찾기에 사용할 타일의 격자를 물어볼 것입니다. 서버는 이러한 그리드를 "createMap (playerID, playerXPosition, playerYPosition)"로 업데이트합니다.

그래서 각 격자는이 벡터의 - 벡터 개인지도 "경로 맵"에서 플레이어의 ID에 매핑, 괴물에 액세스 할있는 값 "getLocalPath은()"

문제가 있다는 것입니다입니다 ("pathMap [ID] [x] .push_back (9000);") 나는 "EXE_BAD_ACCESS"를 얻습니다. "9000"을 넣으 려 시도하기 전에 약 12 ​​번의 반복을 거친다는 것을 알아 두어야합니다. 던전 -> 너비와 지하 감옥 -> 높이가 맞습니다 (두 가지 모두 20입니다. 실제 게임), ID의 '정확성'이 코드의 접근 자에 영향을 주어서는 안됩니다. 맞습니까? 여기

reserve(20) 
for(i=0; i<20; i++) 
    reserve(20) 
    for(j=0; j<20; j++) 
     access(i,j) // error!? 

코드입니다 :

나는 조금 내가 무엇을 내가 뭘 생각하는 것은 C를 그것을 통해 반복, 공간을 확보하고, 난 그냥 예약 된 메모리에 액세스하려고/B, 당황 해요 :

class PathMapper{ 
public: 
    PathMapper(Dungeon* d); 
    void createMap(int ID, int x, int y); 

    // returns values of the surrounding tiles (up, right, down, left) 
    std::vector<int> getLocalPath(int ID, int x, int y); 
private: 
    Dungeon* dungeon; 
    std::vector< std::vector<bool> > wallBitmap; 
    std::map<int, std::vector< std::vector<int> > > pathMap; 
} 

PathMapper::PathMapper(Dungeon* d) { 
    dungeon = d; 
    wallBitmap = dungeon->getWalls(); // bools tell if there is a wall on a tile 
} 

void PathMapper::createMap(int ID, int x, int y) { 
    pathMap[ID].reserve(dungeon->width()); 
    for(int x=0; x<dungeon->width(); x++) { 
     pathMap[ID][x] = std::vector<int>(); 
     pathMap[ID][x].reserve(dungeon->height()); 
     for(int y=0; y<dungeon->height(); y++) { 
      if(wallBitmap[x][y]) { 
       pathMap[ID][x].push_back(9000); // error is here 
      } 
      else { 
       pathMap[ID][x][y] = -1; 
      } 
     } 
    } 

    // code to calculate values here; shouldn't affect the code above 

} 
+0

이 조금 장황. 오류 및 오류를 일으키는 코드에 집중할 수 있습니까? – jww

답변

2

reserve은 벡터 (전용 용량)의 크기는 변경되지 않습니다, 당신은 resize이 필요합니다.

+0

나를 위해 조금 당황 스럽다. 감사합니다 :) – evangambit

1

어느

사용 resize :

pathMap[ID].resize(dungeon->width()); 
... 
pathMap[ID][x] = std::vector<int>(); 
pathMap[ID][x].resize(dungeon->height()); 

또는 생성자 직접 크기 패스 :

pathMap[ID].resize(dungeon->width()); 
... 
pathMap[ID][x] = std::vector<int>(dungeon->height()); 
+0

대단히 감사합니다. – evangambit