這篇感覺跟我之前的某篇有牴觸到...
之前某篇說,XNA只能作英文的遊戲,像中文、日文、德文那些根本不可能做到...
下午看到一篇文章,我才知道,是時尚中文遊戲、日文遊戲用XNA是可以實做出來的!!
只是用這種方法,代價非常的高~原因是因為,XNA的Content Pipeline會將SpriteFont中指定的文字範圍,轉換成圖片檔
這樣可以在XBOX360跟PC上面做執行,而不用擔心字體的問題...
所以這一切的關鍵,就是在"SpriteFont中指定的文字範圍"!!
首先我們開啟一個新的XNA 2.0的專案,在Content中增加SpriteFont檔案...
決定好字型、字體、大小、風格以後,把檔案捲動到最後可以看到
<CharacterRegions>
<CharacterRegion>
<Start> </Start>
<End>~</End>
</CharacterRegion>
</CharacterRegions>
上面的32-126就是英文字、數字等,這些是預設的範圍,所以才會說XNA只能做英文遊戲...
這邊數字範圍是UTF-8的十進位數值
所以這邊我就做了一些修改...
中文字起始範圍是0x4E00-0x9FFF
這邊要提醒一下,雖然這些差距才兩萬多個中文字...
不過我用雙核心1.6跑,目前編譯到第五個小時都還沒有編譯完成...
不過可以用字定範圍的方式來決定,中文字的範圍,不要全部都製圖...
一方面檔案會很大、一方面編譯時間會很久
上述都設定完成以後,就可以到專案中可以在顯示的地方用文字囉
string text = "中文字測試";
spriteBatch.Begin();
spriteBatch.DrawString(spriteFont,text,new Vector(0,0),Color.Red);
spriteBatch.End();
以上做法還沒有移動到XBOX360上面...因為目前手頭沒有機器...
不過應該是可以在XBOX360上面顯示!!
UTF8查詢 : http://www.utf8-chartable.de/unicode-utf8-table.pl
之前某篇說,XNA只能作英文的遊戲,像中文、日文、德文那些根本不可能做到...
下午看到一篇文章,我才知道,是時尚中文遊戲、日文遊戲用XNA是可以實做出來的!!
只是用這種方法,代價非常的高~原因是因為,XNA的Content Pipeline會將SpriteFont中指定的文字範圍,轉換成圖片檔
這樣可以在XBOX360跟PC上面做執行,而不用擔心字體的問題...
所以這一切的關鍵,就是在"SpriteFont中指定的文字範圍"!!
首先我們開啟一個新的XNA 2.0的專案,在Content中增加SpriteFont檔案...
決定好字型、字體、大小、風格以後,把檔案捲動到最後可以看到
<CharacterRegions>
<CharacterRegion>
<Start> </Start>
<End>~</End>
</CharacterRegion>
</CharacterRegions>
上面的32-126就是英文字、數字等,這些是預設的範圍,所以才會說XNA只能做英文遊戲...
這邊數字範圍是UTF-8的十進位數值
所以這邊我就做了一些修改...
中文字起始範圍是0x4E00-0x9FFF
這邊要提醒一下,雖然這些差距才兩萬多個中文字...
不過我用雙核心1.6跑,目前編譯到第五個小時都還沒有編譯完成...
不過可以用字定範圍的方式來決定,中文字的範圍,不要全部都製圖...
一方面檔案會很大、一方面編譯時間會很久
上述都設定完成以後,就可以到專案中可以在顯示的地方用文字囉
string text = "中文字測試";
spriteBatch.Begin();
spriteBatch.DrawString(spriteFont,text,new Vector(0,0),Color.Red);
spriteBatch.End();
以上做法還沒有移動到XBOX360上面...因為目前手頭沒有機器...
不過應該是可以在XBOX360上面顯示!!
UTF8查詢 : http://www.utf8-chartable.de/unicode-utf8-table.pl
文章標籤
全站熱搜

