【问题标题】:Manipulation iterator list + pointers操作迭代器列表+指针
【发布时间】:2015-11-10 18:59:55
【问题描述】:

我正在尝试检查所有实体的所有冲突。我这样做: 我的父类“实体”有一个static std::list<Entity*> allEntities

所有子类的构造函数都有这句话Entity::AddEntity((*this));

我有一个std::list< Entity*> m_collisionWith; 属性,它将获取具有交集的实体的所有指针

之后,我在实体类中有一个静态函数:

for (std::list<Entity*>::iterator it = allEntities.begin(); it != allEntities.end(); it++) //to check everything...
{

    for (std::list<Entity*>::iterator itSec = allEntities.begin(); itSec != allEntities.end(); itSec++) // ... with everything
    {

        if ((*it)->m_spriteCharacter[(*it)->m_currentFrameCharacter].getGlobalBounds().intersects((*itSec)->m_spriteCharacter[(*itSec)->m_currentFrameCharacter].getGlobalBounds()) && *itSec != (*it)) //to_check if we have an intersection between two objects
        {
            if ((*it)->m_collisionWith.empty())
            {   
                (*it)->m_collisionWith.push_back((*itSec));
            }
            else
            {
                for (std::list<Entity*>::iterator itThr = (*it)->m_collisionWith.begin(); itThr != (*it)->m_collisionWith.end(); itThr++)
                {
                    if ((*itThr) != (*itSec)) //to check if the second object is not here yet. itThr will be every objects in m_collisionWith
                    {           
                        (*it)->m_collisionWith.push_back((*itSec)); 
                    }

                }
            }
        }
    }
}

所以我想检查一个实体是否与另一个实体有交集,如果是,我不想将它添加到 m_collision 中。 通常,如果我有 3 个实体,m_collision.size() 等于 3,但它会不停地长大

【问题讨论】:

  • 不用检查你要检查相交的两个元素是否是同一个元素吗?
  • @M.Shaw 他做了,它只是在一个很长的 if 语句的末尾
  • 这就是为什么我使用 if ((*itThr) != (*itSec)) itThr 将是 m_collision 属性中的所有指针,itSec 是第一个实体接触的实体编辑:是的 user3288829
  • @user3288829 啊,我错过了。 @Supernirito 将它放在前面作为短路可能是一个更好的主意,并且很可能评估 (*it != *itSwc) 比评估其他布尔表达式要快得多。
  • 很抱歉,但我看不到您想如何使用此代码执行此操作?我不知道你是否理解,但它 = 第一个实体,itSec = 第二个实体,itThr = entityWithWhatIHadAnInterection。

标签: c++ pointers iterator sfml


【解决方案1】:
for (std::list<Entity*>::iterator itThr = (*it)->m_collisionWith.begin(); itThr != (*it)->m_collisionWith.end(); itThr++)
{
     if ((*itThr) != (*itSec)) //to check if the second object is not here yet. itThr will be every objects in m_collisionWith
     {           
          (*it)->m_collisionWith.push_back((*itSec)); 
     }

}   

对于(*it)-&gt;m_collisionWith 中不等于*itSec 的每个元素,这会将itSec 推到后面。应该是:

bool exists = false;
for (std::list<Entity*>::iterator itThr = (*it)->m_collisionWith.begin(); itThr != (*it)->m_collisionWith.end(); itThr++)
{
     if ((*itThr) != (*itSec)) //to check if the second object is not here yet. itThr will be every objects in m_collisionWith
     {           
          exists = true;
          break;
     }

}
if (!exists) 
{
    (*it)->m_collisionWith.push_back((*itSec)); 
} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 2021-07-12
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 2015-06-26
    • 1970-01-01
    相关资源
    最近更新 更多