2

我正在为我的项目使用 Flash CS5(资产)和 FlashDevelop(代码)。我们有大约 20 个包含文本字段的 fla/swf。我们所有的文本字段都使用相同的字体,并且该字体是我们公司特有的,因此不会安装在任何人的计算机上,因此需要嵌入。

我的最终目标是嵌入一种所有文本字段都使用的单一字体,主要原因有两个:

  • 每当我们向字体(其他语言)添加更多字符时,我们只需要添加一次而不是 20 次
  • 文件大小不会急剧膨胀

我很难做到这一点。似乎我尝试的所有内容都丢失了字符(似乎只有在每个 fla 的文本字段的文本属性中输入的字符才被嵌入)。

我正在尝试的最新解决方案是使用运行时共享库​​,因为这似乎应该可以工作。我有一个名为 FNFont.fla 的 fla。它只包含库中的一个对象,即嵌入字体。字体导出到 AS3,在第 1 帧中导出并导出用于运行时共享。URL 是 FNFont.swf(所有 swf 都在同一个文件夹中)。

在所有其他 fla 中,我在字体嵌入中创建字体对象。我勾选 Import for Runtime Sharing 并为其命名与 FNFont.fla 中的类名相同。URL 是 FNFont.swf。fla(s) 包含许多使用此字体的文本字段。文本字段有自己的实例作为其他影片剪辑的子项。

当我运行程序并尝试加载包含这些文本字段之一的实例的影片剪辑时,我收到错误消息:

[Fault] exception, information=ReferenceError: Error #1065: Variable FontName is not defined.

FontName 是 FNFont.fla 和所有其他 fla 中 Font 对象的类名。它不是文本字段的实例名称(也不是类名称),所以我不明白它如何认为它是一个变量。任何人都可以对此有所了解吗?

谢谢

4

3 回答 3

1

根据我的经验,您需要TextFields即时创建新的。

不能使用TextFields已经编译好的SWF,否则会出现上述问题。

这是让人们很难爱上 Adob​​e 的那些小错误之一。

于 2011-12-20T15:08:35.080 回答
0

您可能想要搜索“运行时字体加载”,例如:

http://www.mokisystems.com/blog/flash-as3-loading-fonts/

或者...

http://nochump.com/blog/archives/20

创建字体资源 SWF:

package {

    import flash.display.Sprite;

    public class FontLibrary extends Sprite {

        [Embed(systemFont='Bank Gothic', fontName='emBank Gothic', mimeType='application/x-font')]
        public static var BankGothicFont:Class;

    }

}

从您的应用程序加载和注册 SWF:

var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
loader.load(new URLRequest("fontlibrary.swf"));

private function completeHandler(event:Event):void {
    var FontLibrary:Class = event.target.applicationDomain.getDefinition("FontLibrary") as Class;
    Font.registerFont(FontLibrary.BankGothicFont);
    var tf:TextField = new TextField();
    tf.defaultTextFormat = new TextFormat("emBank Gothic", 12, 0);
    tf.embedFonts = true;
    tf.rotation = 15; // to demonstrate the embed worked
    tf.text = "blah blah blahnblah blah blahnblah blah blah ";
    addChild(tf);
}
于 2011-10-18T03:13:08.483 回答
0

不久前我遇到了类似的问题,结果发现这是ApplicationDomain在加载程序中设置正确的问题。

我不确定你是否有类似的情况,但这是我的。

  • CS5.5
  • fonts.swf在库中有几种字体。它们每个都设置为导出以进行运行时共享,并且它们被赋予了一个类名。
  • 有一个主 swf,其中加载了几个子 swf。
  • 每个子 swf 都有没有嵌入的字体对象。字体对象设置为“为运行时共享而导入”,并赋予与 fonts.swf 相同的类名。

就我而言,第一个子 swf 将正确加载 fonts.swf 并访问字体。尝试访问字体的第二个子 swf不会重新加载 fonts.swf,我会得到与您在上面描述的相同的错误。

在我看来,Flash 正在努力避免重新加载字体,因为它假设它们已经为整个应用程序注册。但是,由于每个 child.swf 都默认加载到父ApplicationDomain级中,因此子级可以访问父级的类路径,但不能相互访问。因此,第一个孩子可以访问 in 中的字体fonts.swf,但第二个孩子不能,因为他们在兄弟姐妹中,而不是父母。

我相信有两种方法可以解决这个问题:

  1. 在任何子级尝试访问之前,将 fonts.swf 加载到父级 swf 中。
  2. 设置ApplicationDomainApplicationDomain.currentDomain以便子 swf 与主父 swf 共享相同的 ApplicationDomain。

我选择了选项 2,它为我解决了这个问题。

var context : LoaderContext = new LoaderContext();
context.applicationDomain = ApplicationDomain.currentDomain;                
var clipLoader:Loader = new Loader();
clipLoader.load(url, context);
于 2012-02-13T16:32:51.873 回答