【发布时间】:2020-05-25 14:59:13
【问题描述】:
我创建了可收藏的对象和一个向量来存储它们,以便在接触时轻松有效地删除。
我知道我的联系人监听器有效,我的收藏品标记的 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++;
}
}
目前,这对玩家和收藏品之间的接触没有任何影响,我认为这可能与我初始化向量的方式有关?
感谢您的帮助。
【问题讨论】:
-
在这一行之后 - 'm_coins.erase(it)' 它不再是 vailde,你不能使用它
-
我是否正确地说它需要它=?
-
我不知道这是否能解决你的问题,但移动它->SetUserData();一个队列(之前)擦除调用
-
为什么不立即用硬币初始化向量,为什么要使用 coin1-5?像这样的东西 - m_coins.push_back(new Collectible(m_pWorld, sf::Vector2f(4.f, 2.15f), sf::Vector2f(0.3f, 0.3f), 0.f, &m_collect))
-
它并没有解决我的问题,但是我已经做出了改变,谢谢。