Materiály BasicEffect

Stránka aktualizovaná :
Dátum vytvorenia strany :

súhrn

Manipulujte s parametrami súvisiacimi s materiálovou časťou BasicEffect, aby ste videli, ako model vyzerá.

Prevádzkové prostredie

Predpoklady

Podporované verzie XNA
  • 4.0
Podporované platformy
  • Windows (XP SP2 alebo novší, Vista, 7)
  • Konzola Xbox 360
  • Windows Phone 7
Požadovaná verzia Vertex Shader systému Windows 2.0
Požadovaná verzia Pixel Shader pre Windows 2.0

Prevádzkové prostredie

nástupište
  • Windows 7
  • Konzola Xbox 360
  • Windows Phone 7

Ako pracovať so vzorkou

Funguje klávesnicaOvládačXbox 360 Myš Touch
Vyberte parametre, ktoré chcete zmeniť ↑、↓ Ľavá páčka ↑, ↓ Ľavé tlačidlo -
Zmena parametrov ←、→ Ľavá páčka ←, → ←→ Presunúť -

látka

Čo je BasicEffect?

V XNA, ak chcete zobraziť 3D mnohouholníky, musíte napísať shader program, aby ste ich nakreslili a rozhodli sa, ako ich nakresliť. Ak to chcete urobiť, vytvorte samostatný súbor efektov, napíšte program, prečítajte si ho ako triedu efektov (Effect) a spustite shader program.

Existuje však veľa prípadov, keď nepotrebujete špeciálny efekt kreslenia, a aj v takýchto prípadoch je efekt nevyhnutný, takže je prekvapivo ťažkopádne obťažovať implementáciou shaderového programu.

Preto sú základné parametre ako materiály a svetlá vopred pripravené ako vlastnosti, aby sa efekty dali ľahko zvládnuť "BasicEffect". Je to veľmi jednoduché, pretože nemusíte vytvárať súbor efektov, môžete to zvládnuť jednoduchým vytvorením inštancie triedy.

Aj keď načítate údaje modelu z obsahu, BasicEffect je predvolene nastavený, takže nemusíte ani vytvárať inštanciu.

materiál

Materiál sa vzťahuje hlavne na vlastnosti materiálu látky a používa sa na špecifikáciu farby, stupňa odrazu a sily látky. Keďže je možné ho vyjadriť nezávisle v shader programoch, definícia materiálu môže mať hrubý význam bez toho, aby bola pevná, ale BasicEffect má nasledujúce parametre:

Alfa Neprehľadnosť. Hodnota 1,0 označuje nepriehľadnosť a hodnota 0,0 predstavuje úplnú priehľadnosť.
Difúzna farba Farba látky objektu, ktorý sa má zobraziť. Reprezentujte farby v RGB. Zatienenie materiálu sa odráža v závislosti od stavu svetla.
EmisiveColor Emitovaná farba objektu, ktorý sa má zobraziť. Reprezentujte farby v RGB. Keďže ide o farbu, ktorá vyžaruje vlastné svetlo, farba sa pridáva bez toho, aby bola ovplyvnená svetlom.
Zrkadlová farba Farba odrazu objektu, ktorý sa má zobraziť. Reprezentujte farby v RGB. V závislosti od smeru a uhla pohľadu svetla sa bude zdať, že materiál sa odráža.
Špekulárna sila Intenzita odrazu objektu, ktorý sa má zobraziť. Čím vyššia je hodnota, tým menšia je plocha.

Obrázok podstatnej zmeny

Obrázok nižšie zobrazuje rôzne hodnoty materiálu.

Počiatočný stav

Toto je stav bezprostredne po načítaní údajov vzorového modelu.

初期状態

Alfa 1
Difúzna (červená) 0.8
Difúzny (zelený) 0.8
Difúzna (modrá) 0
Emisné (červené) 0
Emisné (zelené) 0
Emisné (modré) 0
Zrkadlová (červená) 0
Zrkadlová (zelená) 0
Zrkadlová (modrá) 0
Špekulárna sila 5

Zmena nepriehľadnosti (alfa)

To je, keď zmeníte nepriehľadnosť. Modrá farba pozadia je slabo viditeľná.

不透明度(Alpha)変更

