这一个让我难住。我有三个类 - 一个名为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
中的函数。同时,查询所有现有工厂并没有透露鬼工厂自我报告的信息。
你的问题相当长,很难遵循。你可以考虑简化你的代码和场景,并创建一个自包含的测试用例吗? (见http://sscce.org) –
是的,我想你是对的。我会看看我是否可以简化一些东西 - 也许我会回答我自己的问题。 – GarrickW
我想知道你为什么使用多维数组的指针。闻起来像从未初始化的内存中读取:) :) – LiMuBei