如何检测SFML中的碰撞是否存在向量中的sprite?

时间:2017-01-25 00:30:24

标签: c++ sfml

我有一个包含精灵的矢量,我用它作墙:

std::vector<Sprite> wallSprites(30, Sprite(walltexture));

重复这些:

for (int i = 0; i < wallSprites.size(); i++) {
    wallSprites[i].setPosition(wallPosX,0);
    wallPosX += 63;
    wallSprites[i].setOrigin(0,0);
}

然后绘制:

for (int i = 0; i < wallSprites.size(); i++) {
    app.draw(wallSprites[i]);
}

然后我想看看汽车精灵是否与任何墙壁精灵相撞。我正在尝试使用此代码迭代所有的wallSprites,但它只检测到汽车击中最后一个墙精灵:

for (int i = 0; i < wallSprites.size(); i++) {
    if (car.getGlobalBounds().intersects(wallSprites[i].getGlobalBounds()))
    {
        crashed = true;
    }
    else
    {  // We're not colliding
        crashed = false;
    }
}

我哪里出错了?

1 个答案:

答案 0 :(得分:0)

如果汽车撞到的墙不是最后一面,crashed将设置为true。如果它没有与下一个墙碰撞,它将再次设置为false。那不是你想要的。

因此,解决方案很简单:

for (int i = 0; i < wallSprites.size(); i++) {
    if (car.getGlobalBounds().intersects(wallSprites[i].getGlobalBounds()))
    {
        crashed = true;
        break;
    }
}

这假设crashed开始false。当它到达任何墙时,它将变为true,这是所需的行为。还有一个额外的break,它不是必须的,但为什么我们已经知道答案时继续呢?

或者,根据您的代码,您的crashed变量可能已成为该修复的冗余,允许您将其减少为:

for (int i = 0; i < wallSprites.size(); i++) {
    if (car.getGlobalBounds().intersects(wallSprites[i].getGlobalBounds()))
    {
        handleCarCollision();
        break;
    }
}