我正在使用 SFML 作为学习练习制作打砖块克隆。对于 PowerUp 类,我有一个像这样的更新方法:
void PowerUp::update(FrameTime mFT) {
if (!(bottom() >= windowHeight))
shape.move(velocity * mFT);
else
onGround = true;
}
在我的 PowerUpManager 类中,我有一个 PowerUp vector ,这个函数可以一次更新所有 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++ 语法糖版本。有什么我想念的吗?
更奇怪的是我的 draw all 功能,
void PowerUpManager::draw(sf::RenderWindow& window) {
for (auto powerUp : mPowerUps)
powerUp.draw(window);
}
,工作正常,没有问题。
最佳答案
问题是在循环中 powerUp
是来自 mPowerUps
容器的拷贝。您需要使用引用:
for (auto& powerUp : mPowerUps)
powerUp.update(mFT);
关于C++11 for 循环语法无法正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24761148/