2011-12-01 57 views
0

这一个让我难住。我有三个类 - 一个名为Level的大类,其中包含指向Plant实例的多维向量指针和指向Mob实例的多维向量指针;这两种载体都是根据它们的位置对暴徒和植物进行分类,以便我可以根据它们的大概位置在较小的矢量中搜索每个矢量,而不是骑自行车穿过所有现有的植物/小怪,以便找到最靠近给定点。向量中弹出的Ghost实例

向量如下,最小的std ::向量表示每边有128个像素的正方形区域。通过将它们的X和Y坐标分开128并将它们添加到适当的扇区中,可以将移动装置和植物分类(我小心所得到的值实际上是整数)。

std::vector< std::vector< std::vector<Plant*> > >* m_PlantSectors

std::vector< std::vector< std::vector<Mob*> > >* m_AnimalSectors

小怪有时需要找到植物。这里是问题出现的地方:当小怪查询多维向量,在他们的近似区域搜索植物(如果怪物的坐标是128,例如[1,2]它搜索m_PlantSectors [2] [1]),他们有时会找到不存在的植物。

不仅如此,而且这些植物有不可能的位置,例如1.9777e + 33或3.75853e-39(例如)。当我尝试将所选植物的颜色改为红色以便直观地发现它时,我发现屏幕上没有任何植物(唯一植物是我手工放置的植物)改变了颜色。

我用一个整数ID标记了所有的植物;有36个植物,ID为1-36,但我的小怪发现的植物具有63或429的ID--这些植物不可能存在,因为没有创建这样的植物数量(有一个植物创建功能,一致地报告有多少植物存在,所以没有植物被意外创造)。所有的怪物都在虚构的植物之后跑到屏幕的左上角,并死于饥饿。

所以不知何故,我创造了幽灵植物。到目前为止,我已经尝试了两种单独的方法来允许Mob实例查找Plant实例。第一个是这样的:

float TargetDist = 256 * 256; 
    Plant* Candidate = 0; 
    Plant* ForageTarget = 0; 
    int xSect = m_X/128; 
    int ySect = m_Y/128; 
    std::vector<Plant*> ThisSect = pLevel->CheckPSector(xSect, ySect); 
    for (int i = 0; i < ThisSect.size(); ++i) 
    { 
     cout << "Searching in Sector (" << ySect << ", " << xSect << ")\n"; 
     Candidate = ThisSect[i]; 
     cout << "Candidate at: " << Candidate->GetX() << ", " << Candidate->GetY() << "\n"; 
     Candidate->Mark(); 
     //Calculate distance 
     float xDist = Candidate->GetX() - m_X; 
     float yDist = Candidate->GetY() - m_Y; 
     float tDist = sqrt(xDist * xDist + yDist * yDist); 
     if (tDist <= TargetDist) 
     { 
      ForageTarget = Candidate; 
      TargetDist = tDist; 
     } 
    } 

凡CheckPSector()看起来是这样的:

std::vector<Plant*> Level::CheckPSector(int x, int y) 
{ 
    return m_PlantSectors[y][x]; 
} 

我尝试的第二件事情是这样的:

 float TargetDist = 256 * 256; 
     Plant* Candidate = 0; 
     Plant* ForageTarget = 0; 
     int xSect = m_X/128; 
     int ySect = m_Y/128; 
     std::vector< std::vector< std::vector<Plant*> > >* Sectors = pLevel->AccessPlantSectors(); 
     for (int i = 0; i < (*Sectors)[ySect][xSect].size(); ++i) 
     { 
      cout << "Searching in Sector (" << ySect << ", " << xSect << ")\n"; 
      Candidate = (*Sectors)[ySect][xSect][i]; 
      cout << "Candidate at: " << Candidate->GetX() << ", " << Candidate->GetY() << "\n"; 
      Candidate->Mark(); 
      //Calculate distance 
      float xDist = Candidate->GetX() - m_X; 
      float yDist = Candidate->GetY() - m_Y; 
      float tDist = sqrt(xDist * xDist + yDist * yDist); 
      if (tDist <= TargetDist) 
      { 
       ForageTarget = Candidate; 
       TargetDist = tDist; 
      } 
     } 

使用此:

std::vector< std::vector< std::vector<Plant*> > >* Level::AccessPlantSectors() 
{ 
    return &m_PlantSectors; 
} 

然而,这两个让动物寻找想象中的植物并逃入空洞。

我不想定期复制潜在的大型多维向量到Mob实例中,因为在任何时候都会有很多这样的实例,并且我希望程序运行得有点平稳。即便如此,我只是试图通过复制整个向量而不是相关的向量来完成整个事情,并得到相同的结果:假想植物。

我从来没有像以前那样有过这样的问题;这里会发生什么?

编辑:也许我应该提到,让选择的植物自我报告自己的位置和ID失败的同样,出现了荒谬的结果,所以它不仅仅是我用来访问私人成员的Plant中的函数。同时,查询所有现有工厂并没有透露鬼工厂自我报告的信息。

+4

你的问题相当长,很难遵循。你可以考虑简化你的代码和场景,并创建一个自包含的测试用例吗? (见http://sscce.org) –

+0

是的,我想你是对的。我会看看我是否可以简化一些东西 - 也许我会回答我自己的问题。 – GarrickW

+1

我想知道你为什么使用多维数组的指针。闻起来像从未初始化的内存中读取:) :) – LiMuBei

回答

2

如果m_PlantSectors定义为:

std::vector< std::vector< std::vector<Plant*> > >* m_PlantSectors 

然后Level::AccessPlantSectors()应该返回m_PlantSectors,不&m_PlantSectors因为你已经有一个指针。

同样,Level::CheckPSector(int x, int y)应返回(*m_PlantSectors)[y][x],因为您需要在调用[]运算符之前先尊重指针。

正如你所写,Level::CheckPSector(int x, int y)返回随机存储器,我很惊讶Level::AccessPlantSectors()编译。

+0

+1关注它 –

+0

对不起,我只看到这么晚 - 谢谢你的澄清!我最终设法通过清理代码并将植物存储为堆中位置的指针来解决问题。 – GarrickW