我使用SFML作为学习练习制作Arkanoid克隆。对于PowerUp类,我有一个像这样的更新方法:
void PowerUp::update(FrameTime mFT) {
if (!(bottom() >= windowHeight))
shape.move(velocity * mFT);
else
onGround = true;
}
在我的PowerUpManager类中,我有一个PowerUp向量,此功能可以立即更新所有PowerUp:
void PowerUpManager::update(FrameTime mFT) {
for (auto powerUp : mPowerUps)
powerUp.update(mFT);
}
但是,这似乎不起作用。如果我运行这个代码,那么在产生之后,通电就会保持不变,并且不要向下移动,就像它们应该的那样。但是,如果我替换
for (auto powerUp : mPowerUps)
powerUp.update(mFT);
更传统但更老式的
for (int i{ 0 }; i < mPowerUps.size(); ++i)
mPowerUps[i].update(mFT);
,一切正常,应该如此。这告诉我这些2位代码的含义有所不同。据我所知,前者只是后者的新C ++语法糖版本。有什么我想念的吗?
甚至更奇怪的是,我的所有功能都是,
void PowerUpManager::draw(sf::RenderWindow& window) {
for (auto powerUp : mPowerUps)
powerUp.draw(window);
}
,工作正常,没有任何问题。
答案 0 :(得分:12)
问题在于循环powerUp
是来自mPowerUps
容器的副本。您需要使用引用:
for (auto& powerUp : mPowerUps)
powerUp.update(mFT);