SpriteBatch を使ったテクスチャの描画
About
ここでは SpriteBatch を使ってテクスチャを描画する最もシンプルな方法について解説します。実行結果は次の画像の通りです。
WindowsGame1 _DrawTexture2D.zip
- VisualStudio2010
- XNA4.0
How to
描画する画像の登録
テクスチャとして描画する画像を読み込んで登録しておく必要があります。XNA ではContentプロジェクトなるものでゲームで利用するデータの類を管理しています。したがって、ここではContentプロジェクトに画像を登録します。
標準ではContentプロジェクトの名前は WindowsGame1Content となっています。VisualStudio のソリューションエクスプローラに表示されているプロジェクトのうち、名前に (Content) が付いているプロジェクトがそれです。そのプロジェクトに描画したい画像を追加します。追加するには ドラッグアンドドロップが楽でしょう。プロジェクトを右クリックして [追加 > 既存の項目] からファイルを選択しても同じように追加することができます。
XNA では、Contentプロジェクトに登録したデータをアセット、その管理する名前をアセット名と呼びます。ゲーム開発では良く用いられる呼び方です。アセット名はふつう、Contentプロジェクトに取り込んだファイル名から拡張子を取り除いたファイル名になります。
テクスチャの読み込みと SpriteBatch の初期化
Contentプロジェクトに取り込んだテクスチャを表示するためには、まずプログラムからContentプロジェクトに登録されたデータを読み込む必要があります。フィールド変数に Texture2D を用意してそこにデータを読み込みます。データの読み込みは LoadContent メソッド内に実装するのが良いでしょう。このメソッドはゲームシーンが読み込まれる時に1回だけ実行されるメソッドです。挙動がコンストラクタに似ていますが、LoadContent メソッドまで処理が進まないとContentプロジェクトにアクセスできないので注意が必要です。
Contentプロジェクトにアクセスして特定のデータを読み込むには、Content.Load<T> メソッドを利用します。T には読み込むデータを扱うためのデータ型を指定します。したがってここでは T は Texture2D です。メソッドの引数にはアセット名(読み込むデータの名前)を指定します。
順番が前後しますが、平面のオブジェクト(ここではテクスチャ)を描画するためには SpriteBatch(スプライトバッチ) が必要なので、ここで初期化しておきます。引数に GraphicsDevice を指定していますが、これは簡単にグラフィクスを描画できるように XNA が用意しているものです。したがって詳細な解説についてはここでは割愛しますから、SpriteBatch はこのようにして初期化しておく、ということだけ覚えればよいでしょう。
//フィールド変数 Texture2D texture; protected override void LoadContent() { spriteBatch = new SpriteBatch(GraphicsDevice); texture = Content.Load<Texture2D>("lena"); }
SpriteBatch をつかったテクスチャの描画
SpriteBatch を使って読み込んだテクスチャを描画することはそれほど難しくありません。XNA では描画する機能は Draw メソッドの中に記述するのが一般的で、SpriteBatch を使ってテクスチャを描画するときも Draw メソッドの中で行います。
SpriteBatch による描画を開始するときは、SpriteBatch.Begin メソッドを実行し、終了するときは SpriteBatch.End メソッドを実行します。SpriteBatch による描画の実行は、この Begin ~ End の間に記述します。
テクスチャを描画するときは SpriteBatch.Draw メソッドを利用します。引数は描画するテクスチャ、描画する位置、描画の変調色です。描画の位置は描画面の左上を (0,0) として、右下を (width 幅, height 高さ) とする2次元の座標で指定します。3つ目の引数である変調色ですが、ここでは簡単のため、気にせずに Color.White を指定します。
protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.CornflowerBlue); spriteBatch.Begin(); //テクスチャの描画 spriteBatch.Draw(tex2d_lena, Vector2.Zero, Color.White); spriteBatch.End(); base.Draw(gameTime); }