חומרי BasicEffect

עודכן דף :
תאריך יצירת דף :

תקציר

טפל בפרמטרים הקשורים לחלק החומרי של BasicEffect כדי לראות כיצד נראה המודל.

סביבת הפעלה

דרישות מוקדמות

גרסאות XNA נתמכות
  • 4.0
פלטפורמות נתמכות
  • Windows (XP SP2 ואילך, Vista, 7)
  • Xbox 360
  • Windows Phone 7
Windows נדרש Vertex Shader גירסה 2.0
גירסת Pixel Shader נדרשת של Windows 2.0

סביבת הפעלה

פלטפורמה
  • חלונות 7
  • Xbox 360
  • Windows Phone 7

כיצד לעבוד עם המדגם

עובד מקלדתבקר Xbox 360מגע עכבר
בחר את הפרמטרים שברצונך לשנות ↑、↓ מוט שמאלי ↑, ↓ לחצן שמאלי -
שינוי פרמטרים ←、→ ← מקל שמאלי, → ←→ גרור -

חומר

מהו BasicEffect?

ב- XNA, אם ברצונך להציג מצולעים תלת-ממדיים, עליך לכתוב תוכנית Shader כדי לצייר אותם ולהחליט כיצד לצייר אותם. לשם כך, צור קובץ אפקטים נפרד, כתוב תוכנית, קרא אותה כמחלקת אפקטים (אפקט) והפעל את תוכנית Shader.

עם זאת, ישנם מקרים רבים שבהם אין צורך באפקט ציור מיוחד, וגם במקרים כאלה, יש צורך באפקט, כך שזה מסורבל באופן מפתיע לטרוח ליישם תוכנית Shader.

לכן, פרמטרים בסיסיים כגון חומרים ואורות מוכנים כמאפיינים מראש, כך שניתן לטפל בקלות באפקטים "BasicEffect". זה קל מאוד כי אתה לא צריך ליצור קובץ אפקטים, אתה יכול להתמודד עם זה פשוט על ידי יצירת מופע של המחלקה.

גם אם תטענו נתוני Model מהתוכן, BasicEffect מוגדר כברירת מחדל, כך שאינכם צריכים אפילו ליצור מופע.

חומר

חומר מתייחס בעיקר למאפייני החומר של חומר, ומשמש לציון הצבע, מידת ההשתקפות והחוזק של החומר. מאז זה הפך להיות אפשרי להביע את זה באופן עצמאי בתוכניות Shader, ההגדרה של חומר יכול להיות משמעות גסה מבלי להיות קבוע, אבל BasicEffect יש את הפרמטרים הבאים:

אלפא אטימות. ערך של 1.0 מציין אטימות, וערך של 0.0 מייצג שקיפות מלאה.
DiffuseColor צבע החומר של האובייקט שיוצג. ייצוג צבעים ב- RGB. הצללת החומר משתקפת בהתאם למצב האור.
EmissiveColor הצבע הנפלט של האובייקט שיוצג. ייצוג צבעים ב- RGB. מכיוון שמדובר בצבע הפולט אור משלו, הצבע מתווסף מבלי להיות מושפע מהאור.
SpecularColor צבע ההשתקפות של האובייקט שיוצג. ייצוג צבעים ב- RGB. בהתאם לכיוון ולנקודת המבט של האור, החומר ייראה כמשתקף.
ספקולר פאוור עוצמת ההשתקפות של האובייקט המוצג. ככל שהערך גבוה יותר, כך השטח המשתקף קטן יותר.

תמונה של שינוי מהותי

התמונה הבאה מציגה את הערכים השונים של החומר.

מצב התחלתי

זהו המצב מיד לאחר טעינת נתוני מודל המדגם.

初期状態

אלפא 1
מפוזר (אדום) 0.8
מפוזר (ירוק) 0.8
מפוזר (כחול) 0
שליח (אדום) 0
שליח (ירוק) 0
שליח (כחול) 0
ספקולרי (אדום) 0
ספקולרי (ירוק) 0
ספקולרי (כחול) 0
ספקולר פאוור 5

שינוי אטימות (אלפא)

זה השלב שבו אתה משנה את האטימות. הצבע הכחול של הרקע נראה קלוש.

不透明度(Alpha)変更

אלפא 0.31
מפוזר (אדום) 0.8
מפוזר (ירוק) 0.8
מפוזר (כחול) 0
שליח (אדום) 0
שליח (ירוק) 0
שליח (כחול) 0
ספקולרי (אדום) 0
ספקולרי (ירוק) 0
ספקולרי (כחול) 0
ספקולר פאוור 5

