BasicEffect anyagok

Oldal frissítve :
Oldal létrehozásának dátuma :

összefoglalás

Manipulálja a BasicEffect anyag részéhez kapcsolódó paramétereket, hogy lássa, hogyan néz ki a modell.

Működési környezet

Előfeltételek

Támogatott XNA verziók
  • 4.0
Támogatott platformok
  • Windows (XP SP2 vagy újabb, Vista, 7)
  • Xbox 360 konzol
  • Windows Phone 7-telefon esetén
Windows Szükséges Vertex Shader verzió 2.0
Windows Szükséges Pixel Shader verzió 2.0

Működési környezet

peron
  • Windows 7 esetén
  • Xbox 360 konzol
  • Windows Phone 7-telefon esetén

Hogyan kell dolgozni a mintával

Működik billentyűzetXbox 360 kontrolleregér érintés
Válassza ki a módosítani kívánt paramétereket ↑、↓ Bal kar ↑, ↓ Bal gomb -
Paraméterek módosítása ←、→ Bal kar ←, → ←→ húzás -

lényeg

Mi az a BasicEffect?

Az XNA-ban, ha 3D sokszögeket szeretne megjeleníteni, meg kell írnia egy árnyékoló programot, hogy megrajzolja őket, és el kell döntenie, hogyan rajzolja meg őket. Ehhez hozzon létre egy külön effektusfájlt, írjon egy programot, olvassa el effektusosztályként (Effect), és hajtsa végre az árnyékoló programot.

Sok esetben azonban nincs szükség speciális rajzhatásra, és még ilyen esetekben is szükség van effektusra, ezért meglepően nehézkes az árnyékoló program megvalósítása.

Ezért az alapvető paraméterek, például az anyagok és a fények előre előkészítik tulajdonságként, hogy az effektusok könnyen kezelhetők legyenek "BasicEffect". Nagyon egyszerű, mert nem kell effektusfájlt létrehoznia, egyszerűen kezelheti az osztály egy példányának létrehozásával.

Még akkor is, ha modelladatokat tölt be a tartalomból, a BasicEffect alapértelmezés szerint be van állítva, így nem is kell példányt létrehoznia.

anyag

Az anyag elsősorban az anyag anyagának jellemzőire utal, és az anyag színének, visszaverődési fokának és szilárdságának meghatározására szolgál. Mivel lehetővé vált, hogy önállóan fejezzük ki az árnyékoló programokban, az anyag meghatározása durva jelentéssel bírhat anélkül, hogy rögzítené, de a BasicEffect a következő paraméterekkel rendelkezik:

Alfa Átlátszatlanság. Az 1,0 érték átlátszatlanságot, a 0,0 érték pedig teljes átláthatóságot jelent.
Diffúz szín A megjelenítendő tárgy anyagának színe. A színeket RGB színmódban ábrázolja. Az anyag árnyékolása a fény állapotától függően tükröződik.
EmissiveColor A megjelenítendő objektum kibocsátott színe. A színeket RGB színmódban ábrázolja. Mivel ez egy olyan szín, amely saját fényt bocsát ki, a szín a fény befolyásolása nélkül kerül hozzáadásra.
SpecularColor A megjelenítendő objektum tükröződésének színe. A színeket RGB színmódban ábrázolja. A fény irányától és nézőpontjától függően az anyag visszaverődik.
Tükörerő A megjelenítendő objektum visszaverődésének intenzitása. Minél magasabb az érték, annál kisebb a terület.

Az anyagváltozás képe

Az alábbi kép az anyag különböző értékeit mutatja.

Kezdeti állapot

Ez az állapot közvetlenül a mintamodell adatainak betöltése után.

初期状態

Alfa 1
Diffúz (piros) 0.8
Diffúz (zöld) 0.8
Diffúz (kék) 0
Emissive (piros) 0
Emissive (zöld) 0
Emissive (kék) 0
Fényvisszaverődés (piros) 0
Tükör (zöld) 0
Tükör (kék) 0
Tükörerő 5

Az opacitás (alfa) változása

Ekkor módosítja az átlátszatlanságot. A háttér kék színe halványan látható.

不透明度(Alpha)変更

