- 注册时间
- 2007-11-2
- 最后登录
- 2007-11-3
③业余
- 积分
- 141
|
前几天,我在另外一篇日志(XNA游戏Marblets源码导读(二))里写道:目前还没有具体的解决方案,事实证明我错了,经过这两天的整理,我想在XNA游戏中显示汉字还是有很多方法的.
1.使用SpriteFont来显示汉字.
    在XNA1.0Refresh版中,新提供了SpriteFont来显示文字,但是首先我们需要将计算机中的字体转化成XNA可以识别的标准确FontDescription资源,这个转化过程,只会在我们的解决方案第一次生成的时候进行,会成成一个同名的xnb文件.我想和我在那篇日志提前的第二种方案相似吧.
    首先,我们来新建一个Windows Game解决方案,然后新追加一个Sprite Font,就保持默认名SpriteFont1.spritefont好了,打开进行编辑,修改以下两个地方.
程序代码<FontName>宋体</FontName>
程序代码<Start>& #19968;</Start>
<End>& #19999</End>
<!--<End>& #40869;</End>  注意:&和#之间没有空格-->
    宋体就是你计算机里面现在安装过的字体.
    解释一下一的意义,在FontDescription里面,使用utf-8编码,一般情况下,中文简体汉字的编码可以认为在/u4E00~/u9FA5之间,共20901个.19968实际上就是/u4E00的十进制数,40869就是/u9FA5了.
    本来,我是打算完全生成这20901个汉字,来看一下编译的时间和编译和文件的大小的.虽然我知道这个编译的过程很缓慢,但缓慢的出我意料 ,开始我预计在十来分钟左右可以完成,一直盯着计算机,想确认到一个准确的时间,后来我想有一个大概的时间就好了,再后来,我用进程管理器关掉了...我可以告诉你,这个过程超过50分钟...我的计算机是P41.73G,768M内存,如果你的"芯"够强劲,来自己试一下吧!
    最终我设置成了19999, 也就是32个汉字,很快,数秒,编译后的xnb文件是65.9KB.
    Game1里面,增加以下代码:
程序代码
public class Game1 : Microsoft.Xna.Framework.Game
    {
        ... ...
        SpriteFont sprite;
        SpriteBatch batch;
        string font;
        protected override void LoadGraphicsContent(bool loadAllContent)
        {
            if (loadAllContent)
            {
                batch = new SpriteBatch(this.graphics.GraphicsDevice);
                sprite = content.Load<SpriteFont>("SpriteFont1");
                for (int i = 19968; i <= 19999;i++ )
                {
                    font += (Char)i;
                }
        protected override void Draw(GameTime gameTime)
        {
            graphics.GraphicsDevice.Clear(Color.CornflowerBlue);
            batch.Begin();
            batch.DrawString(sprite, font, new Vector2(0,0), Color.White);
            batch.DrawString(sprite, font, new Vector2(0,30), Color.Red);
            batch.End();
            this.graphics.GraphicsDevice.Present();
            base.Draw(gameTime);
        }
最终效果如下:
    
优点:
    显示文字最方便,快速,想显示什么显示什么,PC/X360通用,各语种OS支持,便于做多语种游戏,英文游戏优先考虑.
缺点:
    编译时间长,字体资源过大,完整20901个汉字估计要40M大小,再加上字号,粗斜体等效果,光一种宋体的资源就超过100M了,更别说多种字体.
2.使用字体图片来显示
    这种方式是现在绝大多数游戏使用的方法,包括前面介绍的Marblets游戏也是使用这种方式,也是首先要制作一个资源图,以有一个索引表,方便的能找到要显示文字位置.
    网上有很多软件能够实现自动的转化过程,包括微软也为XNA发布过这样的工具--Bitmap Font Maker Utility
优点:
    字体资源比较小,显示也比较方便,PC/X360通用,各语种OS支持.
缺点:
     同样不适合字数比较多的中文.
3.实时生成图片加载显示
    这种方式那天也提到过,不失为一种解决方案.
优点:
     不需要字体资源,直接使用系统字体,只要是电脑中安装有的字体样式都可以显示.
缺点:
     效率不高,只使用于PC,单语种(操作系统语言)
4.图片显示
    最后一种方式就是提前把游戏中显要显示的文字提前做成图片了,直接在游戏里面显示.
优点:
     PC/X360通用,各语种OS支持,英文游戏首先.
缺点:
     显示的文字信息多了就不行了.
总结:
能想到的也就这几种方式了,只能是根据自己的游戏类型来选择显示文字的方法了.
比如说文字量不多的小品游戏,第2,4两种方式就比较适合了.
如果是文量最多的RPG游戏的话,那就老老实实的使用第一种方式吧,不过,上面提出的缺点也并不是不可以克服掉,以下几种方式都有助你减小字体资源的体积:
    1) 指定文字范围,只把游戏里面使用的文字编译.
    2) 使用其它字体,比如我的计算机里面,方正超粗黑简体只有1.7M左右,而宋体却是10M左右,是因为方正里面的字体只有常用字还是什么原因,我不能确定,但我相信编译出来后的资源也一定相差在这个比例吧.
至于你只想开发英文版的游戏,当然是第1种方式是不二之选了.
还有其它好的汉字显示解决方案,欢迎大家讨论. |
|