SFML 中的白色方块,Sprite 和纹理存储在不同的对象中

White Square in SFML, Sprite and texture stored in different objects

我正在体验 SFML 中的 white square problem。我正在开发一款使用平铺地图的游戏。 Game class 将从文件中加载瓦片集作为 sf::Texture,然后 Game 中的 getTileById 函数将从瓦片集中 "Cut" 取出适当的瓦片质地。例如

sf::Sprite GameScreen::getSpriteByPos(int pos, sf::Texture texture, int tileSize) {
    sf::IntRect subRect;
    subRect.left = (pos-1)*tileSize;
    subRect.top = (pos-1)*tileSize;
    subRect.width = tileSize;
    subRect.height = tileSize;

    sf::Sprite tileSprite(texture, subRect);
    return tileSprite;
}

然后精灵将被传递到一个 Tile 对象中,该对象将为其设置其 sprite_ 属性。例如

void Tile::setSprite(sf::Sprite sprite) {
    sprite_ = sprite;
}

Game对象将以这种方式加载所有图块并将它们全部存储在一个向量中。要绘制它们,它将遍历向量并在每个向量上调用 Tile::draw(sf::RenderWindow&) 方法(传入要绘制的 RenderWindow)。此方法采用 sf::RenderWindow 并且图块仅使用其 sprite_ 属性调用 RenderWindow 上的 sf::RenderWindow::draw(sf::Sprite)。例如

void Tile::draw(sf::RenderWindow &window){
    window.draw(sprite_);
    return;
}

我想这样画是因为Tile::draw方法继承自一个Drawableclass,所以所有可绘制的对象都可以继承Drawable并实现他们的绘画方法适合他们,这在我的项目中是必要的。尽管 sprite 被绘制为白色正方形,这让我感到奇怪,因为 tileSet_ 属性没有被破坏,它是 Game class 的一个属性并且仍然存在。

谁能告诉我这是怎么回事?任何帮助,将不胜感激。

您正在传递纹理 "by value"。这意味着您可以在此函数中获得纹理的副本:

sf::Sprite GameScreen::getSpriteByPos(int pos, sf::Texture texture, int tileSize) {
    sf::IntRect subRect;
    subRect.left = (pos-1)*tileSize;
    subRect.top = (pos-1)*tileSize;
    subRect.width = tileSize;
    subRect.height = tileSize;

    sf::Sprite tileSprite(texture, subRect);
    return tileSprite;
}

但是当函数结束时那个副本被销毁了。

你不需要那个副本,所以不要复制:

sf::Sprite GameScreen::getSpriteByPos(int pos, const sf::Texture& texture, int tileSize) {
    sf::IntRect subRect;
    subRect.left = (pos-1)*tileSize;
    subRect.top = (pos-1)*tileSize;
    subRect.width = tileSize;
    subRect.height = tileSize;

    sf::Sprite tileSprite(texture, subRect);
    return tileSprite;
}