由于中文字体体积比较大,在项目需要使用不常见的中文字体时,就要用嵌入字体的方式来把指定字符嵌入到游戏中,下面是两种方法:

方法一:使用Embed

Embed的unicodeRange允许指定要嵌入字符的16进制unicode字符,如果字符变更了,还要重新编译生成swf,对于频繁更新的项目地带来不便。 以嵌入微软雅黑字体为例,代码如下:

[SWF(width="100", height="50", backgroundColor="#CCCCCC")]
public class TestFont extends Sprite
{
    [Embed(source="c:/windows/fonts/msyh.ttf", embedAsCFF="false", fontName="DefaultFont", mimeType="application/x-font", unicodeRange="U+4f60, U+597d, U+4e16, U+754c")] 
    public static var DefaultFont:Class;
    
    public function TestFont()
    {
        var text:TextField = new TextField();
        text.defaultTextFormat = new TextFormat("DefaultFont", 20, 0);
        text.text = "你好世界";
        text.embedFonts = true;
        text.width = 200;
        text.x = text.y = 10;
        addChild(text);
    }
}

方法二: 使用Flash Professional嵌入并生成swf供项目动态读取

使用Flash嵌入字体即不用生成unicode字符,在字符发生变更后,也不用重新编译主程序,个人觉得算是最适合的方法了。 首先需要在Flash中通过 文本 -> 字体嵌入 菜单来嵌入字体:

嵌入字体

设置导出类

使用时的代码如下:

// 通过读取swf文件来获取swf中的字体类
var skillFontClass:Class = ResLoader.getInstance().getClassByLinkName("SkillFont");
// 注册字体
Font.registerFont(skillFontClass);
// 实列化字体
var skillFont:Font = new skillFontClass();
// 设置字体格式
var textFormat:TextFormat = new TextFormat();
textFormat.font = skillFont.fontName;
textFormat.size = 40;
textFormat.color = 0x000000;
// 建立文本实例
var skillText:TextField = new TextField();
skillText.defaultTextFormat = textFormat;
skillText.autoSize = TextFieldAutoSize.LEFT;
skillText.embedFonts = true;
skillText.text = "你好世界";
addChild(skillText);

效果:

工具:

在网上找了半天没找到好用的字符转16进制Unicode的工具,索性自己写了一个,下载String2HexUnicode (需要.Net Framework 2.0)。

String2HexUnicode