Alfa 0.31
Diffúz (piros) 0.8
Diffúz (zöld) 0.8
Diffúz (kék) 0
Emissive (piros) 0
Emissive (zöld) 0
Emissive (kék) 0
Fényvisszaverődés (piros) 0
Tükör (zöld) 0
Tükör (kék) 0
Tükörerő 5

Diffúz módosítások

Az anyag színe megváltozik, hogy kékes legyen.

Diffuse 変更

Alfa 1
Diffúz (piros) 0.05
Diffúz (zöld) 0.71
Diffúz (kék) 1
Emissive (piros) 0
Emissive (zöld) 0
Emissive (kék) 0
Fényvisszaverődés (piros) 0
Tükör (zöld) 0
Tükör (kék) 0
Tükörerő 5

Kibocsátó módosítások

Az Emissive piros és kék elemei maximálisak. A fény állapotától függetlenül legalább a lila állapot megmarad.

Emissive 変更

Alfa 1
Diffúz (piros) 0.8
Diffúz (zöld) 0.8
Diffúz (kék) 0
Emissive (piros) 1
Emissive (zöld) 0
Emissive (kék) 1
Fényvisszaverődés (piros) 0
Tükör (zöld) 0
Tükör (kék) 0
Tükörerő 5

Tükröződő változások

A Tükör beállításával az anyag fényvisszaverőnek tűnik.

Specular 変更

Alfa 1
Diffúz (piros) 0.8
Diffúz (zöld) 0.8
Diffúz (kék) 0
Emissive (piros) 0
Emissive (zöld) 0
Emissive (kék) 0
Fényvisszaverődés (piros) 1
Tükör (zöld) 1
Tükör (kék) 1
Tükörerő 5

SpecularPower módosítás

A SpecularPower módosítása megváltoztatja a fényvisszaverő felület tartományát.

SpecularPower 変更

Alfa 1
Diffúz (piros) 0.8
Diffúz (zöld) 0.8
Diffúz (kék) 0
Emissive (piros) 0
Emissive (zöld) 0
Emissive (kék) 0
Fényvisszaverődés (piros) 1
Tükör (zöld) 1
Tükör (kék) 1
Tükörerő 20

mező

A mező BasicEffect értékre állítható anyagadatokat tartalmaz. Ezenkívül rendelkezik paraméterekkel a menük kiválasztásához, de mivel ez csak egy működési paraméter, kihagyom a részleteket.

/// <summary>
/// 不透明度
/// </summary>
private float alpha = 1.0f;

/// <summary>
/// ディフーズ
/// </summary>
private Vector3 diffuse = Vector3.One;

/// <summary>
/// エミッシブ
/// </summary>
private Vector3 emissive = Vector3.Zero;

/// <summary>
/// スペキュラー
/// </summary>
private Vector3 specular = Vector3.Zero;

/// <summary>
/// スペキュラーの強さ
/// </summary>
private float specularPower = 5.0f;

A modell anyagának lekérése

A modellben kezdeti értékként beállított anyag értékét olvassa be a rendszer. Ebben a példában a kód azon a feltételezésen alapul, hogy a modellben csak egy hatás van beállítva.

// ライトとビュー、プロジェクションはあらかじめ設定しておく
foreach (ModelMesh mesh in this.model.Meshes)
{
    foreach (BasicEffect effect in mesh.Effects)
    {
        // デフォルトのライト適用
        effect.EnableDefaultLighting();

        // ビューマトリックスをあらかじめ設定 ((0, 0, 6) から原点を見る)
        effect.View = Matrix.CreateLookAt(
            new Vector3(0.0f, 0.0f, 6.0f),
            Vector3.Zero,
            Vector3.Up
        );

        // プロジェクションマトリックスをあらかじめ設定
        effect.Projection = Matrix.CreatePerspectiveFieldOfView(
            MathHelper.ToRadians(45.0f),
            (float)this.GraphicsDevice.Viewport.Width /
                (float)this.GraphicsDevice.Viewport.Height,
            1.0f,
            100.0f
        );

        // モデルのマテリアルを取得 //

        // アルファ
        this.alpha = effect.Alpha;

        // ディフーズ
        this.diffuse = effect.DiffuseColor;

        // エミッシブ
        this.emissive = effect.EmissiveColor;

        // スペキュラー
        this.specular = effect.SpecularColor;

        // スペキュラーの強さ
        this.specularPower = effect.SpecularPower;
    }
}

