这个让我难过。我有三个类 - 一个名为Level
的大类,其中包含指向Plant
个实例的指针的多维向量和指向Mob
个实例的指针的多维向量;这两个载体都是根据它们的位置对怪物和植物进行分类,这样我就可以根据它们的大致位置在较小的载体中搜索每个载体,而不是在所有现有的植物/怪物中循环以找到最接近a的植物/怪物。给定点。
向量如下,最小的std ::向量表示每侧128像素的正方形区域。通过将它们的X和Y坐标除以128并将它们添加到适当的扇区(我很小心,结果值实际上是整数)来对怪物和植物进行分类。
std::vector< std::vector< std::vector<Plant*> > >* m_PlantSectors
std::vector< std::vector< std::vector<Mob*> > >* m_AnimalSectors
怪物有时需要找到植物。这就是问题出现的地方:当小怪查询多维向量时,在它们的近似区域中搜索植物(如果是mob的coords / 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
我用来访问私人的功能成员。同时,查询所有现有的植物并没有透露幽灵植物自我报告的信息。
答案 0 :(得分: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()
编译。