以下のソースコードのように、Spriteと、Block、Barというクラスがあります。
Spriteはコンストラクタ内で、指定された画像ファイルを読み込み、draw()内で、DrawRotaGraphF()を呼び出して画像を描画します。
Barは、通常メンバとしてSpriteのスマートポインタを保持しています。一方Blockは、静的メンバとしてSpriteのスマートポインタを保持しており、クラス外で初期化するようになっています。
Barのdraw()内で、通常メンバとして保持しているSpriteのdraw()を呼び出した際は、正常に描画されるのですが、Blockのdraw()内で、静的メンバとして保持しているSpriteのdraw()を呼び出した際は、画面上になにも描画されません。
※試してみたこと
・デバック時に例外が投げられていないことから、問題の静的メンバがnull_ptrではないことを確認
・画像ファイル名に不備があるのかと思い、main関数の適当な場所にSpriteをインスタンス化し、"image/block.png"を渡してみたところ、正常に描画。
・Spriteのdraw()内のDrawRotaGraphF()を、敢えてDrawRotaGraphF(x ,y , exRate , angle ,LoadGraph("image/block.png") , FALSE , reverseX , reverseY)としてみたところ、正常に描画。
特に一番最後の項目より、SpriteのimageHandleに何らかの原因があるのではないかと思うのですが、それ以上はわかりません。どなたか教えてくださると幸いです。
class Sprite
{
protected:
int imageHandle;
public:
Sprite(const char* filename)
{
//画像の読み込み
this->imageHandle = LoadGraph(filename);
}
void draw(float x, float y, float exRate = 1.0f , float angle = 0.0f, bool reverseX = false , bool reverseY = false)
{
//this->imageHandleから画像を描画
//DrawRotaGraphF(x ,y , exRate , angle , LoadGraph("image/block.png") , FALSE , reverseX ,reverseY)とすると正常に描画
DrawRotaGraphF(x ,y , exRate , angle , this->imageHandle , FALSE , reverseX , reverseY);
}
};
class Bar : GameChara
{
private:
//通常のメンバ
std::unique_ptr<Sprite> sprite;
public:
Bar()
{
//コンストラクタで初期化
sprite = std::unique_ptr<Sprite>(new Sprite("image/bar.png"));
x = 320.0f;
y = 440.0f;
}
void draw() override
{
//描画メソッドの呼び出し
//ちゃんと描画される
sprite->draw(x , y);
}
};
class Block : GameChara
{
private:
//問題の静的メンバ
const static std::shared_ptr<Sprite> sprite;
public:
Block(float x , float y)
{
this->x = x;
this->y = y;
}
void draw() override {
//描画メソッド呼び出し
//何も描画されない
Block::sprite->draw(x , y);
}
};
//staticメンバの初期化
const std::shared_ptr<Sprite> Block::sprite = []
{
return std::unique_ptr<Sprite>(new Sprite("image/block.png"));
}();