▼XNA Game Studioメモ▼
日本語文字列の表示


「ハローワールド!」という日本語文字列を表示するプログラムを作成する。



フォントの追加
  1. ソリューションエクスプローラのHelloWorldの「Content」を右クリック
  2. ポップアップの「追加→新しい項目」で「Sprite Font」を選択し追加ボタンを押す。名前は「DefaultFont.spritefont」とする。
  3. 「DefaultFont.spritefont」を開き、「FontName」に「MS UI Gothic」を指定する。
メッセージファイルの作成
  1. 「messages.txt」という名前で表示する文字列を羅列したテキストファイルを作成。最終行は改行必要。
    あいうえおぁぃぅぇぉかきくけこさしすせそたちつてとっなにぬねのはひふへほまみむめもやゆよゃゅょらりるれろわをんがぎぐげござじずぜぞだぢづでどばびぶべぼぱぴぷぺぽアイウエオァィゥェォカキクケコサシスセソタチツテトッナニヌネノハヒフヘホマミムメモヤユヨャュョラリルレロワヲンガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポ、。−!?
  2. ソリューションエクスプローラのContentにドラッグ&ドロップ。
  3. 「messages.txt」を開き、メニュー「ファイル⇒保存オプションの詳細設定」で「Unicode (UTF8 シグネチャ(BOM)なし)」で文字コードを変更。
  4. 「messages.txt」のプロパティのビルドアクションに「なし」を指定。

フォントプロセッサの作成
  1. ソリューションエクスプローラのソリューション名を右クリック
  2. ポップアップ「追加→新しいプロジェクト」を選択し、「Windows Game Library (3.0)」を「FontProcessors」という名前で追加。
  3. プロジェクト「FontProcessors」の参照設定を右クリックし、「参照の追加」を選択し、「Microsoft.Xna.Framework.Content.Pipeline」を追加。
  4. 「Class1.cs」の名前を「DefaultFontProcessor.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 DefaultFontProcessor : 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);
        }
    }
  5. ソリューションエクスプローラのプロジェクト"FontProcessors"のプロジェクト名を右クリックし、ポップアップ「ビルド」を選択。
メッセージファイルとフォントプロセッサの関連付け
  1. ソリューションエクスプローラのHelloWorldのContentの下の参照設定を右クリックし、「参照の追加」を選択。
  2. プロジェクトタブでFontProcessorsを選択しOKボタンを押す。
  3. ソリューションエクスプローラのソリューション名を右クリックし、「プロジェクトの依存関係」を選択。
  4. プロジェクトコンボボックスで「HelloWorld」を選択し、依存先のFontProcessorsをチェック。
  5. ソリューションエクスプローラのHelloWorldの「Content」内にある「DefaultFont.spritefont」を選択。
  6. プロパティの「Content Processor」を「Font Description - XNA Framework」から「DefaultFontProcessor」へ変更する。
ソースコードの編集
  1. Game.csを以下のように編集。
Game.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.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.Storage;

namespace HelloWorld {
    public class GameMain : Microsoft.Xna.Framework.Game {
        private GraphicsDeviceManager graphics;   //グラフィックス
        private SpriteBatch           spriteBatch;//スプライトバッチ
        private SpriteFont            font;       //フォント

        //コンストラクタ
        public GameMain() {
            graphics=new GraphicsDeviceManager(this);
            Content.RootDirectory="Content";
        }

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

        //グラフィクスコンテントの読み込み
        protected override void LoadContent() {
            spriteBatch=new SpriteBatch(GraphicsDevice);
            font=Content.Load<SpriteFont>("DefaultFont");
        }

        //グラフィクスコンテントの解放
        protected override void UnloadContent() {
        }

        //更新
        protected override void Update(GameTime gameTime) {
            //アプリ終了
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back==
                ButtonState.Pressed) {
                Exit();
            }

            //ベースの更新
            base.Update(gameTime);
        }

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

            //文字列の描画
            spriteBatch.Begin();
            DrawString("ハローワールド!",50,50);
            spriteBatch.End();

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

        //文字列の描画
        private void DrawString(String str,int x,int y) {
            spriteBatch.DrawString(font,str,new Vector2(x,y),Color.White);
        }
    }
}



−戻る−