▼XNA Game Studioメモ▼
日本語を表示する


日本語を表示するプログラムを作成する。



XNAアプリケーションで利用する日本語文字の指定
XNAアプリケーションで文字列の表示を行うには、XNAアプリケーションに利用する文字を追加しなければならない。
ASCII文字はフォント定義ファイル(*.spritefont)の<CharacterRegions>で指定する。
日本語文字はmessages.txtに記述しプロジェクトに追加する。
  1. "JapEx"という名前のプロジェクトを作成する。
  2. ソリューションエクスプローラのプロジェクト名を右クリックし、ポップアップ「追加⇒新しい項目」を選択し、「Sprite Font」を"SpriteFont1.spritefont"という名前で追加する。FontNameは"MS UI Gothic"とする。
  3. ソリューションエクスプローラのプロジェクト名を右クリックし、ポップアップ「追加⇒新しい項目」を選択し、「テキスト ファイル」を"messages.txt"という名前で追加する。
  4. 「messages.txt」に利用する文字を記述する。文字コードの指定はVisual Studioのメニュー「ファイル⇒保存オプションの詳細設定」で「Unicode (UTF8 シグネチャ(BOM)なし)」を選択する。また、最終行で改行すること。
    ハローワールド!


コンテントプロセッサのプロジェクトの生成
messages.txtに記述されている日本語文字をコンテントとしてXNAアプリケーションに追加するコンテントプロセッサを生成する。
コンテントパイプラインはビルド処理の一部なため、ゲーム用のプロジェクト"JapEx"とは分ける必要がある。
  1. ソリューションエクスプローラのソリューション名を右クリックし、ポップアップ「追加⇒新しいプロジェクト」を選択し、「Windows Game Library」を"FontProcessors"という名前で追加する。
  2. プロジェクト"FontProcessors"の参照設定を右クリックし、「参照の追加」を選択し、「Microsoft.Xna.Framework.Content.Pipeline」を追加する。
  3. デフォルトで追加されているClass1.csを名前変更し"MyFontProcessor"とし、次のように編集する。
    MyFontProcessor.cs
    using System;
    using System.Collections.Generic;
    using Microsoft.Xna.Framework;
    using Microsoft.Xna.Framework.Audio;
    using Microsoft.Xna.Framework.Graphics;
    using Microsoft.Xna.Framework.Input;
    using Microsoft.Xna.Framework.Storage;
    using Microsoft.Xna.Framework.Content;
    using System.IO;
    using Microsoft.Xna.Framework.Content.Pipeline;
    using Microsoft.Xna.Framework.Content.Pipeline.Graphics;
    using Microsoft.Xna.Framework.Content.Pipeline.Processors;
    
    [ContentProcessor]
    public class MyFontProcessor : FontDescriptionProcessor {
        public override SpriteFontContent Process(FontDescription input, 
            ContentProcessorContext context) {
            //ファイル読み込み
            string fullPath = Path.GetFullPath("messages.txt");
            context.AddDependency(fullPath);
            string letters = File.ReadAllText(fullPath, System.Text.Encoding.UTF8);
    
            //フォントの追加
            foreach (char c in letters) {
                input.Characters.Add(c);
            }
            return base.Process(input, context);
        }
    }
  4. ソリューションエクスプローラのプロジェクト"FontProcessors"のプロジェクト名を右クリックし、ポップアップ「ビルド」を選択。


コンテントプロセッサとフォント定義ファイルの関連付け
  1. ソリューションエクスプローラのプロジェクト"JapEx"のプロジェクト名を右クリックし、プロパティを選択。「Content Pipeline」タブを選択し、「FontProcessors.dll」を追加する。
  2. ソリューションエクスプローラでソリューション名を右クリックし、「プロジェクトの依存」を選択し、コンボボックスで"JapEx"を選択し、チェックボックス「FontProcessors」をチェックする。これで"JapEx"は"FontProcessors"に依存することが指定される。
  3. フォント定義ファイル(SpriteFont1.spritefont)を選択し、プロパティの「Content Processor」を「Font Description - XNA Framework」から「MyFontProcessor」へ変更する。


ソースコードの編集
Game1.csを編集。

Game1.cs
using System;
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Storage;

//日本語を表示する
namespace JapEx {
    public class Game1 : Microsoft.Xna.Framework.Game {
        private GraphicsDeviceManager graphics;//グラフィックス
        private ContentManager        content; //コンテンツ
        private SpriteBatch           spBatch; //スプライト郡
        private SpriteFont            font;    //フォント

        //コンストラクタ
        public Game1() {
            graphics = new GraphicsDeviceManager(this);
            content = new ContentManager(Services);
        }

        //初期化
        protected override void Initialize() {
            base.Initialize();
        }

        //グラフィクスコンテントの読み込み
        protected override void LoadGraphicsContent(bool loadAllContent) {
            if (loadAllContent) {
                spBatch = new SpriteBatch(graphics.GraphicsDevice);
                font = content.Load<SpriteFont>("SpriteFont1");
            }
        }

        //グラフィクスコンテントの解放
        protected override void UnloadGraphicsContent(bool unloadAllContent) {
            if (unloadAllContent == true) {
                content.Unload();
            }
        }

        //描画
        protected override void Draw(GameTime gameTime) {
            //背景色の指定
            graphics.GraphicsDevice.Clear(Color.White);

            //テキストの描画
            spBatch.Begin();
            Vector2 pos = new Vector2(10, 10);
            spBatch.DrawString(font, "ハローワールド!", pos, Color.Black);
            spBatch.End();

            //ベースの描画
            base.Draw(gameTime);
        }
    }
}


−戻る−