幽灵实例以矢量出现

Ghost instances popping up in vectors

本文关键字:实例 幽灵      更新时间:2023-10-16

这个问题难倒了我。我有三个类——一个叫做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()编译。