2016-04-26 11 views
2

SFMLでwhite square problemが発生しました。私はタイルマップを使用するゲームに取り組んでいます。 A Gameクラスは、ファイルからsf :: Textureとしてタイルセットをロードし、次にGameのgetTileById関数は、適切なタイルをタイルセットテクスチャから「カット」します。例えば。SFMLの白い四角、異なるオブジェクトに格納されたスプライトとテクスチャ

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オブジェクトに渡され、スプライトがそのスプライト属性に設定されます。例えば。

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

Gameオブジェクトは、この方法ですべてのタイルをロードし、それらをすべてベクターに格納します。それらを描画するには、ベクトルをループし、それぞれのベクトルでTile::draw(sf::RenderWindow&)メソッドを呼び出します(レンダリングするRenderWindowを渡す)。このメソッドはsf :: RenderWindowを受け取り、タイルはRenderWindowのsprite_属性でsf::RenderWindow::draw(sf::Sprite)を呼び出します。例えば。

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

Tile::draw方法がDrawableクラスから継承されるため、描画可能であるすべてのオブジェクトがDrawableの継承と自分に合った方法で彼らの描画メソッドを実装することができるように、私は、この方法を描くやってみたいです、私のプロジェクトに必要なもの。スプライトは白い四角形として描画されていますが、tileSet_属性が破棄されていないことを奇妙に感じます。それはGameクラスの属性であり、依然として存在します。

ここで何が起こっているか教えてもらえますか?どんな助けもありがとう。

答えて

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; 
} 
関連する問題