[XNA4] 使用Font Description Processor擴充字集

[XNA4] 使用FontDescriptionProcessor擴充字集

最近對寫遊戲產生興趣

抓了XNA4來玩

順便把一些心得記錄下來

 

XNA顯示字型不像Winform那麼簡單

必須把字型轉譯成圖片

XNA才能在遊戲場景裡把它畫出來

 

XNA裡有一個SpriteFont類別就是在處理字型轉譯圖片的工作

先把會用到的字設定在SpriteFont檔裡

然後遊戲裡就能使用那些字

image

image

 

如果使用了沒設定的字

遊戲就會出錯

**"耶"字沒加入SpriteFont檔裡**

image 

 

可是中文不會只用到幾個字而已

如果要照著上面的方法把字一個一個加到SpriteFont檔裡

真的是費工又耗時

如果可以把字串直接貼上文字檔

讓程式編譯時自動去轉譯

這樣可以省下不少功夫

image

image

 

首先我們在遊戲的方案上按右鍵 > 加入 > 新增專案

專案類型選"Content Pipeline Extension Library (4.0)"

名稱命為"FontProcessor"

image

image

 

然後編輯ContentProcessor1.cs

把原先繼承ContentProcessor類別改繼承FontDescriptionProcessor類別

並把Process方法整段移除

編輯後的ContentProcessor1.cs檔看起來如下

image

 

然後為這個類別增加一個FontsFile屬性

儲存要轉譯的文字檔檔名

**這裡要引用System.ComponentModel命名空間**

private string fontsFile = "fonts.txt";
 
[DefaultValue("fonts.txt")]
[DisplayName("字型文字檔")]
[Description("在該字型文字檔裡所有的字都將自動被轉譯")]
public string FontsFile
{
    get { return fontsFile; }
    set { fontsFile = value; }
}

 

然後重新覆寫Process方法

把文字檔裡的字一個個讀出來添加到input.Characters裡

**這裡要引用System.IO命名空間**

public override SpriteFontContent Process(FontDescription input, ContentProcessorContext context)
{
    string fontsFileFullPath = Path.GetFullPath(FontsFile);
    context.AddDependency(fontsFileFullPath);
    File.ReadAllText(fontsFileFullPath, System.Text.Encoding.UTF8)
        .ToList<char>()
        .ForEach(c => input.Characters.Add(c));
 
    return base.Process(input, context);
}

 

這樣我們就擴充好自己的Font Description Processor類別了

那要怎麼使用它呢?

回到方案總管對Content按右鍵 > 加入參考

添加剛才完成的FontProcessor類別

image

image

image

 

 

 

 

 

然後再對Content按右鍵 > 加入 > 新增項目

新增Sprite Font類型

名稱命為"DefaultFont.spritefont"

image

image

 

 

然後設定DefaultFont.spritefont的屬性

把Content Processor設定為FontProcessor

也就是我們一開始新增的類別

**變更為FontProcessor後可以看到字型文字檔的欄位設定**

image

 

編輯DefaultFont.spritefont裡的字型

改成你想要顯示在遊戲場景中的樣式

image

 

再來我們用記事本新增一個文字檔

內容打上要在遊戲場景裡顯示的字

編輯好後存為fonts.txt

儲存時編碼記得選UTF-8

image

image

 

然後用檔案總管把fonts.txt複製到Content所在的目錄

image

 

 

 

當然你也可以把fonts.txt加入專案

這樣以後可以直接用VS編輯文字檔增加字串

但記得設定屬性把"建置動作"改成"無"

image

image

 

 

這樣前置動作大致就完成了

剩下的就只是怎樣把字顯示在遊戲場景裡

編輯Game1.cs檔

增加一個SpriteFont的類別變數

並在LoadContent方法裡初始化該變數

SpriteFont font;
 
protected override void LoadContent()
{
    spriteBatch = new SpriteBatch(GraphicsDevice);
    font = Content.Load<SpriteFont>(@"DefaultFont"); //初始化
}

 

 

然後在Draw方法裡把字畫出來

protected override void Draw(GameTime gameTime)
{
    GraphicsDevice.Clear(Color.CornflowerBlue);
 
    //把字畫出來
    spriteBatch.Begin();
    spriteBatch.DrawString(font, "點部落喔耶,\n可以隨時擴充的感覺真好", Vector2.Zero, Color.White);
    spriteBatch.End();
 
    base.Draw(gameTime);
}

 

按F5啟動方案

就可以看到字被正確的畫到遊戲場景了

image

 

想做多國語言也不成問題喔

image 

 

努力學習XNANerd