无法删除 C++ 中的列表元素

亚瑟五世

我正在开发一个小游戏,遇到了列表的大问题。

这是我的代码:

void cCollisionManager::checkCollision(cPlayer * pPlayer, std::list<cAsteroid*> *asteroidList, std::list<cShot*> *ShotList)
{       
    sf::FloatRect PlayerBox = pPlayer->getSprite()->getGlobalBounds();

    for (auto it : *asteroidList) {
        for (auto es : *ShotList) {
            sf::FloatRect asteroidboundingBox = it->getSprite()->getGlobalBounds();
            sf::FloatRect ShotBox = es->getSprite().getGlobalBounds();

            if (asteroidboundingBox.intersects(ShotBox)) {          

                it = asteroidList->erase(it);

                *pPlayer->pPunkte += 1;
                std::cout << *pPlayer->pPunkte << std::endl;
            }

            if (asteroidboundingBox.intersects(PlayerBox)) {
                if (*pPlayer->phealth >= 0.f)
                    *pPlayer->phealth -= 0.5f;
            }  
        }
    }
}

我使用了 SFML,基本上一切正常。但是如果我想删除碰撞的小行星和镜头,程序会出现错误退出。在 if 循环中,我试图擦除对象,但编译器也给出了一个错误,指出参数类型与我提供给它的对象类型不同。

编辑我又看了另一个问题,你向我推荐了,但我仍然没有找到解决这个问题的方法。因此,如果我将代码更改为 while 循环,游戏将无法处理它,因为实际上在 SFML 主循环的每个调用中都会调用碰撞管理器。所以它只会卡在我的碰撞循环中。所以我稍微更改了我的代码,但仍然无法正常工作。

亚瑟五世

不要修改使用 range-for 枚举的序列。使用迭代器和适当的擦除结果。– WhozCraig

这实际上就是它的答案。我犯了错误 - 使用 for 循环而不是 while 循环,所以我的代码有一些大问题和糟糕的构造想法 - 幸运的是现在一切正常!这是我的最终代码:

    auto it = asteroidList->begin();
auto es = ShotList->begin();

while (it != asteroidList->end()) {

    sf::FloatRect PlayerBox = pPlayer->getSprite()->getGlobalBounds();
    sf::FloatRect asteroidboundingBox = (*it)->getSprite()->getGlobalBounds();

    while (es != ShotList->end()) 
    {
        sf::FloatRect ShotBox = (*es)->getSprite().getGlobalBounds();

            if (asteroidboundingBox.intersects(ShotBox)) {
                it = asteroidList->erase(it);   
                es = ShotList->erase(es);   

                std::cout << "Asteroid destroyed" << std::endl;
                *pPlayer->pPunkte += 1;
                std::cout << *pPlayer->pPunkte << std::endl;
                }


        if (es != ShotList->end())
            es++;   

    }
        if (asteroidboundingBox.intersects(PlayerBox)) 
        {
            if (*pPlayer->phealth > 3.f) {
                *pPlayer->phealth -= 5.f;
                it = asteroidList->erase(it);   
            }   
            else
                *pPlayer->pBStateAlive = false;
        }


    if (it != asteroidList->end()) {
        it++;   
        es = ShotList->begin();     

    }


}

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从列表C中删除元素

来自分类Dev

从列表向量中删除元素C ++

来自分类Dev

从列表向量中删除元素C ++

来自分类Dev

从嵌套列表C#中删除元素

来自分类Dev

使用递归C ++从列表中删除元素

来自分类Dev

从C#中的列表内的列表中删除元素。

来自分类Dev

我需要从C中的列表中删除相同的元素

来自分类Dev

从 C++ 中的列表中删除元素的问题

来自分类Dev

如何在C++中删除列表中的某些元素

来自分类Dev

无法使用UpdateItem从列表中删除元素

来自分类Dev

无法从列表中删除vstack元素

来自分类Dev

从数组中删除元素。指数。C#。列表<double>

来自分类Dev

双链列表中的C ++删除元素功能

来自分类Dev

删除列表c ++中的最后3个元素

来自分类Dev

删除列表c ++中的最后3个元素

来自分类Dev

删除列表中的元素

来自分类Dev

无法在C#中删除绘图线

来自分类Dev

我应该如何使用谓词逻辑基于列表对象包含C#中另一个列表中的元素,而从通用列表中删除元素?

来自分类Dev

我应该如何使用谓词逻辑基于列表对象在C#中从另一个列表中包含元素,从而从通用列表中删除元素?

来自分类Dev

无法从哈希图的数组列表中删除重复的元素

来自分类Dev

由于超出界限,无法从列表中删除元素

来自分类Dev

无法从表单设计列表中删除元素

来自分类Dev

如何删除C ++中添加到链接列表中的最后一个元素

来自分类Dev

VUEJS从列表中删除元素?

来自分类Dev

从列表中删除当前元素

来自分类Dev

如何从列表中删除元素?

来自分类Dev

从日期列表中删除元素

来自分类Dev

从列表元素中删除项目?

来自分类Dev

比较列表中的元素并删除

Related 相关文章

热门标签

归档