Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Не могу зарегистрировать шрифт (http://www.flasher.ru/forum/showthread.php?t=169912)

GBee 15.10.2011 21:10

Цитата:

To GBee: не, так тоже не прокатывает - выдаёт ошибку
[Fault] exception, information=ArgumentError: Error #1508: Указано недопустимое значение для аргумента font.
А что такое Alba? Это точно шрифт? А не мувик какой-нить?

Wolsh 16.10.2011 01:03

dimarik, а можно поподробнее? У меня не получается без регистрации, даже если гружу в ApplicationDomain.currentDomain.
То есть вот так работает:
(SWF со шрифтом, Fonts это класс Документа)
Код AS3:

package  
{
        import flash.display.Sprite;
        import flash.text.Font;
 
        public class Fonts extends Sprite
        {
                [Embed(source='../lib/consola.ttf', fontName="consola")] public const CONSOLA:Class;
 
                public function Fonts()
                {
                        Font.registerFont(CONSOLA);
                }
        }
}

(загружающая SWF)
Код AS3:

package 
{
        import flash.display.Loader;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.net.URLRequest;
        import flash.system.ApplicationDomain;
        import flash.system.LoaderContext;
        import flash.text.Font;
        import flash.text.TextField;
        import flash.text.TextFormat;
 
        public class Main extends Sprite
        {
                public function Main():void
                {
                        var context:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);
                        var loader:Loader = new Loader();
                        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
                        loader.load(new URLRequest("consola.swf"), context);
                }
 
                private function onComplete(event:Event):void
                {
                        trace(Font.enumerateFonts()); // [object Fonts_CONSOLA]
                        var format:TextFormat = new TextFormat("consola", 16);
                        var txt:TextField = new TextField();
                        addChild(txt);
                        txt.embedFonts = true;
                        txt.defaultTextFormat = format;
                        txt.width = 400;
                        txt.text = "I'm your Consola Font!"
                }
        }
}

Это работает и без указания контекста лоадеру. Но вот без регистрации – никак))

Universe 16.10.2011 19:23

Цитата:

А что такое Alba? Это точно шрифт? А не мувик какой-нить?
Alba - да, это шрифт такой

что-то я в конец запутался!:)
Мне просто нужно создать в проекте выпадающий список в котором будет возможность выбрать шрифт для текстового поля. Шрифтов заказчик хочет порядка 100, поэтому боюсь как бы swf из-за этого не стал размером эдак 50 мб! Ещё и хочет чтобы потом их можно было убирать/добавлять через админку без перекомпиляции.(Делаю редактор футболок)
Как бы вы реализовали эту задачу? Чтобы шрифты не увеличивали объём проекта и чтобы их потом можно было заменять без перекомпиляции?
На счёт первого я думал что оптимальным вариантом будет создать для каждого шрифта отдельную флешку которую подгружать при клике в выпадающем списке. Но тут возникает некоторая проблема - смотрел примеры таких редакторов и там в выпадающем списке текст написан тем шрифтом который выбираешь, конечно можно просто проэмбедить нужные символы, а весь список уже загружать по одному как написал ранее, но может ещё какойто способ подскажете?
А по поводу без перекомпиляции - я пока вообще не представляю, можно ли это сделать?

Wolsh 16.10.2011 20:42

Нельзя. SWF вообще не содержит файл шрифта, когда Вы его внедряете. Компиллятор делает из файла (TTF например) особый ресурс в виде векторных картинок-глифов и минимальной информацией. Получить из свфки исходный шрифт как он был до компиляции невозможно – его уже нет. Другими словами, загрузить файл шрифта в скомпиленную свфку можно, но для плеера это не будет шрифтом, плеер не понимает форматы шрифта, даже device fonts отображает не плеер, а система. Плеер умеет работать только с тем внутренним форматом, который создает компилятор. Вывод - компилировать свфки с внедренным шрифтом придется. Другое дело, что это можно автоматизировать, создавая их на сервере с помощью РНР-модуля, так что заказчику останется лишь загружать шрифты через CMSку. Также РНР мог бы делать превьюшки с нужным текстом и регистрировать это все в XML (к примеру). Тогда в списке шрифтов Вы показываете превьюшки и по клику загружаете нужный SWF со шрифтом... Ну я так это вижу.

dimarik 17.10.2011 10:48

Wolsh, необходимо создавать текстовое поле в контексте Fonts.

Код AS3:

public class Fonts extends Sprite {
 
    public function createMethod(c:Class):Object {
        return new c();
    }
 
}

Код AS3:

public class Main extends Sprite {
 
    /**
    * Это обработчик Event.COMPLETE лоадера, загрузившего Fonts.swf
    */

    private function handler_loadComplete(event:Event):void {
        const li:LoaderInfo = event.target as LoaderInfo;
        const textField:TextField = (li.content as Object).createMethod(flash.text.TextField) as TextField;
        const textFormat:TextFormat = textField.defaultTextFormat;
        textFormat.font = "consola";
        textField.embedFonts = true;
        textField.defaultTextFormat = textFormat;
        textField.text = "Consola Font!";
    }
 
}


Aziz Zaynutdinoff 17.10.2011 11:51

Создавать объекты через метод другого класса… извращение какое-то

-De- 17.10.2011 13:02

Цитата:

Сообщение от Aziz Zaynutdinoff (Сообщение 1039784)
Создавать объекты через метод другого класса… извращение какое-то

Нормальная практика.
http://en.wikipedia.org/wiki/Factory_method_pattern

PS: правда когда в с++ детектор утечек памяти показывает в фабричный метод и нету стека, то приходится чесать репу %)

Wolsh 17.10.2011 13:10

dimarik, спасибо, работает. Правда, нет возможности получить список доступных шрифтов, но для случая с одним семейством в одном swf-файле можно сделать публичные константы, рассказывающие об имени семейства, наличии начертаний и формате (CFF или олдовый). В принципе, небольшая плата за возможность выгружать лишние мегабайты, когда пользователь решит креативить с другим шрифтом.

dimarik 17.10.2011 13:31

Денискин утилитарный класс, который это позволяет.

Universe 18.10.2011 18:44

блин, что не делаю никак не работает!(((
пишет ошибку
Код:

[Fault] exception, information=ReferenceError: Error #1065: Переменная AsianGuy не определена.
после загрузки ролика!
хотя она там есть

Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
 
        /**
        * ...
        * @author Andrey
        */

        public class Main extends Sprite
        {
                [Embed(source='../lib/fonts/Asian Guy.ttf', fontName = 'AsianGuy', mimeType = 'application/x-font-truetype', embedAsCFF = 'false')]
                public static var AsianGuy:Class;
 
                public function Main():void
                {
                        trace("Asian 123");
                }
        }
 
}

Добавлено через 38 минут
Wolsh, при использовании вашего способа у меня вылазит таже ошибка!


Часовой пояс GMT +4, время: 03:19.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.