这把我难倒了。我有三个类-一个名为Level的大型类,其中包含指向Plant实例的指针的多维向量和指向Mob实例的指针的多维向量;这两个向量都用于根据位置对暴徒和植物进行分类,以便我可以根据它们的大致位置在较小的向量中搜索它们,而不是遍历所有现有的植物/暴徒以找到离给定点最近的一个。
向量如下所示,其中最小的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_PlantSectors2),他们有时会找到不存在的植物。
不仅如此,这些植物还具有不可能的位置,例如1.9777e+33或3.75853e-39。当我试图将所选植物的颜色更改为红色以便在视觉上找到它时,我发现屏幕上的植物(唯一的植物是我手动放置的植物)都没有改变颜色。
我用一个整数ID标记了所有的植物;共有36个植物,ID从1到36,但是我的用户找到的植物的ID像63或429这样的植物是不可能存在的,因为没有创建这样数量的植物(有一个植物创建函数始终报告有多少植物存在,所以没有植物被意外创建)。在想象中的植物之后,暴徒们都跑到了屏幕的左上角,死于饥饿。
所以不知何故,我创造了幽灵植物。到目前为止,我已经尝试了两种允许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中的函数。同时,查询所有现有的植物没有揭示任何与幽灵植物自我报告的信息。
发布于 2011-12-01 22:43:56
如果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()会编译。
https://stackoverflow.com/questions/8340553
复制相似问题