Az anyag beállítása

A minta beállítja a modell BasicEffect értékét. A "DiffuseColor", az "EmissiveColor" és a "SpecularColor" esetében Vector3, nem pedig színstruktúrában állítsa be. Adja meg a piros elemeket X, zöld az Y és kék elemeket a Z számára 0,0~1,0 értékekkel.

// マテリアルを設定
foreach (ModelMesh mesh in this.model.Meshes)
{
    foreach (BasicEffect effect in mesh.Effects)
    {
        // 不透明度
        effect.Alpha = this.alpha;

        // ディフーズ
        effect.DiffuseColor = this.diffuse;

        // エミッシブ
        effect.EmissiveColor = this.emissive;

        // スペキュラー
        effect.SpecularColor = this.specular;

        // スペキュラーの強さ
        effect.SpecularPower = this.specularPower;
    }
}

A mintában van olyan kód, mint az anyagműveleti kód és az értékek karakterlánc-megjelenítése, de vannak olyan részek, amelyek nem kapcsolódnak közvetlenül a BasicMaterial-hoz, ezért elhagyom a magyarázatot. Letöltheti a mintát, vagy megtekintheti a teljes kódot.

BasicEffect.Alpha ingatlan

Beállítja és beállítja az átlátszatlanságot. Adjon meg egy értéket a 0,0~1,0 tartományban. lebeg Get, set

BasicEffect.DiffuseColor ingatlan

Megszerzi és beállítja a diffúz színt. X piros, Y zöld, Z kék, és minden érték a 0,0~1,0 tartományban van. Vektor3 Get, set

BasicEffect.EmissiveColor ingatlan

Lekéri és beállítja a kibocsátott színt. X piros, Y zöld, Z kék, és minden érték a 0,0~1,0 tartományban van. Vektor3 Get, set

BasicEffect.SpecularColor ingatlan

Beolvassa és beállítja a tükrözött színt. X piros, Y zöld, Z kék, és minden érték a 0,0~1,0 tartományban van. Vektor3 Get, set

BasicEffect.SpecularPower ingatlan

Megkapja és beállítja a reflexió intenzitását. Az érték 0,0~. lebeg Get, set

Minden kód

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
#if WINDOWS_PHONE
using Microsoft.Xna.Framework.Input.Touch;
#endif

namespace BasicEffectMaterial
{
    /// <summary>
    /// ゲームメインクラス
    /// </summary>
    public class GameMain : Microsoft.Xna.Framework.Game
    {
        /// <summary>
        /// グラフィックデバイス管理クラス
        /// </summary>
        private GraphicsDeviceManager graphics = null;

        /// <summary>
        /// スプライトのバッチ化クラス
        /// </summary>
        private SpriteBatch spriteBatch = null;

        /// <summary>
        /// スプライトでテキストを描画するためのフォント
        /// </summary>
        private SpriteFont font = null;

        /// <summary>
        /// 直前のキーボード入力の状態
        /// </summary>
        private KeyboardState oldKeyboardState = new KeyboardState();

        /// <summary>
        /// 直前のマウスの状態
        /// </summary>
        private MouseState oldMouseState = new MouseState();

        /// <summary>
        /// 直前のゲームパッド入力の状態
        /// </summary>
        private GamePadState oldGamePadState = new GamePadState();

        /// <summary>
        /// モデル
        /// </summary>
        private Model model = null;

        /// <summary>
        /// 不透明度
        /// </summary>
        private float alpha = 1.0f;

        /// <summary>
        /// ディフーズ
        /// </summary>
        private Vector3 diffuse = Vector3.One;

        /// <summary>
        /// エミッシブ
        /// </summary>
        private Vector3 emissive = Vector3.Zero;

        /// <summary>
        /// スペキュラー
        /// </summary>
        private Vector3 specular = Vector3.Zero;

        /// <summary>
        /// スペキュラーの強さ
        /// </summary>
        private float specularPower = 5.0f;

        /// <summary>
        /// 選択しているメニューのインデックス
        /// </summary>
        private int selectedMenuIndex = 0;

        /// <summary>
        /// パラメータの最大数
        /// </summary>
        private static int MaxParameterCount = 11;