שינויים מפוזרים

צבע החומר משתנה כדי להפוך אותו כחלחל.

Diffuse 変更

אלפא 1
מפוזר (אדום) 0.05
מפוזר (ירוק) 0.71
מפוזר (כחול) 1
שליח (אדום) 0
שליח (ירוק) 0
שליח (כחול) 0
ספקולרי (אדום) 0
ספקולרי (ירוק) 0
ספקולרי (כחול) 0
ספקולר פאוור 5

שינויים שליחים

האלמנטים האדומים והכחולים של Emissive הם מקסימליים. ללא קשר למצב האור, לפחות המצב הסגול נשמר.

Emissive 変更

אלפא 1
מפוזר (אדום) 0.8
מפוזר (ירוק) 0.8
מפוזר (כחול) 0
שליח (אדום) 1
שליח (ירוק) 0
שליח (כחול) 1
ספקולרי (אדום) 0
ספקולרי (ירוק) 0
ספקולרי (כחול) 0
ספקולר פאוור 5

שינויים ספקולאריים

על ידי הגדרת ספקולרי, החומר ייראה רפלקטיבי.

Specular 変更

אלפא 1
מפוזר (אדום) 0.8
מפוזר (ירוק) 0.8
מפוזר (כחול) 0
שליח (אדום) 0
שליח (ירוק) 0
שליח (כחול) 0
ספקולרי (אדום) 1
ספקולרי (ירוק) 1
ספקולרי (כחול) 1
ספקולר פאוור 5

שינוי ספקולריPower

שינוי SpecularPower משנה את טווח המשטח הרפלקטיבי.

SpecularPower 変更

אלפא 1
מפוזר (אדום) 0.8
מפוזר (ירוק) 0.8
מפוזר (כחול) 0
שליח (אדום) 0
שליח (ירוק) 0
שליח (כחול) 0
ספקולרי (אדום) 1
ספקולרי (ירוק) 1
ספקולרי (כחול) 1
ספקולר פאוור 20

שדה

השדה מכיל מידע אודות חומרים שיש להגדיר כ- BasicEffect. בנוסף, יש לו פרמטרים לבחירת תפריטים, אבל מאז זה רק פרמטר לפעולה, אני אשמיט את הפרטים.

/// <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;

אחזור החומר של המודל

הערך של החומר שנקבע במודל כערך ההתחלתי מאוחזר. בדוגמה זו, הקוד נכתב על ההנחה שיש רק אפקט אחד מוגדר במודל.

// ライトとビュー、プロジェクションはあらかじめ設定しておく
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;
    }
}

הגדרת החומר

הדוגמה מגדירה ערך ל- BasicEffect של המודל. עבור "DiffuseColor", "EmissiveColor" ו- "SpecularColor", מוגדר בווקטור3, לא במבנה צבע. ציין את הרכיבים אדום ל- X, ירוק ל- Y וכחול ל- Z עם ערכים של 0.0~1.0.

// マテリアルを設定
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;
    }
}

בדוגמה, יש קוד כגון קוד פעולה חומרית ותצוגת מחרוזת של ערכים, אך ישנם חלקים שאינם קשורים ישירות ל- BasicMaterial, ולכן אשמיט את ההסבר. אתה יכול להוריד את הדוגמה או לבדוק את הקוד המלא.

BasicEffect.Alpha מאפיין

מקבל וקובע את האטימות. ציין ערך בטווח של 0.0~1.0. שט קבל, הגדר

BasicEffect.DiffuseColor מאפיין

מקבל וקובע את הצבע המפוזר. X הוא אדום, Y הוא ירוק, Z הוא כחול, וכל ערך הוא בטווח 0.0~1.0. וקטור3 קבל, הגדר

BasicEffect.EmissiveColor מאפיין

מקבל ומגדיר את הצבע הנפלט. X הוא אדום, Y הוא ירוק, Z הוא כחול, וכל ערך הוא בטווח 0.0~1.0. וקטור3 קבל, הגדר

BasicEffect.SpecularColor מאפיין

מקבל וקובע את הצבע המשתקף. X הוא אדום, Y הוא ירוק, Z הוא כחול, וכל ערך הוא בטווח 0.0~1.0. וקטור3 קבל, הגדר

BasicEffect.SpecularPower מאפיין

מקבל וקובע את עוצמת ההשתקפות. הערך מצוין כ- 0.0~. שט קבל, הגדר

כל הקודים

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);
        }
    }
}