收藏品,不会在联系时删除

问题描述 投票:0回答:1

我创建了可收藏的对象和一个矢量来存储它们,以便在联系时轻松有效地删除它们。

我知道我的联系人侦听器正常工作,并且我的收藏品的标记GetBody和SetUserData函数也正常工作。

我已经尝试检查每个可收集对象的联系,该联系确实起作用,尽管由于其他原因会引发用户数据错误。

我知道这可行,因为如果我使用以下代码:

    if (m_coin2->marked())
    {
        m_coin2->setFillColor(sf::Color::Blue);
    }

所讨论的硬币对象实际上会变成蓝色。

这是我的游戏头文件(仅相关代码:):

class Game : public sf::Drawable {
private:
    //Collectibles
    Collectible* m_coin;
    Collectible* m_coin2;
    Collectible* m_coin3;
    Collectible* m_coin4;
    Collectible* m_coin5;
    Collectible* scoreBlock;

    Character* m_character;

    //score
    int score = 0;
public:
    std::vector<Collectible> m_coins;
};

这是我的game.cpp文件(仅相关部分):

//In the constructor
    //create collectibles
    //hud elements
    scoreBlock = new Collectible(m_pWorld, sf::Vector2f(scoreText.getPosition().x + .6f, -2.6f), sf::Vector2f(0.5f, 0.5f), 0.f, &m_collect);
    //collectibles
    m_coin = new Collectible(m_pWorld, sf::Vector2f(4.f, 2.15f), sf::Vector2f(0.3f, 0.3f), 0.f, &m_collect);
    m_coin2 = new Collectible(m_pWorld, sf::Vector2f(16.5f, -0.6f), sf::Vector2f(0.3f, 0.3f), 0.f, &m_collect);
    m_coin3 = new Collectible(m_pWorld, sf::Vector2f(30.f, 0.4f), sf::Vector2f(0.3f, 0.3f), 0.f, &m_collect);
    m_coin4 = new Collectible(m_pWorld, sf::Vector2f(20.f, 1.4f), sf::Vector2f(0.3f, 0.3f), 0.f, &m_collect);
    m_coin5 = new Collectible(m_pWorld, sf::Vector2f(47.f, -1.f), sf::Vector2f(0.3f, 0.3f), 0.f, &m_collect);

m_coins = { *m_coin, *m_coin2, *m_coin3, *m_coin4, *m_coin5 };

//In the update function
    for (auto it = m_coins.begin(); it != m_coins.end(); it++)
    {
        if (it->marked())
        {
            m_pWorld->DestroyBody(it->GetBody());
            m_coins.erase(it);
            it->SetUserData();
            score++;
        }
    }

此刻,玩家和收藏品之间没有任何联系,我认为这可能与初始化矢量的方式有关吗?

感谢您的任何帮助,谢谢。

c++ box2d sfml stdvector
1个回答
0
投票

如果迭代向量,最好不要在迭代循环中使用向量的擦除功能。请改用while循环。或问题在于您仅使用硬币的副本,而不使用硬币的指针。

这就是我要做的:

...
std::vector<Collectible*> m_coins;
...

m_coins = { m_coin, m_coin2, m_coin3, m_coin4, m_coin5 };

//In the update function
     auto it = m_coins.begin();
     while (it != m_coins.end())
     {
         if ((*it)->marked())
         {
            m_pWorld->DestroyBody((*it)->GetBody());
            (*it)->SetUserData();               
            m_coins.erase(it);  
            score++;
         }
         it++;
     }
© www.soinside.com 2019 - 2024. All rights reserved.