DirectXでの画像の表示

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

DirectXでの画像の表示

#1

投稿記事 by 苺ぷりん » 12年前

初投稿です。よろしくお願いしますm(__)m

[1] 質問文
 [1.1] 自分が今行いたい事は何か
DirectXの「D3DXCreateTextureFromFileEx」関数を用いて画像を表示しようと思っているのですが
エラーがでます。
いちよう画像単体の表示、DirectInputを用いた画像の移動まではできたので、
使いやすいように関数にまとめてみようと挑戦しているところです。
目標はDXライブラリの「LoadGraph関数」を目指しています。
引数に「ファイルパス」、戻り値に「グラフィックハンドル」を

 [1.2] どのように取り組んだか(プログラムコードがある場合記載)
ウィンドウの表示やDirect3D初期化処理などは省略しました。
必要な場合は載せます。
単体画像の表示まではエラーなくいったので変更箇所だけ載せました

コード:

 
//グローバル変数
LPD3DXSPRITE pSprite;
LPDIRECT3DTEXTURE9 *pTexture;	
int iTexttureNum=0;
const char *pFileName=NULL;

//画像読み込み関数
int InitSprite(const char *pFileName){
	// 「スプライトオブジェクト」の作成
	if(FAILED(D3DXCreateSprite(pDevice,&pSprite)))
	{
		EndGameSystem();           //エラー処理関数
	}

	pTexture = new LPDIRECT3DTEXTURE9[iTexttureNum];
	//「テクスチャオブジェクト」の作成
		if(FAILED(D3DXCreateTextureFromFileEx(
			pDevice,
			pFileName,	         //ファイル名
			D3DX_DEFAULT,				//幅 (ピクセル単位) 
			D3DX_DEFAULT ,				//高さ (ピクセル単位)
			D3DX_DEFAULT,
			0,
			D3DFMT_UNKNOWN,
			D3DPOOL_DEFAULT,
			D3DX_FILTER_NONE,
			D3DX_DEFAULT,
			0xff000000,
			NULL,
			NULL,
			&pTexture[iTexttureNum]		//テクスチャ名
		)
			)
				)
		{
			EndGameSystem();       //エラー処理関数
		}
			
				iTexttureNum++;
		
	return iTexttureNum;
}
	
//解放処理
void EndSprite(){

	for(int i=0;i<=iTexttureNum;i++){
	SAFE_RELEASE(pTexture[i]);
	}
	iTexttureNum=0;

	SAFE_DELETE(pTexture);

	SAFE_RELEASE(pSprite);
}
 
 [1.3] どのようなエラーやトラブルで困っているか(エラーメッセージが解る場合は記載)
「Test_DirectX_Game.exe の 0x00073432 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0xabababab を読み込み中にアクセス違反が発生しました。」というエラーです。
いちよう画像は表示されて、画像を移動されることもできるのですが、デバック終了すると上記のようなエラーが出てしまいます。
エラー場所が出ているのですが、どこかわかりません。

 [1.4] 今何がわからないのか、知りたいのか
エラーの解決方法、アドバイスをお願いいたします。

[2] 環境  
 [2.1] OS : Windows8 64bit
 [2.2] コンパイラ名 : VC++ 2010 express

[3] その他
 ・どの程度C言語を理解しているか
c言語は学校で一通りやりましたが、ポインタが理解できていません。その他ちらほら理解できていないところあり
クラスは入門書でやりましたが、実用LVまでにはいきません。
躓いたら検索や本を読み直すという感じです。

N.R

Re: DirectXでの画像の表示

#2

投稿記事 by N.R » 12年前

全体の流れは分かりませんが
iTexttureNum が 0 の状態で
pTexture = new LPDIRECT3DTEXTURE9[iTexttureNum];
が実行されているならそれはまずいですね

苺ぷりん

Re: DirectXでの画像の表示

#3

投稿記事 by 苺ぷりん » 12年前

回答ありがとうございます。
iTexttureNumを最後のとこで++するとreturnで返したら1になってしまいますね。
最初のうちに++にすればいいのかな。解放処理も1からに変更して。

コード:

 
//描画関数
void DrawSprite(int i,float PosX,float PosY){

		D3DXVECTOR3 vec3Position(PosX,PosY,0);

		pSprite->Draw(
			pTexture[i],
			NULL,			//イメージの使用する範囲(NULLでテクスチャ全体)
			NULL,			//テクスチャの中心位置(NULLで左上)
			&vec3Position,	    //スプライトの描画位置
			0xffffffff
			);
	
}
 
上の描画関数を使って

コード:

 
int h1,h2;
h1=InitSprite("Sprite1.bmp");
h2=InitSprite("Sprite2.bmp");
DrawSprite(h1,50,50);
DrawSprite(h2,50,100);
これで画像2枚が表示されてほしいのですが、同じエラーがでてしまいます。。
①InitSpriteでpTexture[1]に画像データを格納する
②InitSpriteでpTexture[2]に画像データを格納する
③DrawSpriteでpTexture[1]を呼び出す
④DrawSpriteでpTexture[2]を呼び出す

ということをやりたい、やっているつもりなのですが。
pTexture = new LPDIRECT3DTEXTURE9[iTexttureNum];
ここでpTexture[iTexttureNum]ができていると思っているのですが、
違いますよね。書籍から抜き出しただけなので理解していなくて。
難しいですね。。

N.R

Re: DirectXでの画像の表示

#4

投稿記事 by N.R » 12年前

ポインタがまだ分からないという事ですので
ポインタを使わない方がよいと思います。

画像の表示部分をまず完成させて、それからポインタにする事に挑戦してはいかがでしょうか

もう画像の扱いは大体分かってこれからポインタを勉強したいのならばお手伝いします。

まずは方向性を決めてみてはどうでしょう

苺ぷりん

Re: DirectXでの画像の表示

#5

投稿記事 by 苺ぷりん » 12年前

N.Rさん何度もありがとうございますm(__)m

書籍などのサンプルを動かして
自分なりに改造しようかなっと挑戦してみたんですが
ぜんぜんできないもんですね。。難しい
ご指摘通り、順を追ってやっていこうと思います。
まずは画像の表示からもう一度やってみたいと思います。

閉鎖

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