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
方法继承自一个Drawable
class,所以所有可绘制的对象都可以继承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;
}
我正在体验 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
方法继承自一个Drawable
class,所以所有可绘制的对象都可以继承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;
}