首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >以向量形式弹出的Ghost实例

以向量形式弹出的Ghost实例
EN

Stack Overflow用户
提问于 2011-12-01 19:22:52
回答 1查看 126关注 0票数 0

这把我难倒了。我有三个类-一个名为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实例的方法。第一个看起来像这样:

代码语言:javascript
运行
复制
    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()如下所示:

代码语言:javascript
运行
复制
std::vector<Plant*> Level::CheckPSector(int x, int y)
{
    return m_PlantSectors[y][x];
}

我尝试的第二件事是:

代码语言:javascript
运行
复制
        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;
            }
        }

使用以下命令:

代码语言:javascript
运行
复制
std::vector< std::vector< std::vector<Plant*> > >* Level::AccessPlantSectors()
{
    return &m_PlantSectors;
}

然而,这两种情况都会导致动物找到虚构的植物并跑到虚无中去。

我不想定期将可能很大的多维向量复制到Mob实例中,因为在任何时候都会有许多这样的实例,我希望程序能够平稳地运行。尽管如此,我只是通过复制整个向量而不是只复制相关的向量来做整个事情,我得到了相同的结果:虚构的植物。

我以前从来没有遇到过这样的问题;这里到底发生了什么?

编辑:也许我应该提一下,让所选的植物自我报告它们自己的位置和ID同样失败了,结果很荒谬,所以我用来访问私有成员的不仅仅是Plant中的函数。同时,查询所有现有的植物没有揭示任何与幽灵植物自我报告的信息。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-01 22:43:56

如果m_PlantSectors定义为:

代码语言:javascript
运行
复制
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()会编译。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8340553

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档