        /// <summary>
        /// メニューリスト
        /// </summary>
        private static string[] MenuNameList = new string[]
            {
                "Alpha",
                "Diffuse (Red)",
                "Diffuse (Green)",
                "Diffuse (Blue)",
                "Emissive (Red)",
                "Emissive (Green)",
                "Emissive (Blue)",
                "Specular (Red)",
                "Specular (Green)",
                "Specular (Blue)",
                "SpecularPower"
            };

        /// <summary>
        /// パラメータテキストリスト
        /// </summary>
        private string[] parameters = new string[MaxParameterCount];


        /// <summary>
        /// GameMain コンストラクタ
        /// </summary>
        public GameMain()
        {
            // グラフィックデバイス管理クラスの作成
            this.graphics = new GraphicsDeviceManager(this);

            // ゲームコンテンツのルートディレクトリを設定
            this.Content.RootDirectory = "Content";

#if WINDOWS_PHONE
            // Windows Phone のデフォルトのフレームレートは 30 FPS
            this.TargetElapsedTime = TimeSpan.FromTicks(333333);

            // バックバッファサイズの設定
            this.graphics.PreferredBackBufferWidth = 480;
            this.graphics.PreferredBackBufferHeight = 800;

            // フルスクリーン表示
            this.graphics.IsFullScreen = true;
#endif

            // ウインドウ上でマウスのポインタを表示するようにする
            this.IsMouseVisible = true;
        }

        /// <summary>
        /// ゲームが始まる前の初期化処理を行うメソッド
        /// グラフィック以外のデータの読み込み、コンポーネントの初期化を行う
        /// </summary>
        protected override void Initialize()
        {
            // コンポーネントの初期化などを行います
            base.Initialize();
        }

        /// <summary>
        /// ゲームが始まるときに一回だけ呼ばれ
        /// すべてのゲームコンテンツを読み込みます
        /// </summary>
        protected override void LoadContent()
        {
            // テクスチャーを描画するためのスプライトバッチクラスを作成します
            this.spriteBatch = new SpriteBatch(this.GraphicsDevice);

            // フォントをコンテンツパイプラインから読み込む
            this.font = this.Content.Load<SpriteFont>("Font");

            // モデルを作成
            this.model = this.Content.Load<Model>("Model");

            // ライトとビュー、プロジェクションはあらかじめ設定しておく
            foreach (ModelMesh mesh in this.model.Meshes)
            {
                foreach (BasicEffect effect in mesh.Effects)
                {
                    // デフォルトのライト適用
                    effect.EnableDefaultLighting();

                    // ビューマトリックスをあらかじめ設定 ((0, 0, 6) から原点を見る)
                    effect.View = Matrix.CreateLookAt(
                        new Vector3(0.0f, 0.0f, 6.0f),
                        Vector3.Zero,
                        Vector3.Up
                    );

                    // プロジェクションマトリックスをあらかじめ設定
                    effect.Projection = Matrix.CreatePerspectiveFieldOfView(
                        MathHelper.ToRadians(45.0f),
                        (float)this.GraphicsDevice.Viewport.Width /
                            (float)this.GraphicsDevice.Viewport.Height,
                        1.0f,
                        100.0f
                    );

                    // モデルのマテリアルを取得 //

                    // アルファ
                    this.alpha = effect.Alpha;

                    // ディフーズ
                    this.diffuse = effect.DiffuseColor;

                    // エミッシブ
                    this.emissive = effect.EmissiveColor;

                    // スペキュラー
                    this.specular = effect.SpecularColor;

                    // スペキュラーの強さ
                    this.specularPower = effect.SpecularPower;
                }
            }
        }

        /// <summary>
        /// ゲームが終了するときに一回だけ呼ばれ
        /// すべてのゲームコンテンツをアンロードします
        /// </summary>
        protected override void UnloadContent()
        {
            // TODO: ContentManager で管理されていないコンテンツを
            //       ここでアンロードしてください
        }

