最近做遊戲涉及到了使用xml和顯示中文,而這兩點都涉及到了“內容管道擴展”。關於“內容管道擴展”留在以後說,而我們僅僅只需要有一個簡單的概念——我們通過它來處理我們自定義格式的數據的加載,而之前常常用到的Content.load<Texture2D>("XXX") 其實就是說用處理Texture的內容管道來加載名字爲XXX的文件數據。
進入正題:
wp7 xna 默認是隻有英文的,但是實際上,我們只需告訴它——“我們要用的中文字符有XXXXXXXX”,然後自己重寫一個內容加載的處理方法,即可像使用默認的英文一樣的方式來使用中文了。
下面是手把手的步驟介紹:
1.創建windows phone Game 項目。
2.添加內容管道擴展庫。
右擊解決方案->添加->新建項目
選擇“內容管道擴展庫”(ContentPipelineExtension),這裏爲了簡單,就使用默認的名稱了——ContentPipelineExtension1.
完成這個步驟之後可以見到解決方案中多了一個項目:
這個項目中有一個叫做ContentProcessor1.cs的類,它就是我們要重寫的處理內容的類。
3.告訴我們的Content我們要用的中文字符有哪些。
新建一個文本文件“text.txt”,輸入“使用中文真簡單”
,然後文件->另存爲,特別注意的是要保存爲“Unicode”。如下圖:
然後我們將其添加到解決方案的“XXXContent”項目中,並且在text.txt的屬性欄中的“生成操作”改爲“無”
4.教會ContentProcessor1如何來加載中文漢字:
打開ContentProcessor1.cs文件,會見到自動生成的
public class ContentProcessor1 : ContentProcessor<TInput, TOutput>
我們現將ContentProcessor<TInput, TOutput>改爲:FontDescriptionProcessor
然後將自動生成的方法
public override TOutput Process(TInput input, ContentProcessorContext context)
刪除掉,並且 override Process:(要讓VS自動生成哦,自己手寫就有些麻煩了~)
public override SpriteFontContent Process(FontDescription input, ContentProcessorContext context)
再然後就是實現處理的內容:
public override SpriteFontContent Process(FontDescription input, ContentProcessorContext context)
{
string path = Path.GetFullPath(@"../MyGameContent/text.txt");//獲得txt文件的完整路徑 MyGameContent是XXContent項目
context.AddDependency(path);
string content = File.ReadAllText(path, System.Text.Encoding.UTF8); //用UFT-8來讀取文本內容,所以前面txt一定要保存爲unicode
foreach (char c in content)
{
input.Characters.Add(c);
}
return base.Process(input, context);
}
此時此刻,其實大部分的任務已經完成了,我們將進入到最需要注意的下一步:
5.項目和項目的關係梳理:
在這個解決方案中有三個項目:
MyGame(主遊戲項目)
MyGameContent(內容項目)
ContentPipelineExtension1(內容管道擴展項目)
其中一開始在建立真個解決方案的時候,VS自己將MyGameContent註冊給了MyGame,也就是說MyGame是認識Content的,但是因爲ContentPipelineExtension1是我們後來加上的,所以他與前兩者並不認識。我們要做兩件事來讓他們相認:
我們先右擊MyGameContent項目,選中項目依賴項:
然後將ContentPipelineExtension1註冊給MyGame即可:
這樣子,主項目就認識內容管道擴展項目了,
然後我們得讓Content項目認識內容管道擴展項目:其實就是在Content項目中添加引用:
ok,連Content都已經認識內容管道擴展項目了。
特別注意:在完成了這個步驟後一定要先“重新生成解決方案”一下(此時纔是按我們的“項目依賴項”的順序生成程序的)
6.再做一次特別提醒——在完成了上面的步驟後一定要“重新生成解決方案”一下。
7.最後一步,設置字體的內容處理器爲我們自己的。
先正常的在Content項目中添加->新建項->Sprite字體
然後修改spriteFont的內容處理器條目:
(題外話:
細心的孩子早就發現了其實這個名字就是在代碼中自動生成的這句話:
[ContentProcessor(DisplayName = "ContentPipelineExtension1.ContentProcessor1")]
public class ContentProcessor1 : FontDescriptionProcessor
)
。
然後我們打開SpriteFont1.spritefont文件,
將其中的
<FontName>Segoe UI Mono</FontName> 修改爲 <FontName>微軟雅黑</FontName>
<CharacterRegion>
<Start> </Start>
<End>~</End>
</CharacterRegion>
修改爲
<CharacterRegion>
<Start> </Start> <!--這裏是一個空格-->
<End>~</End>
</CharacterRegion>
7.然後你可以歡呼雀躍了(我已經在歡呼雀躍了!)
接下來和使用英文spritefont的一樣:
public class Game1 : Microsoft.Xna.Framework.Game
{
SpriteFont font;
protected override void LoadContent()
{
font = Content.Load<SpriteFont>(@"SpriteFont1");
}
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
spriteBatch.Begin();
spriteBatch.DrawString(font, "使用中文", Vector2.Zero, Color.Black);
spriteBatch.End();
base.Draw(gameTime);
}
}
不過一定要提醒你不要高興過頭,如果在你運行的時候出現了異常,那就應該是你沒有把某個使用的漢字放在text.txt中的緣故了。
該代碼和項目已經上傳,歡迎下載。
OK到此結束~
最後像以往一樣吐槽一句。之前看了幾篇博客,有種想暴打一頓該博客(不是博主)的衝動。因爲他們無一例外地忽略掉了"5.項目和項目的關係梳理"和"重新生成解決方案"
的描述,最後他們happy成功顯示了漢字,我卻...
平時不太有寫博客的習慣,但是爲了不再讓大家重蹈覆轍,所以寫下了這篇博客。
如果讀者發現照做有誤的話,也有一種”想暴打博客“的衝動的話,歡迎留言,我會及時修改錯誤!