4

こんにちは、SFML アプリケーションでスプライトを描画したいのですが、クラス メンバーである画像とテクスチャを使用すると、テクスチャが常に白くなります。

クラスメンバー:

sf::Sprite myimg;
sf::Image myimg_image;
sf::Texture myimg_texture;

次に、cppファイルでこのようなスプライトを作成すると

// create image
myimg_image.create(icon.width, icon.height, icon.pixelData);

// create texture from image
myimg_texture.create(icon.width, icon.height);
myimg_texture.update(myimg_image);

// apply texture to sprite
myimg.setTexture(myimg_texture);

window.draw(myimg) で描画すると、白いスプライトのみが描画されます

(icon は画像情報を含む構造体です。GIMP で C ソースとしてエクスポートして使用したい画像です)

少し実験したところ、上記のクラスメンバーをクラスメンバーとしてではなく、メイン関数内のローカル変数として作成すると、画像が適切に描画されることがわかりました...

しかし、他の機能からもアクセスしたいので、メンバーとして必要なので、それは役に立ちません

もうどうすればいいのかわからないので、助けてください:(

4

1 に答える 1

6

これは白方陣問題と呼ばれます。

基本的に、ある時点でオブジェクトがコピーされますが、コピー コンストラクターはコピーされたスプライト テクスチャを更新してコピーされたテクスチャを使用しません。元のテクスチャは破棄されるため、コピーされたスプライトには有効なテクスチャがなくなります。

簡単な修正では、コピー コンストラクターとコピー代入演算子内で初期化コードを実行するだけです。


ところで

myimg_texture.create(icon.width, icon.height);
myimg_texture.update(myimg_image);

icon.pixelDataの代わりに直接使用できるmyimg_imageため、 はまったく必要ありませんsf::Image

sf::Imageまたは、別の目的で必要な場合は、次のようにすることもできます。

myimg_texture.loadFromImage(myimg_image);
于 2013-10-17T18:52:23.277 に答える