▼XNA Game Studioメモ▼
日本語を表示する
日本語を表示するプログラムを作成する。
XNAアプリケーションで利用する日本語文字の指定
XNAアプリケーションで文字列の表示を行うには、XNAアプリケーションに利用する文字を追加しなければならない。
ASCII文字はフォント定義ファイル(*.spritefont)の<CharacterRegions>で指定する。
日本語文字はmessages.txtに記述しプロジェクトに追加する。
- "JapEx"という名前のプロジェクトを作成する。
- ソリューションエクスプローラのプロジェクト名を右クリックし、ポップアップ「追加⇒新しい項目」を選択し、「Sprite Font」を"SpriteFont1.spritefont"という名前で追加する。FontNameは"MS UI Gothic"とする。
- ソリューションエクスプローラのプロジェクト名を右クリックし、ポップアップ「追加⇒新しい項目」を選択し、「テキスト ファイル」を"messages.txt"という名前で追加する。
- 「messages.txt」に利用する文字を記述する。文字コードの指定はVisual Studioのメニュー「ファイル⇒保存オプションの詳細設定」で「Unicode (UTF8 シグネチャ(BOM)なし)」を選択する。また、最終行で改行すること。
ハローワールド!
コンテントプロセッサのプロジェクトの生成
messages.txtに記述されている日本語文字をコンテントとしてXNAアプリケーションに追加するコンテントプロセッサを生成する。
コンテントパイプラインはビルド処理の一部なため、ゲーム用のプロジェクト"JapEx"とは分ける必要がある。
- ソリューションエクスプローラのソリューション名を右クリックし、ポップアップ「追加⇒新しいプロジェクト」を選択し、「Windows Game Library」を"FontProcessors"という名前で追加する。
- プロジェクト"FontProcessors"の参照設定を右クリックし、「参照の追加」を選択し、「Microsoft.Xna.Framework.Content.Pipeline」を追加する。
- デフォルトで追加されている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); } }- ソリューションエクスプローラのプロジェクト"FontProcessors"のプロジェクト名を右クリックし、ポップアップ「ビルド」を選択。
コンテントプロセッサとフォント定義ファイルの関連付け
- ソリューションエクスプローラのプロジェクト"JapEx"のプロジェクト名を右クリックし、プロパティを選択。「Content Pipeline」タブを選択し、「FontProcessors.dll」を追加する。
![]()
- ソリューションエクスプローラでソリューション名を右クリックし、「プロジェクトの依存」を選択し、コンボボックスで"JapEx"を選択し、チェックボックス「FontProcessors」をチェックする。これで"JapEx"は"FontProcessors"に依存することが指定される。
![]()
- フォント定義ファイル(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); } } }