Невозможно заставить работать общую библиотеку Flash Runtime - PullRequest
2 голосов
/ 18 октября 2011

Я использую Flash CS5 (ресурсы) и FlashDevelop (код) для моего проекта. У нас есть около 20 fla / swf, которые содержат текстовые поля. Все наши текстовые поля используют один и тот же шрифт, и шрифт специфичен для нашей компании, поэтому не будет установлен на чьи-либо компьютеры, поэтому его необходимо встраивать.

Моя конечная цель - внедрить один единственный шрифт, который используют все текстовые поля, по двум основным причинам:

  • Всякий раз, когда мы добавляем больше символов в шрифт (на других языках), нам нужно добавить их только один раз, а не 20 раз
  • Размер файла резко не увеличивается

Мне очень трудно этого добиться. Кажется, что все, что я пытаюсь, символы отсутствуют (только символы, введенные в текстовое свойство текстовых полей в каждом флаке, кажется, встроены).

Последнее решение, которое я пробую, - это использование Runtime Shared Libraries, так как похоже, что оно должно работать. У меня есть флаг под названием FNFont.fla. Он содержит только один объект в библиотеке, встроенный шрифт. Шрифт экспортируется в AS3, экспортируется в кадр 1 и экспортируется для совместного использования во время выполнения. URL-адрес - FNFont.swf (все SWF-файлы находятся в одной папке).

Во всех других флагах я создаю объект шрифта при внедрении шрифта. Я отмечаю Import для Runtime Sharing и даю ему то же имя класса, что и в FNFont.fla. URL является FNFont.swf. Fla (s) содержат много текстовых полей, использующих этот шрифт. Текстовые поля имеют себя как потомки других фрагментов ролика.

Когда я запускаю программу и пытаюсь загрузить мувиклип, который содержит экземпляр одного из этих текстовых полей, я получаю сообщение об ошибке:

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

FontName - имя класса объекта Font в FNFont.fla и всех других флагах. Это не имя экземпляра текстового поля (ни имя класса), поэтому я не понимаю, как оно воспринимает его как переменную. Кто-нибудь может пролить свет на это?

Спасибо

Ответы [ 3 ]

1 голос
/ 20 декабря 2011

По моему опыту, вам нужно создавать новые TextFields на лету.

Вы не можете использовать TextFields, который уже скомпилирован в SWF, иначе вы получите проблему, описанную выше.

Это одна из тех маленьких ошибок, из-за которых трудно любить Adobe.

0 голосов
/ 13 февраля 2012

Я столкнулся с подобной проблемой некоторое время назад, и оказалось, что это проблема с установкой правильного ApplicationDomain в загрузчике.

Я не уверен, что у вас похожая ситуация, но вот моя.

  • CS5.5
  • У меня есть fonts.swf с несколькими шрифтами в библиотеке. Каждый из них настроен на экспорт для совместного использования во время выполнения, и им присваивается имя класса.
  • Есть основной SWF, в который загружаются несколько дочерних SWF.
  • У каждого дочернего swf есть объекты шрифтов без встраивания. Для объектов шрифта установлено значение «Импорт для общего доступа во время выполнения», и им не назначаются имена классов, аналогичные fonts.swf.

В моем случае первый дочерний swf правильно загрузит fonts.swf и получит доступ к шрифтам. Второй дочерний swf, который пытался получить доступ к шрифтам, не перезагрузил бы fonts.swf, и я получил бы ту же ошибку, которую вы описали выше.

Мне кажется, что Flash старается не перегружать шрифты, поскольку предполагает, что они уже зарегистрированы для всего приложения. Однако, поскольку каждый child.swf загружается в родительский файл со значением по умолчанию ApplicationDomain, дочерние элементы имеют доступ к пути класса родительского элемента, но не друг к другу. Следовательно, первый дочерний элемент имеет доступ к шрифтам в fonts.swf, а второй дочерний - нет, потому что они находятся в брате, а не в родительском элементе.

Я считаю, что есть два пути решения этой проблемы:

  1. Загрузите файл fonts.swf в родительский swf, прежде чем кто-либо из детей попытается получить к нему доступ.
  2. Установите ApplicationDomain на ApplicationDomain.currentDomain, чтобы дочерние swfs использовали тот же ApplicationDomain, что и основной родительский swf.

Я выбрал вариант 2, который решил проблему для меня.

var context : LoaderContext = new LoaderContext();
context.applicationDomain = ApplicationDomain.currentDomain;                
var clipLoader:Loader = new Loader();
clipLoader.load(url, context);
0 голосов
/ 18 октября 2011

Возможно, вы захотите выполнить поиск «загрузки шрифтов во время выполнения», например:

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);
}
...