Alfa 0.31
Difúzna (červená) 0.8
Difúzny (zelený) 0.8
Difúzna (modrá) 0
Emisné (červené) 0
Emisné (zelené) 0
Emisné (modré) 0
Zrkadlová (červená) 0
Zrkadlová (zelená) 0
Zrkadlová (modrá) 0
Špekulárna sila 5

Difúzne modifikácie

Farba látky sa zmení tak, aby bola modrastá.

Diffuse 変更

Alfa 1
Difúzna (červená) 0.05
Difúzny (zelený) 0.71
Difúzna (modrá) 1
Emisné (červené) 0
Emisné (zelené) 0
Emisné (modré) 0
Zrkadlová (červená) 0
Zrkadlová (zelená) 0
Zrkadlová (modrá) 0
Špekulárna sila 5

Emisné modifikácie

Červené a modré prvky Emissive sú maximalizované. Bez ohľadu na stav svetla sa zachováva aspoň fialový stav.

Emissive 変更

Alfa 1
Difúzna (červená) 0.8
Difúzny (zelený) 0.8
Difúzna (modrá) 0
Emisné (červené) 1
Emisné (zelené) 0
Emisné (modré) 1
Zrkadlová (červená) 0
Zrkadlová (zelená) 0
Zrkadlová (modrá) 0
Špekulárna sila 5

Spekulárne zmeny

Nastavením Specular sa materiál bude javiť ako reflexný.

Specular 変更

Alfa 1
Difúzna (červená) 0.8
Difúzny (zelený) 0.8
Difúzna (modrá) 0
Emisné (červené) 0
Emisné (zelené) 0
Emisné (modré) 0
Zrkadlová (červená) 1
Zrkadlová (zelená) 1
Zrkadlová (modrá) 1
Špekulárna sila 5

SpecularPower Modifikácia

Zmenou SpecularPower sa zmení rozsah odrazovej plochy.

SpecularPower 変更

Alfa 1
Difúzna (červená) 0.8
Difúzny (zelený) 0.8
Difúzna (modrá) 0
Emisné (červené) 0
Emisné (zelené) 0
Emisné (modré) 0
Zrkadlová (červená) 1
Zrkadlová (zelená) 1
Zrkadlová (modrá) 1
Špekulárna sila 20

pole

Pole obsahuje informácie o materiáloch, ktoré je možné nastaviť na hodnotu BasicEffect. Okrem toho má parametre na výber ponúk, ale keďže ide iba o parameter pre prevádzku, podrobnosti vynechám.

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

Získanie materiálu modelu

Načíta sa hodnota materiálu nastaveného v modeli ako počiatočná hodnota. V tejto ukážke je kód napísaný za predpokladu, že v modeli je nastavený iba jeden efekt.

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

Nastavenie materiálu

Ukážka nastaví hodnotu BasicEffect modelu. Pre "DiffuseColor", "EmisiveColor" a "SpecularColor" nastavené vo Vector3, nie vo farebnej štruktúre. Zadajte prvky červenej pre X, zelenej pre Y a modrej pre Z s hodnotami 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;
    }
}

V ukážke je kód ako kód operácie materiálu a reťazcové zobrazenie hodnôt, ale sú tam časti, ktoré priamo nesúvisia so BasicMaterial, takže vysvetlenie vynechám. Môžete si stiahnuť ukážku alebo si pozrieť celý kód.

BasicEffect.Alpha majetok

Dostane a nastaví nepriehľadnosť. Zadajte hodnotu v rozsahu 0,0~1,0. plávať získať, nastaviť

BasicEffect.DiffuseColor majetok

Dostane a nastaví difúznu farbu. X je červená, Y je zelená, Z je modrá a každá hodnota je v rozsahu 0,0~1,0. Vektor3 získať, nastaviť

BasicEffect.EmissiveColor majetok

Dostane a nastaví vyžarovanú farbu. X je červená, Y je zelená, Z je modrá a každá hodnota je v rozsahu 0,0~1,0. Vektor3 získať, nastaviť

BasicEffect.SpecularColor majetok

Dostane a nastaví odrazenú farbu. X je červená, Y je zelená, Z je modrá a každá hodnota je v rozsahu 0,0~1,0. Vektor3 získať, nastaviť

BasicEffect.SpecularPower majetok

Dostane a nastaví intenzitu odrazu. Hodnota je zadaná ako 0,0~. plávať získať, nastaviť

Všetky kódy

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