とりあえずサイトの方の Tips では、基本的な部分から応用的な部分まで一通り書いていきますが、こっちのブログでは実際に使う機会が多そうなプログラムを書いていく予定です。
XNA での文字表示についてですが、実は「1.0 Refresh」よりも前のバージョンでは標準で文字を表示できる機能はありませんでした。おそらく Xbox360 の絡みでフォントによる文字イメージをその場で生成することができないからだと思います(あくまでも私の推測ですが…)。
しかし、デバッグをする際にもリアルタイムに情報を表示できる機能は結構重要で、手軽に文字を表示できなかったのは結構不便だったと思います。そこで「1.0 Refresh」から「SpriteFont」と呼ばれるクラスが実装されるようになり、わざわざ自分で文字イメージを用意しなくても好きなフォントで描画することが可能になりました。
では、まず最初に「.spritefont」という拡張子のファイルを作成します。このファイルは文字のフォントについての情報を入れておくものであり、XML をベースにした形式で記述します。中身は下のような感じになっていますが、各項目の詳細はコメントを見てください。ファイルは UTF-8 で保存します。
<?xml version="1.0" encoding="utf-8"?>
<XnaContent xmlns:Graphics="Microsoft.Xna.Framework.Content.Pipeline.Graphics">
<Asset Type="Graphics:FontDescription">
<FontName>MS ゴシック</FontName>
<Size>24</Size>
<Spacing>4</Spacing>
<Style>Regular</Style>
<CharacterRegions>
<CharacterRegion>
<Start> </Start>
<End>~</End>
</CharacterRegion>
</CharacterRegions>
</Asset>
</XnaContent>
ファイルを作成したらプロジェクトに追加しましょう。ファイル名はなんでもいいです。「.spritefont」ファイルはコンテントとして扱うことができます。
で、肝心のプログラムの方ですが、
SpriteBatch spriteBatch = null;
SpriteFont font = null;
まず、フィールドとして「SpriteBatch」と「SpriteFont」クラスを使用します。
this.spriteBatch = new SpriteBatch(device);
this.font = this.content.Load<SpriteFont>("Font");
続いて、LoadGraphicsContent メソッド内で「SpriteBatch」を作成し、ContentManager.Load メソッドで先ほど追加した「Font.spritefont」ファイルのアセット名を指定して「SpriteFont」クラスを作成します。
描画はいたって簡単で
this.spriteBatch.Begin();
this.spriteBatch.DrawString(this.font, "Draw Sprite in a screen.",
Vector2.Zero, Color.White);
this.spriteBatch.End();
という風にスプライトを描画するときと同じような形の記述になります。
「SpriteBatch.DrawString」メソッドに、先ほど作成した「SpriteFont」を第1引数指定し、第2引数に表示させる文字を指定します。残りの引数はスプライトの描画と同じです。
ここで注意してほしいのが、今回のプログラムは「英数字(と一部の記号)」しか表示できません。日本語などを指定すると描画時に例外を発生させてしまいます。
実は「.spritefont」ファイルの下のほうを見てみると
<CharacterRegions>
<CharacterRegion>
<Start> </Start>
<End>~</End>
</CharacterRegion>
</CharacterRegions>
という記述があるのですが、これはビルド時に Unicode で定義されている文字コードの「32(ASCIIのスペース)から126('~')」の間に含まれる文字を、画素データとして作成することを指定しています。しかし、日本語の文字はこのコードの間には含まれていないので、描画時にコードを検出できずエラーとなるのです。
もちろん、このコードの範囲を大きくして日本語の文字を含めるようにすれば表示できますが、正直お勧めしません(やってみるとわかりますが…固まります(^^;))。このあたりの説明については、 XNA の開発に携わっている伊藤さんのブログで説明されています。日本語などの他言語の表示の仕方についても説明されているので、参考にしてみるといいでしょう。