■XNAでフォント Prev  Top  Next

今回はフォントを表示します。通常ゲームでは自前の画像で文字を表示します。このほうがかっこいいし、環境に依存しないという利点があります。 しかし、アドベンチャーやRPGのように文字数が多い場合、すべての文字を画像にするのは現実的ではないのでその場合はOSにセットアップされているフォントを使用します。 他にも開発中に変数の値を画面上に表示してテストを行ったりとフォントの利用価値は高いです。

さて、フォントを使用するにはテクスチャーと同じくリソースとして登録する必要があります。せっかくですから14.:XNAでリソース追加で紹介した方法とは別の方法で登録します。
まず「Resource」フォルダを「ソリューションエクスプローラー」上に作成します。フォルダの作成は、14.:XNAでリソース追加を参照して作成してください。


次にツールバーの赤丸の部分をクリックします。アイコンが見つからないときはメニューの「表示」をクリックし、「ツール バー」をポイントして、表示されるプルダウンメニューの下のほうにある「標準」をクリックしてください。


ダイアログボックスが表示されます。まず「Sprite Font」アイコンをクリックします。次にウィンドウの下のほうにある「ファイル名」を変更します。ここではFont.spritefontに変更します。ファイル名を変更したら「追加」ボタンをクリックしてください。


このようになりました。

次にFont.spritefontファイルを編集します。ファイルの中身はただのXML形式のテキストファイルですので、直接編集できます。 Font.spritefontファイルをダブルクリックして、内容を表示します。

---Font.spritefont---


<?xml version="1.0" encoding="utf-8"?>
<!--

-->
<XnaContent xmlns:Graphics="Microsoft.Xna.Framework.Content.Pipeline.Graphics">
  <Asset Type="Graphics:FontDescription">

    <!--
    フォントのタイプフェイス名を指定する。(注意1)
    -->
    <FontName>MS ゴシック</FontName>

    <!--
  フォントのサイズを指定する。float指定が可能。ポイントサイズで指定する。
    -->
    <Size>14</Size>

    <!--
  フォント間隔を指定する。float指定が可能。ピクセルサイズで指定する。
    -->
    <Spacing>2</Spacing>

    <!--
    フォントスタイルを指定する。標準:"Regular", 太字:"Bold", 斜体:"Italic", 太字と斜体両方:"Bold, Italic"
    -->
    <Style>Regular</Style>

    <!--
  文字コードの範囲を指定する。Unicode。文字コードは10進数で指定する。ここでは32から126としているため、' 'から'~'の範囲となる。(注意2)
    -->
    <CharacterRegions>
      <CharacterRegion>
        <Start>&#32;</Start>
        <End>&#126;</End>
      </CharacterRegion>
    </CharacterRegions>
  </Asset>
</XnaContent>

Font.spritefontファイルの内容です。フォント情報が記述されています。

(注意1) OSにインストールされているフォントをして指定してください。でないとコンパイルエラーが発生します。 使用できるフォントのタイプフェイス名がわからないときはメモ帳を開いて、「書式」メニューをクリックして、「フォント」をクリックすると、 ダイアログボックスが表示されるので「フォント名」に表示されている一覧がフォントのタイプフェイス名です。 これとまったく同じように、つまり全角文字で入力してください。

(注意2) よく意味がわからない方は「Unicode 文字コード表」でググってください。

次にソース本体です。

---Game1.cs---


namespace Tutrial
{
   /// 
   /// This is the main type for your game
   /// 
   public class Game1 : Microsoft.Xna.Framework.Game
   {
      private GraphicsDeviceManager graphics = null;
      private ContentManager content = null;

      //****************************************************************
      //オブジェクトの定義
      //****************************************************************

      private SpriteBatch spriteBatch = null;   //スプライトオブジェクト
      private SpriteFont font = null;           //フォントオブジェクト

      public Game1()
      {
         this.graphics = new GraphicsDeviceManager(this);

         //リソースフォルダのルートパスを指定
         this.content = new ContentManager(this.Services, "Resource");
      }


      /// 
      /// Allows the game to perform any initialization it needs to before starting to run.
      /// This is where it can query for any required services and load any non-graphic
      /// related content.  Calling base.Initialize will enumerate through any components
      /// and initialize them as well.
      /// 
      protected override void Initialize()
      {
         //****************************************************************
         //オブジェクトの初期化
         //****************************************************************

         //スプライトの初期化
         this.spriteBatch = new SpriteBatch(this.graphics.GraphicsDevice);

         //フォントを読み込む
         this.font = this.content.Load("Font");


         base.Initialize();
      }


      /// 
      /// Load your graphics content.  If loadAllContent is true, you should
      /// load content from both ResourceManagementMode pools.  Otherwise, just
      /// load ResourceManagementMode.Manual content.
      /// 
      /// Which type of content to load.
      protected override void LoadGraphicsContent(bool loadAllContent)
      {
         if (loadAllContent)
         {
            // TODO: Load any ResourceManagementMode.Automatic content
         }

         // TODO: Load any ResourceManagementMode.Manual content
      }


      /// 
      /// Unload your graphics content.  If unloadAllContent is true, you should
      /// unload content from both ResourceManagementMode pools.  Otherwise, just
      /// unload ResourceManagementMode.Manual content.  Manual content will get
      /// Disposed by the GraphicsDevice during a Reset.
      /// 
      /// Which type of content to unload.
      protected override void UnloadGraphicsContent(bool unloadAllContent)
      {
         if (unloadAllContent == true)
         {
            content.Unload();
         }
      }


      /// 
      /// Allows the game to run logic such as updating the world,
      /// checking for collisions, gathering input and playing audio.
      /// 
      /// Provides a snapshot of timing values.
      protected override void Update(GameTime gameTime)
      {
         // Allows the default game to exit on Xbox 360 and Windows
         if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
            this.Exit();

         // TODO: Add your update logic here

         base.Update(gameTime);
      }


      /// 
      /// This is called when the game should draw itself.
      /// 
      /// Provides a snapshot of timing values.
      protected override void Draw(GameTime gameTime)
      {
         //背景色をグレーで塗りつぶす
         this.graphics.GraphicsDevice.Clear(ClearOptions.Target | ClearOptions.DepthBuffer, new Vector4(0.2f, 0.2f, 0.2f, 1.0f), 1.0f, 0 );

         this.spriteBatch.Begin();

         //テキストをスプライトとして描画する
         this.spriteBatch.DrawString(this.font, "Hallow World!!", Vector2.Zero, Color.White);

         this.spriteBatch.End();

         base.Draw(gameTime);
      }
   }
}


こんな感じで表示されました。ソースは特に注意することはないでしょう。SpriteFontクラスを使用していることくらいで、やっていることはこれまでとほとんど同じです。

これでグラフィックス関係は一通り解説しました。次は入力です。

Prev  Top  Next
inserted by FC2 system