0からのゲームプログラミング > 画像の移動

Back Next
更新日 2003.11.15
画像の移動

 前回の表示させる位置は、うまく変更出来たでしょうか。止まって表示されているだけでは面白くありませんので、今回は画像を動かしてみましょう。


 前回は、ID3DXSprite::Draw メソッドの4番目のパラメータを変更して、画像の表示位置を変更していました。スプライトでは、拡大縮小・回転も簡単に出来てしまいます。それらを統一した書き方で扱いたい為、プログラムコードを変更します。


 例えば、前回は、こんな風に書いていました。(表示位置は変更されています。)
 

	// スプライト描画
	g_pSprite->Draw(m_Texture, NULL, NULL, &D3DXVECTOR3(0, 200, 0), 0xffffffff);


 これを、とりあえず、以下のコードをコピーして書き換えてみて下さい。
 

	// 座標変換してから、スプライト描画
	g_pSprite->SetTransform(&m_Matrix);
	g_pSprite->Draw(m_Texture, NULL, NULL, NULL, 0xffffffff);


 さらに、コードを加えます。Screen.h 内の 『CScreenStage クラスの定義』 と書かれたところを見て下さい。そこで、テクスチャと書かれたところの下に、マトリックスの行を一行加えて下さい。
 

	CTexture		m_Texture;	// テクスチャ
	D3DXMATRIX		m_Matrix;	// マトリックス(行列)


 そして、今度は ScreenStage.cpp に戻って、CScreenStage::Move メンバ関数に以下の一行を加えます。
 

// 動作
// 引数、戻値なし。
void CScreenStage::Move(void)
{
	// 変換行列を作成
	D3DXMatrixTransformation2D(&m_Matrix, NULL, 0, NULL, NULL, 0, &D3DXVECTOR2(0, 200));
}


 以上の3箇所を変更して、ビルド(メイク)して実行出来ることを確認して下さい。
 


 画像の表示位置の指定は、ID3DXSprite::Draw メソッドの4番目のパラメータでするのを止め、D3DXMatrixTransformation2D 関数の最後のパラメータで指定するように変更しました。このパラメータには、D3DXVECTOR2 構造体へのポインタを指定します。D3DXVECTOR2 は、x成分・y成分を一まとめにした構造体です。


 以上の変更を加えたことでしていることは、D3DXMatrixTransformation2D 関数 を使ってマトリックス(行列)を作成し、そのマトリックスを ID3DXSprite::SetTransform メソッド でセットしてから、ID3DXSprite::Draw メソッド でスプライトを描画しています。


 ただ単に、座標変換してから描画する、といった書き方に変えただけです。これで、拡大縮小・回転も扱えるようになります。前回のコードでは、座標変換のコードを書きませんでしたが、DirectX 側で暗黙の内にされています。3Dの場合もこの、座標変換してから描画する、というやり方は変わりません。簡単に言えば、使う関数が変わるだけ、と思って頂いていいでしょう。(あ、簡単に言い過ぎたかも!?)


 マトリックス(行列)を使うといっても、そんなに恐れないで下さい。マトリックスは、D3DXMATRIX 構造体が管理してくれますので、計算は用意されている関数を使えば出来ます。


 さて、本題の画像を移動させるプログラムを作りましょう。画像を移動させる為には、その位置を保持する変数が必要になります。x 座標と y 座標を保持出来ればいいのですから、その x と y を一まとめにした D3DXVECTOR2 構造体 を使います。Screen.h の『CScreenStage クラスの定義』内に、メンバ変数を追加します。
 

	CTexture		m_Texture;	// テクスチャ
	D3DXMATRIX		m_Matrix;	// マトリックス(行列)
	D3DXVECTOR2		m_vec2;		// 位置(x座標, y座標)


 そして、CScreenStage クラスのコンストラクタで、値を初期化しておきます。コンストラクタのどこでセットしても構いませんが、ここでは ファイルパック終了と書かれた下辺りでやっておきます。ファイルパック終了の意味については、もう少し先でやります。


CScreenStage クラスのコンストラクタ 内

	// ファイルパック終了
	g_pFilePack->End();


	// 初期位置をセット
	m_vec2.x = 0.0f;
	m_vec2.y = 200.0f;


	// 描画の初期設定等
	InitRender();


 最後に、CScreenStage::Move メンバ関数 内の、D3DXMatrixTransformation2D 関数で、m_vec2 のアドレスを渡すように書き換えて下さい。
 

// 動作
// 引数、戻値なし。
void CScreenStage::Move(void)
{
	// 変換行列を作成
	D3DXMatrixTransformation2D(&m_Matrix, NULL, 0, NULL, NULL, 0, &m_vec2);
}


 さて、ビルド(メイク)して実行させてみましょう。はい、何も変わっていませんね。移動させるコードを書いていないので当然ですね。


 それでは、変換行列を作成の手前にコードを加えてみます。例えば、以下のようにして、実行させてみましょう。
 

// 動作
// 引数、戻値なし。
void CScreenStage::Move(void)
{
	// 移動させる
	m_vec2.x += 1.0f;

	// 変換行列を作成
	D3DXMatrixTransformation2D(&m_Matrix, NULL, 0, NULL, NULL, 0, &m_vec2);
}
 どうだったでしょうか。簡単でしょ!?若干変更箇所が多かったのでややこしかったかも知れませんが、その内慣れると思います。速さを変えたり色々変更していって下さい。


 DirectX 9.0 SDK では、描画関連の計算は、主に float 型 が使われています。D3DXVECTOR2 構造体の メンバも、float 型 です。定数を記述するときには、float 型を意識した書き方で書くようにした方が単純なミスを防げます。上の例では、1.0f と最後に f を付けています。1 だけなら、整数型(普通は int 型)で、1.0 と書けば、double 型になります。データ型が違えば、計算過程で結果が違ってくることもありますので、注意するようにしましょう。それらを理解した上で、別の書き方で書くのは構いませんが。

 それでは、また次回まで。さようなら。

【スポンサード リンク】


Back Next

0からのゲームプログラミング > 画像の移動