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



我在SFML中遇到了白色方块问题。我正在开发一款使用平铺地图的游戏。Game类将从文件中将图块集加载为 sf::Texture,然后 Game 中的 getTileById 函数将从图块集纹理中"剪切"出相应的磁贴。例如。

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&) 方法(在要绘制的渲染窗口中传递)。此方法采用 sf::RenderWindow,磁贴只是使用其 sprite_ 属性调用 RenderWindow 上的sf::RenderWindow::draw(sf::Sprite)。例如。

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

我想以这种方式进行绘制,因为 Tile::draw 方法是从 Drawable 类继承的,因此所有可绘制的对象都可以从 Drawable 继承并以适合它们的方式实现其绘制方法,这在我的项目中是必需的。不过,精灵被绘制成一个白色的方块,这让我感到很奇怪,因为tileSet_属性没有被破坏,它是Game类的属性并且仍然存在。

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

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

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

最新更新