幽灵实例以矢量出现
Ghost instances popping up in vectors
这个问题难倒了我。我有三个类——一个叫做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_PlantSectors[2][1]),它们有时会发现不存在的植物。
不仅如此,这些植物的位置是不可能的,例如在1.97777 e+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
中的函数来访问私有成员。同时,查询所有现存的植物并不能显示任何与幽灵植物自我报告的信息。
如果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()
编译。
- 从C++实例化QML
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 如何创建一个空的全局类并在启动时实例化它
- 无法创建抽象类的实例
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 我收到以下错误:抛出'std::bad_alloc'实例后终止调用
- 建议在运行时将带有类实例的列表从c++导入qml
- 约束和显式模板实例化
- 通过实例理解std::move及其目的
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 正在生成未知类实例
- 从DLL中删除类的实例
- 敌人幽灵实例/非唯一对象
- 幽灵实例以矢量出现