2

sfmlスプライトクラス.setTexure()メソッドは、イテレーターのコンストラクター内では機能しませんが、イテレーターが既に作成されている場合は機能します

ウィンドウに描画されているフレームの構造を構築しようとしています。スプライトクラスとテクスチャクラスを持つsfmlライブラリを使用しています。frameData構造のコンストラクターで、ファイルからテクスチャをロードし、.setTexture()メソッドを使用してスプライトに適用します。プログラムをコンパイルして実行すると、マシンに応じて白いブロックが発生するか、プログラムがクラッシュします。

frameDataのコンストラクターの外で.setTexture()を使用してテクスチャへのポインター参照を作成すると、機能します。

これが、さまざまなフレームを反復処理するイテレータ構造を使用している場合はすべてです。関連するコードは次のとおりです。最初に、これはFrameData構造体のヘッダーにあります。

private:
    struct FrameData
    {
        FrameData(const std::string& fileName, int frameDelay);

        sf::Texture texture;
        sf::Sprite sprite;
        unsigned int frameDelay;
    };

次に、実際のコンストラクターは機能していません。

const sf::Sprite& SpriteAnimator::currentFrame() const
{
    return currentFrame_->sprite;
}

SpriteAnimator::FrameData::FrameData(const std::string& fileName, int frameDelay)
: frameDelay(frameDelay)
{
    texture.loadFromFile(fileName);
    sprite.setTexture(texture);
}

そして第三に、これが機能するものです:

const sf::Sprite& SpriteAnimator::currentFrame() const
{
    currentFrame_->sprite.setTexture(currentFrame_->texture);
    return currentFrame_->sprite;
}

SpriteAnimator::FrameData::FrameData(const std::string& fileName, int frameDelay)
: frameDelay(frameDelay)
{
    texture.loadFromFile(fileName);
    sprite.setTexture(texture);
}

なぜこれが起こるのかについてのアイデアはありますか、私たちは何かを逃していますか?コンストラクターを適切に機能させたいのですが、現在のフレームはテクスチャの変更よりも頻繁に返されるため、現在のフレームが返されるたびにテクスチャを更新する必要はありません。

ありがとうございました!

4

2 に答える 2

1

これについても同様の問題がありました。私の解決策は、すべてのテクスチャをクラス外のコンテナに格納し、テクスチャ自体の代わりにテクスチャへのポインタを使用することでした。クラスから別のオブジェクトを作成する場合、同じテクスチャを複数保存する必要がないため、これは 1 つの石で 2 羽の鳥を殺します。

于 2012-06-22T17:11:26.247 に答える
1

解決しました!sf::sprite のクラス ドキュメントの最後の段落を読んでください。

sf::Sprite インスタンスは使用するテクスチャをコピーせず、参照を保持するだけであることに注意してください。したがって、sf::Sprite によって使用されている間は sf::Texture を破棄してはなりません (つまり、スプライトを作成するためにローカルの sf::Texture インスタンスを使用する関数を記述してはなりません)。

したがって、このクラスの範囲外のテクスチャのリポジトリを作成し、参照を渡すと、strongdrink が推奨されるように機能します!

于 2012-06-22T16:34:42.213 に答える