        /// <summary>
        /// 描画以外のデータ更新等の処理を行うメソッド
        /// 主に入力処理、衝突判定などの物理計算、オーディオの再生など
        /// </summary>
        /// <param name="gameTime">このメソッドが呼ばれたときのゲーム時間</param>
        protected override void Update(GameTime gameTime)
        {
            // 入力デバイスの状態取得
            KeyboardState keyboardState = Keyboard.GetState();
            MouseState mouseState = Mouse.GetState();
            GamePadState gamePadState = GamePad.GetState(PlayerIndex.One);

            // Xbox 360 コントローラ、Windows Phone の BACK ボタンを押したときに
            // ゲームを終了させます
            if (gamePadState.Buttons.Back == ButtonState.Pressed)
            {
                this.Exit();
            }

            
            // メニューの選択
            if ((keyboardState.IsKeyDown(Keys.Up) && this.oldKeyboardState.IsKeyUp(Keys.Up)) ||
                (gamePadState.ThumbSticks.Left.Y >= 0.5f &&
                    this.oldGamePadState.ThumbSticks.Left.Y < 0.5f))
            {
                // 選択メニューをひとつ上に移動
                this.selectedMenuIndex =
                    (this.selectedMenuIndex + this.parameters.Length - 1) % this.parameters.Length;
            }
            if ((keyboardState.IsKeyDown(Keys.Down) && this.oldKeyboardState.IsKeyUp(Keys.Down)) ||
                (gamePadState.ThumbSticks.Left.Y <= -0.5f &&
                    this.oldGamePadState.ThumbSticks.Left.Y > -0.5f) ||
                (this.oldMouseState.LeftButton == ButtonState.Pressed &&
                 mouseState.LeftButton == ButtonState.Released))
            {
                // 選択メニューをひとつ下に移動
                this.selectedMenuIndex =
                    (this.selectedMenuIndex + this.parameters.Length + 1) % this.parameters.Length;
            }

            // 各マテリアルの値を操作
            float moveValue = 0.0f;
            if (keyboardState.IsKeyDown(Keys.Left))
            {
                moveValue -= (float)gameTime.ElapsedGameTime.TotalSeconds;
            }
            if (keyboardState.IsKeyDown(Keys.Right))
            {
                moveValue += (float)gameTime.ElapsedGameTime.TotalSeconds;
            }
            if (mouseState.LeftButton == ButtonState.Pressed)
            {
                moveValue += (mouseState.X - this.oldMouseState.X) * 0.005f;
            }
            if (gamePadState.IsConnected)
            {
                moveValue += gamePadState.ThumbSticks.Left.X *
                             (float)gameTime.ElapsedGameTime.TotalSeconds;
            }

            switch (this.selectedMenuIndex)
            {
                case 0: // 不透明度
                    this.alpha = MathHelper.Clamp(this.alpha + moveValue,
                                                  0.0f,
                                                  1.0f);
                    break;
                case 1: // ディフューズ (赤)
                    this.diffuse.X = MathHelper.Clamp(this.diffuse.X + moveValue,
                                                      0.0f,
                                                      1.0f);
                    break;
                case 2: // ディフューズ (緑)
                    this.diffuse.Y = MathHelper.Clamp(this.diffuse.Y + moveValue,
                                                      0.0f,
                                                      1.0f);
                    break;
                case 3: // ディフューズ (青)
                    this.diffuse.Z = MathHelper.Clamp(this.diffuse.Z + moveValue,
                                                      0.0f,
                                                      1.0f);
                    break;
                case 4: // エミッシブ (赤)
                    this.emissive.X = MathHelper.Clamp(this.emissive.X + moveValue,
                                                       0.0f,
                                                       1.0f);
                    break;
                case 5: // エミッシブ (緑)
                    this.emissive.Y = MathHelper.Clamp(this.emissive.Y + moveValue,
                                                       0.0f,
                                                       1.0f);
                    break;
                case 6: // エミッシブ (青)
                    this.emissive.Z = MathHelper.Clamp(this.emissive.Z + moveValue,
                                                       0.0f,
                                                       1.0f);
                    break;
                case 7: // スペキュラー (赤)
                    this.specular.X = MathHelper.Clamp(this.specular.X + moveValue,
                                                       0.0f,
                                                       1.0f);
                    break;
                case 8: // スペキュラー (緑)
                    this.specular.Y = MathHelper.Clamp(this.specular.Y + moveValue,
                                                       0.0f,
                                                       1.0f);
                    break;
                case 9: // スペキュラー (青)
                    this.specular.Z = MathHelper.Clamp(this.specular.Z + moveValue,
                                                       0.0f,
                                                       1.0f);
                    break;
                case 10: // スペキュラーの強さ
                    moveValue *= 5.0f;
                    this.specularPower = MathHelper.Clamp(this.specularPower + moveValue,
                                                          0.0f,
                                                          100.0f);
                    break;
            }

            // マテリアルを設定
            foreach (ModelMesh mesh in this.model.Meshes)
            {
                foreach (BasicEffect effect in mesh.Effects)
                {
                    // 不透明度
                    effect.Alpha = this.alpha;

                    // ディフーズ
                    effect.DiffuseColor = this.diffuse;

                    // エミッシブ
                    effect.EmissiveColor = this.emissive;

                    // スペキュラー
                    effect.SpecularColor = this.specular;

                    // スペキュラーの強さ
                    effect.SpecularPower = this.specularPower;
                }
            }

            // 入力情報を記憶
            this.oldKeyboardState = keyboardState;
            this.oldMouseState = mouseState;
            this.oldGamePadState = gamePadState;

            // 登録された GameComponent を更新する
            base.Update(gameTime);
        }

