我正在使用 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/

10-10 12:28