日本語文字を表示

XNA でフォントを設定して日本語文字を表示します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プロジェクトの設定

  1. 英字の表示は簡単なのですが、日本語の表示はちょっと手間がかかります。 (^_^;)
    [スタート] [すべてのプログラム] から [Microsoft XNA Game Studio 3.0(CTP)][Microsoft Visual Studio 2008] を起動して下さい。
    メニューから [ファイル][新規作成][プロジェクト] を選択すると新しいプロジェクトの画面が表示されます。
    [Visual C#][XNA Game Studio 3.0][Windows Game(3.0)] を選んで下さい。
    [Microsoft XNA Game Studio 2.0] を使うときも同じ要領です。
    プロジェクト名は [HelloWorld] にして下さい。
  2. XNA アプリケーションで文字列の表示を行うには、XNAアプリケーションに利用するフォントを追加しなければなりません。
    ソリューションエクスプローラで Content を右クリックして、ポップアップの「追加⇒新しい項目」で「Sprite Font」を選択して下さい。
    新しい項目を追加
  3. 追加した「SpriteFont1.spritefont」を開き、ソースコードを編集します。
    項目 説明
    FontName 開発するパソコンにあるTrueTypeフォントの名前を指定
    Size フォントサイズをポイント単位で指定
    Spacing 文字間のピクセル数を指定
    UseKerning カーニングの指定(true or false)
    Style フォントスタイル(Regular、Bold、Italic)を指定
    CharacterRegions 利用する文字範囲を指定( 〜~ は、全ASCIIコードに設定)

    文字列の描画には、FontName に「MS UI Gothic」など、自分の PC に存在するフォント名を指定します。
    自分の PC で使用できるフォント名は、コントロールパネルのフォントから確認することが出来ます。
    SpriteFont1.spritefont
    <?xml version="1.0" encoding="utf-8"?>
    <XnaContent xmlns:Graphics="Microsoft.Xna.Framework.Content.Pipeline.Graphics">
      <Asset Type="Graphics:FontDescription">
    
        <!--フォント名-->
        <FontName>MS UI Gothic</FontName>
    
        <!--フォントサイズ-->
        <Size>24</Size>
    
        <!--文字間隔-->
        <Spacing>0</Spacing>
    
        <!--カーリングの利用-->
        <UseKerning>true</UseKerning>
    
        <!--スタイル-->
        <Style>Regular</Style>
        
        <!--利用する文字範囲-->
        <CharacterRegions>
          <CharacterRegion>
            <Start>&#32;</Start>
            <End>&#126;</End>
          </CharacterRegion>
          <CharacterRegion>
            <Start>&#x30a0;</Start>
            <End>&#x30ff;</End>
          </CharacterRegion>
        </CharacterRegions>
      </Asset>
    </XnaContent>
  4. 次に表示する文字を羅列したメッセージファイルを作成します。
    今回は「ひらなかとカタカナ」を使ってみます。
    messages.txt という名前でテキストファイルを作成して下さい。
    最終行は改行コードが必要です。
    あいうえおぁぃぅぇぉかきくけこさしすせそたちつてとっ
    なにぬねのはひふへほまみむめもやゆよゃゅょらりるれろ
    わをんがぎぐげござじずぜぞだぢづでどばびぶべぼぱぴぷぺぽ
    アイウエオァィゥェォカキクケコサシスセソタチツテトッ
    ナニヌネノハヒフヘホマミムメモヤユヨャュョラリルレロ
    ワヲンガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポ
    、。−!?
    
  5. messages.txt をソリューションエクスプローラの Content にドラッグ&ドロップします。
    messages.txt を開き、メニュー「ファイル⇒保存オプションの詳細設定」で「Unicode (UTF8 シグネチャ(BOM)なし)」で文字コードを変更します。
    messages.txt のプロパティのビルドアクションに「なし」を指定します。
  6. 次にフォントプロセッサを作成します。
    ソリューションエクスプローラのソリューション名(先頭)を右クリックして、ポップアップ「追加→新しいプロジェクト」を選択し、 Windows Game Library (3.0)」を「FontProcessors」という名前で追加します。
    格納する場所は問いませんが、現在作業中のフォルダー(HelloWorld)に格納するのが解りやすいでしょう。
    プロジェクト「FontProcessors」の参照設定を右クリックし、「参照の追加」を選択し、「Microsoft.Xna.Framework.Content.Pipeline」を追加します。
  7. FontProcessors の「Class1.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);
        }
    }
    
  8. ソリューションエクスプローラのプロジェクト"FontProcessors"のプロジェクト名を右クリックし、 ポップアップ「ビルド」を選択すると "FontProcessors" がコンパイルされます。
    この後で説明する SpriteFont1.spritefont のプロパティに「DefaultFontProcessor」が表示されない時は ここまでの処理を見直して下さい。
  9. メッセージファイルとフォントプロセッサの関連付けを行います。
    ソリューションエクスプローラの HelloWorld の Content の下の参照設定を右クリックし、「参照の追加」を選択します。
    プロジェクトタブで FontProcessors を選択し OK ボタンを押します。

  10. ソリューションエクスプローラのソリューション名(先頭)を右クリックし、「プロジェクトの依存関係」を選択します。
    プロジェクトコンボボックスで「HelloWorld」を選択し、依存先の FontProcessors をチェックします。

  11. ソリューションエクスプローラの HelloWorldの「Content」内にある「SpriteFont1.spritefont」を選択します。
    プロパティの「Content Processor」を「Font Description - XNA Framework」から「DefaultFontProcessor」へ変更します。

  12. Game1.cs を次のように編集します。
    /*************************************/
    /*★ 日本語文字列の表示    前田 稔 ★*/
    /*************************************/
    #region Using Statements
    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;
    #endregion
    
    namespace HelloWorld
    {
        public class Game1 : Microsoft.Xna.Framework.Game
        {
            private GraphicsDeviceManager graphics;     //グラフィックス
            private SpriteBatch           spriteBatch;  //スプライトバッチ
            private SpriteFont            font;         //フォント
    
            #region コンストラクタ
            public Game1()
            {
                graphics=new GraphicsDeviceManager(this);
                Content.RootDirectory="Content";
            }
            #endregion
    
            #region 初期化
            protected override void Initialize()
            {
                base.Initialize();
            }
            #endregion
    
            #region グラフィック読込み
            protected override void LoadContent()
            {
                spriteBatch=new SpriteBatch(GraphicsDevice);
                font=Content.Load<SpriteFont>("SpriteFont1");
            }
            #endregion
    
            #region グラフィクスコンテントの解放
            protected override void UnloadContent()
            {
            }
            #endregion
    
            #region アップデート処理
            protected override void Update(GameTime gameTime)
            {
                //アプリ終了
                if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed  ||
                    Keyboard.GetState().IsKeyDown(Keys.Escape)) this.Exit();
    
                //ベースの更新
                base.Update(gameTime);
            }
            #endregion
    
            #region 描画処理
            protected override void Draw(GameTime gameTime)
            {
                //背景の描画
                graphics.GraphicsDevice.Clear(Color.CornflowerBlue);
    
                //文字列の描画
                spriteBatch.Begin();
                DrawString("ハローワールド!",50,50);
                spriteBatch.End();
    
                //ベースの描画
                base.Draw(gameTime);
            }
            #endregion
    
            #region 文字列の描画
            private void DrawString(String str,int x,int y)
            {
                spriteBatch.DrawString(font,str,new Vector2(x,y),Color.White);
            }
            #endregion
        }
    }
    
  13. プログラムを実行すると「ハローワールド!」が表示されます。
    半角文字は messages.txt に登録しなくても表示できるようです。

前田稔(Maeda Minoru)の超初心者のプログラム入門

超初心者のプログラム入門(XNA(C#) game program)