c++ - SFML中的White Square,Sprite和texture存储在不同的对象中

标签 c++ oop graphics sfml

我正在经历white square problem在 SFML 中。我正在开发一款使用平铺 map 的游戏。 Game 类将从文件中将图 block 集加载为 sf::Texture,然后 Game 中的 getTileById 函数将从图 block 集纹理中“剪切”出适当的图 block 。例如。

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

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

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

Game 对象将以这种方式加载所有图 block 并将它们全部存储在 vector 中。为了绘制它们,它将循环遍历 vector 并对每个 vector 调用 Tile::draw(sf::RenderWindow&) 方法(传入要绘制的 RenderWindow)。此方法采用 sf::RenderWindow,图 block 只需使用其 sprite_ 属性调用 RenderWindow 上的 sf::RenderWindow::draw(sf::Sprite) 即可。例如。

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

我想以这种方式进行绘制,因为 Tile::draw 方法是从 Drawable 类继承的,因此所有可绘制的对象都可以继承自Drawable 并以适合他们的方式实现他们的绘图方法,这在我的项目中是必要的。不过, Sprite 被绘制为白色方 block ,这让我感到奇怪,因为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;
}

关于c++ - SFML中的White Square,Sprite和texture存储在不同的对象中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36856498/

相关文章:

vector - 从高度图计算法线

c++ - 13个字符的数字字符串到数字

c++ - 将基类模板的 `this` 类型转换为其派生类

c++ - 使用 boost C++ 单元测试套件测试非 fatal error 消息

c++ - 如何在Xlib应用程序中等待VSYNC?

java - 使用 JNDI 在 Tomcat 中共享 servlet session 对象和数据

python - 使用类方法作为默认参数

java - 如何用多态替换switch?

CSFML 意外的重复纹理行为

java - 制作图形按钮到JPanel