        /// <summary>
        /// 描画処理を行うメソッド
        /// </summary>
        /// <param name="gameTime">このメソッドが呼ばれたときのゲーム時間</param>
        protected override void Draw(GameTime gameTime)
        {
            // 画面を指定した色でクリアします
            this.GraphicsDevice.Clear(Color.CornflowerBlue);

            // 深度バッファを有効にする
            this.GraphicsDevice.DepthStencilState = DepthStencilState.Default;

            // モデルを描画
            foreach (ModelMesh mesh in this.model.Meshes)
            {
                mesh.Draw();
            }

            // スプライトの描画準備
            this.spriteBatch.Begin();

            // 操作
            this.spriteBatch.DrawString(this.font,
                "Up, Down : Select Menu",
                new Vector2(20.0f, 20.0f), Color.White);
            this.spriteBatch.DrawString(this.font,
                "Left, right : Change Value",
                new Vector2(20.0f, 45.0f), Color.White);
            this.spriteBatch.DrawString(this.font,
                "MouseClick & Drag :",
                new Vector2(20.0f, 70.0f), Color.White);
            this.spriteBatch.DrawString(this.font,
                "    Select Menu & Change Value",
                new Vector2(20.0f, 95.0f), Color.White);

            // 各メニュー //
            for (int i = 0; i < MenuNameList.Length; i++)
            {
                this.spriteBatch.DrawString(this.font,
                    MenuNameList[i],
                    new Vector2(40.0f, 120.0f + i * 24.0f), Color.White);
            }

            // 各パラメータ //

            // 不透明度
            this.parameters[0] = this.alpha.ToString();

            // ディフューズ (赤)
            this.parameters[1] = this.diffuse.X.ToString();

            // ディフューズ (緑)
            this.parameters[2] = this.diffuse.Y.ToString();

            // ディフューズ (青)
            this.parameters[3] = this.diffuse.Z.ToString();

            // エミッシブ (赤)
            this.parameters[4] = this.emissive.X.ToString();

            // エミッシブ (緑)
            this.parameters[5] = this.emissive.Y.ToString();

            // エミッシブ (青)
            this.parameters[6] = this.emissive.Z.ToString();

            // スペキュラー (赤)
            this.parameters[7] = this.specular.X.ToString();

            // スペキュラー (緑)
            this.parameters[8] = this.specular.Y.ToString();

            // スペキュラー (青)
            this.parameters[9] = this.specular.Z.ToString();

            // スペキュラーの強さ
            this.parameters[10] = this.specularPower.ToString();

            for (int i = 0; i < this.parameters.Length; i++)
            {
                this.spriteBatch.DrawString(this.font,
                    this.parameters[i],
                    new Vector2(250.0f, 120.0f + i * 24.0f), Color.White);
            }

            // 選択インデックス
            this.spriteBatch.DrawString(this.font, "*",
                new Vector2(20.0f, 124.0f + this.selectedMenuIndex * 24.0f), Color.White);

            // スプライトの一括描画
            this.spriteBatch.End();

            // 登録された DrawableGameComponent を描画する
            base.Draw(gameTime);
        }
    }
}