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

时间:2016-04-26 06:07:05

标签: c++ oop graphics sfml

我在SFML中遇到white square problem。我正在开发一款使用平铺地图的游戏。 Game类会将tile集加载到文件中的sf :: Texture中,然后Game中的getTileById函数将" Cut"从tileset纹理中取出适当的tile。例如

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,并且tile只使用其sf::RenderWindow::draw(sf::Sprite)属性调用RenderWindow上的sprite_。例如

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

我想以这种方式绘图,因为Tile::draw方法是从Drawable类继承的,因此所有可绘制的对象都可以从Drawable继承并在其中实现绘图方法一种适合他们的方式,这在我的项目中是必要的。精灵被绘制成一个白色正方形,这让我觉得奇怪,因为tileSet_属性还没有被破坏,它是Game类的一个属性,但仍然存在。

有谁能告诉我这里发生了什么?任何帮助,将不胜感激。

1 个答案:

答案 0 :(得分:3)

您正在“按值”传递纹理。这意味着你在这个函数中得到了纹理的副本:

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;
}