恩~~所以那邊要怎麼改呢? 她是十進位要弄成8進位?
一
鿿
這樣對嗎?
因為我這樣按下去按建置軟體好像開始編繹了(軟體不能動~~死)
不知道要過多久才能按除錯= =|||
除錯應該就直接執行了吧
嗯 這種方式我做過實驗12小時還沒有編譯好... PS 目前有試過...1500個中文字,是可以編譯的 我在想有沒有其他方式可以做= = 畢竟這樣編譯太久了
其實在大陸某論壇有看過PC專用的方法. System.Drawing.Font font = new System.Drawing.Font(FontName, FontSize, FontStyle); System.Drawing.SizeF ef = System.Drawing.Graphics.FromImage(tmpBmp).MeasureString(text, font); System.Drawing.Bitmap image = new System.Drawing.Bitmap((int)ef.Width, (int)ef.Height); System.Drawing.Graphics pictrue = System.Drawing.Graphics.FromImage(image); pictrue.DrawString(text, font, new System.Drawing.SolidBrush(System.Drawing.Color.FromArgb(color.R, color.G, color.B)), new System.Drawing.PointF()); pictrue.Dispose(); System.IO.MemoryStream stream = new System.IO.MemoryStream(); image.Save(stream, System.Drawing.Imaging.ImageFormat.Png); stream.Seek((long)0, System.IO.SeekOrigin.Begin); // //GraphicsAdapter.DefaultAdapter //new GraphicsDevice( texture = Texture2D.FromFile(mdevice, stream); 上面就是把自用"畫"的畫到記憶體然後丟到Texture2D裡面去- .- 但是這個很吃CPU阿...所以建議大家小心使用0.0 --------------------------------- 想在360上面用的話...就自己寫個把字畫成圖片的程式吧-.- 然後用畫出來的來貼字0 v0
嗯 這個做法有看過 這個做法只能用在PC上面,因為他是在執行的時後才產生圖片,再來運作,同時這樣作法對CPU吃很重ORZ 對PC開法的人這種做法OK 只是效能部分要住一下了... PS EXPRESS版本的可能會找不到LIB... using System.Drawing; 這個可能會找不到 補充一下,他試用GDI+的方式去做的,將字體先儲存程圖片,在載入成2D材質...
char c = '\u4e00'; string textc = c.ToString(); textBox1.Text = textc; int fsize = (int)textBox1.Font.Size + 3; for (int k = 0; k < 10; k++) { Bitmap tmBmp = new Bitmap(50 * (int)textBox1.Font.Size) + (50 * 3) + 3, (50 * (int)textBox1.Font.Size) + (50 * 3) + 3); Graphics picture = System.Drawing.Graphics.FromImage(tmBmp); for (int i = 0; i < 50; i++) { for (int j = 0; j < 50; j++) { PointF poi = new PointF(j * fsize, i * fsize + 1); picture.DrawString(textc, textBox1.Font, new SolidBrush(textBox1.ForeColor), poi); c++; textc = c.ToString(); } } picture.Dispose(); tmBmp.Save(textBox4.Text + k.ToString()+".PNG"); }
按太快了= = 補充說明一下上面的code 反正就是把字畫出來- .- 每2500個,存成textbox4內文字加上數字的PNG檔 然後字型大小之類的都是配合textbox1的字型和大小(可以用一個FONT的DIALOG去改他) 跑0x4e00-0x9fff (其實有超過拉XD 偷懶) 不到1分鐘- .- 大家參考看看吧 . v.
可以先用這種方式先製作中文圖片 可是位置到最好要算好 囧
他說效能會不好應該是不要在DRAW或是UPDATE等會重覆跑的地方"不斷"的產生文字!~ 只產生一次應該還OK 目前我的中文就是這樣跑!~~第一次出現的字串才產生testure2d 並將它存在文字TABLE內 之後要用到就直接從TABLE內拿testure2d出來用就可以了
一般會說效能不好的原因是... 因為他是用GDI+,在來一點,他是不斷的UPDATE跟DRAW,就算你在別的地方呼叫其他的FUNCTION,只要你要顯示出來,就一定會呼叫UPDATE跟DRAW,所以一定會發生很吃資源的情況。
說到位置我就覺得很奇怪= = 明明大小設定為20 可是...他字的出來的就是25左右= = 很怪,根本不知道要怎麼計算 = 口= ------------------------------- 樓上的,做RPG之類字多的就.....
圖片跟實體會有差ORZ 所以這樣看很不準確,在來解析度那些也會影響
font size = 20 不代表他是20像素喔
應該說跟字型設計也有關系 再來XNA不用像素做單位,他們有自訂的一套單位
請問pupu,這個程式是要打在那裡呢? 很快的- .- char c = '\u4e00'; string textc = c.ToString(); textBox1.Text = textc; int fsize = (int)textBox1.Font.Size + 3; for (int k = 0; k < 10; k++) { . . .
你要用在XNA裡面的話... 還是說你現在是要win form結合XNA? 因為如果要XNA來Draw字型的話 不會將值丟入text box 有點不清楚你的問題 希望可以詳細描述
我發現一個不錯的方式,Dynamic Sprite Font - XNA 顯示及動態生成多國文字 。 下面是轉載的路徑 http://devkito.blogspot.com/search/label/XNA
如果字沒有要畫很多的話, 可以用 http://msdn.microsoft.com/zh-tw/windowsphone/gg570013 介紹的定義方式
其實兩個方法大同小異... 我當初在寫這個範例時,有提供一個converter 其實也就是自己定義一個spritefont檔案(也就自己寫paser) 然後當初在做的時候是把中文字的unicode編碼寫進去... 所以其實兩個做法是一樣的