DXLibのDrawRotaGraphF()関数で画像が描画されない場合がある

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
yamapi

DXLibのDrawRotaGraphF()関数で画像が描画されない場合がある

#1

投稿記事 by yamapi » 1年前

DXLibとC++でブロック崩しを制作中の者ですが、DrawRotaGraphF()に関して、沼にハマってしまったので質問させていただきます。

以下のソースコードのように、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"));
}();



アバター
usao
記事: 1887
登録日時: 11年前

Re: DXLibのDrawRotaGraphF()関数で画像が描画されない場合がある

#2

投稿記事 by usao » 1年前

Block::sprite の初期化をなぜそんな形に書くのか?という 意図/理由/効能(?) みたいなのがわかりませんが…
その初期化が成されるタイミングの面に問題はないのでしょうか?
(そのライブラリには全体的な初期化みたいなのが必要だったかと.それより前のタイミングになってたりしませんか?)

yamapi

Re: DXLibのDrawRotaGraphF()関数で画像が描画されない場合がある

#3

投稿記事 by yamapi » 1年前

ありがとうございます。
初期化処理の後に呼び出すようにしたら上手くいきました。

返信

“C言語何でも質問掲示板” へ戻る