[XNA4] 使用FontDescriptionProcessor擴充字集
最近對寫遊戲產生興趣
抓了XNA4來玩
順便把一些心得記錄下來
XNA顯示字型不像Winform那麼簡單
必須把字型轉譯成圖片
XNA才能在遊戲場景裡把它畫出來
XNA裡有一個SpriteFont類別就是在處理字型轉譯圖片的工作
先把會用到的字設定在SpriteFont檔裡
然後遊戲裡就能使用那些字
如果使用了沒設定的字
遊戲就會出錯
**"耶"字沒加入SpriteFont檔裡**
可是中文不會只用到幾個字而已
如果要照著上面的方法把字一個一個加到SpriteFont檔裡
真的是費工又耗時
如果可以把字串直接貼上文字檔
讓程式編譯時自動去轉譯
這樣可以省下不少功夫
首先我們在遊戲的方案上按右鍵 > 加入 > 新增專案
專案類型選"Content Pipeline Extension Library (4.0)"
名稱命為"FontProcessor"
然後編輯ContentProcessor1.cs
把原先繼承ContentProcessor類別改繼承FontDescriptionProcessor類別
並把Process方法整段移除
編輯後的ContentProcessor1.cs檔看起來如下
然後為這個類別增加一個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類別
然後再對Content按右鍵 > 加入 > 新增項目
新增Sprite Font類型
名稱命為"DefaultFont.spritefont"
然後設定DefaultFont.spritefont的屬性
把Content Processor設定為FontProcessor
也就是我們一開始新增的類別
**變更為FontProcessor後可以看到字型文字檔的欄位設定**
編輯DefaultFont.spritefont裡的字型
改成你想要顯示在遊戲場景中的樣式
再來我們用記事本新增一個文字檔
內容打上要在遊戲場景裡顯示的字
編輯好後存為fonts.txt
儲存時編碼記得選UTF-8
然後用檔案總管把fonts.txt複製到Content所在的目錄
當然你也可以把fonts.txt加入專案
這樣以後可以直接用VS編輯文字檔增加字串
但記得設定屬性把"建置動作"改成"無"
這樣前置動作大致就完成了
剩下的就只是怎樣把字顯示在遊戲場景裡
編輯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啟動方案
就可以看到字被正確的畫到遊戲場景了
想做多國語言也不成問題喔
努力學習XNA