Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 25.07.2013, 12:51
Fogflasher вне форума Посмотреть профиль Отправить личное сообщение для Fogflasher Найти все сообщения от Fogflasher
  № 11  
Ответить с цитированием
Fogflasher

Регистрация: Mar 2013
Сообщений: 290
По умолчанию Runtime version

Пробую запустить программу Korchy по внедрению шрифтов.

Создал файл Font1.fla, в котором вот такие настройки:
PROPERTIES:
Название: snap4873.jpg
Просмотров: 289

Размер: 61.1 Кб

LINKAGE:
Название: snap4874.jpg
Просмотров: 298

Размер: 72.5 Кб

Далее, создал файл класса, который он привел в своем блоге, подставив имена, а также оставив только одну строку с регистерфонт:

Код AS3:
package
{
   import flash.display.Loader;
   import flash.display.LoaderInfo;
   import flash.events.Event;
   import flash.events.EventDispatcher;
   import flash.net.URLRequest;
   import flash.text.Font;
 
   public class FontsManager extends EventDispatcher
   {
 
      private var FontsLoader:Loader;
      private var FontsLoaderInfo:LoaderInfo;
      private var FontsLoaded:Boolean;
      // Константы событий
      public static const FONTS_LOADED:String = "EvFontsLoaded"; // шрифт загружен
 
      public function FontsManager() 
	  {
         // Конструктор
         super();
         FontsLoaded = false;
      }
 
      public function LoadFontsFromExternalSWF(Value:String):void
	  {
         // Загрузить swf со шрифтами
         if (FontsLoaded == false)
		 {
            FontsLoader = new Loader();
            FontsLoaderInfo = FontsLoader.contentLoaderInfo;
            FontsLoaderInfo.addEventListener(Event.COMPLETE, OnFontsLoaded);
            FontsLoader.load(new URLRequest(Value));
         }
      }
 
      private function OnFontsLoaded(e:Event):void
	  {
         // SWF со шрифтами загружена
         if(FontsLoaded==false)
		 {
            Font.registerFont(Class(LoaderInfo(e.target).applicationDomain.getDefinition("CyrillicHover")));
//          Font.registerFont(Class(LoaderInfo(e.target).applicationDomain.getDefinition("FontName1Italic")));
//          Font.registerFont(Class(LoaderInfo(e.target).applicationDomain.getDefinition("FontName1Bold")));
//          Font.registerFont(Class(LoaderInfo(e.target).applicationDomain.getDefinition("FontName2")));
            FontsLoaded = true;
            FontsLoaderInfo.removeEventListener(Event.COMPLETE, OnFontsLoaded);
            dispatchEvent(new Event(FontsManagerVn.FONTS_LOADED));
         }
      }
 
      public static function CorrectFontName(vFontName:String, vFontSize:uint=12):String 
	  {
         // Проверка, есть ли такой встроенный (загруженный из сторонней SWF) шрифт заданного размера
         // если есть - возвращает его имя, если нет - возвращает исходное имя шрифта
         var EmbeddedFonts:Array = Font.enumerateFonts(false);
         for (var i:uint = 0; i < EmbeddedFonts.length; i++)
		 {
            if (Font(EmbeddedFonts[i]).fontName == vFontName + "_" + String(vFontSize) + "pt_st")
			{
               return vFontName + "_" + String(vFontSize) + "pt_st";
            }
         }
         return vFontName;
      }
 
   }
}
Далее сделал основной класс, в котором ввёл такой код:
Код AS3:
package
{
	   import flash.display.*;
	   import flash.events.*;
	   import flash.net.*;
	   import flash.text.*;
 
	   public class Runtime_font_embed extends MovieClip
	   {
 
			public function Runtime_font_embed()
			{
 
 
			var MyFontsManager:FontsManager = new FontsManager();
			MyFontsManager.addEventListener(FontsManager.FONTS_LOADED, Continue);
			MyFontsManager.LoadFontsFromExternalSWF("Font1.swf");
 
			var text1 = new TextField();
			var format1 = new TextFormat();
			format1.font = FontsManager.CorrectFontName("CyrillicHover", 30);
			text1.setTextFormat(format1);
 
			}
 
 
	   }
 
}
И в результате выполнения получаю:

Цитата:
1120: Access of undefined property FontsManagerVn. dispatchEvent(new Event(FontsManagerVn.FONTS_LOADED));
(Думал, может проблема в именах, поигрался с заменой Name1 на CyrillicHover и обратно, но нифига.)

Что не так с этим FontsManagerVn?

Старый 25.07.2013, 23:54
Korchy вне форума Посмотреть профиль Отправить личное сообщение для Korchy Найти все сообщения от Korchy
  № 12  
Ответить с цитированием
Korchy
 
Аватар для Korchy

Регистрация: May 2011
Сообщений: 301
Записей в блоге: 2
2 Fogflasher
Да, это моя опечатка - это же название собственно класса.
Уберите буковки Vn в конце наименования класса в строке dispatchEvent(new Event(FontsManagerVn.FONTS_LOADED));
должно быть так: dispatchEvent(new Event(FontsManager.FONTS_LOADED));
__________________
interplanety

Старый 26.07.2013, 11:49
Fogflasher вне форума Посмотреть профиль Отправить личное сообщение для Fogflasher Найти все сообщения от Fogflasher
  № 13  
Ответить с цитированием
Fogflasher

Регистрация: Mar 2013
Сообщений: 290
Korchy, Спасибо, исправил.

Но появилась теперь другая ошибка:

Цитата:
1120: Access of undefined property Continue. MyFontsManager.addEventListener(FontsManager.FONTS_LOADED, Continue);

Старый 26.07.2013, 12:09
Korchy вне форума Посмотреть профиль Отправить личное сообщение для Korchy Найти все сообщения от Korchy
  № 14  
Ответить с цитированием
Korchy
 
Аватар для Korchy

Регистрация: May 2011
Сообщений: 301
Записей в блоге: 2
2 Fogflasher

> Функция Continue будет вызвана после загрузки swf со шрифтами для продолжения работы программы.

Создайте функцию с таким именем, или со своим, и его подставьте в эту строчку. После того, как шрифт будет загружен, будет произведен вызов этой функции. В эту функцию вынесете вот этот кусок
Код AS3:
var text1 = new TextField();
var format1 = new TextFormat();
format1.font = FontsManager.CorrectFontName("CyrillicHover", 30);
text1.setTextFormat(format1);
так, как сделано у вас сейчас - вы хотите начать работать со шрифтом, не дожидаясь его загрузки, что явно не получится.
__________________
interplanety

Старый 26.07.2013, 12:14
Fogflasher вне форума Посмотреть профиль Отправить личное сообщение для Fogflasher Найти все сообщения от Fogflasher
  № 15  
Ответить с цитированием
Fogflasher

Регистрация: Mar 2013
Сообщений: 290
А можно как-то на примере это в коде показать?

Вот например я пробую так:

Код AS3:
package
{
	   import flash.display.*;
	   import flash.events.*;
	   import flash.net.*;
	   import flash.text.*;
 
	   public class Runtime_font_embed extends MovieClip
	   {
 
			public function Runtime_font_embed()
			{
 
 
			//	Оформив класс загрузчика шрифтов, в основной функции проекта вызываем загрузку:
			var MyFontsManager:FontsManager = new FontsManager();
				MyFontsManager.addEventListener(FontsManager.FONTS_LOADED, Continue);
				MyFontsManager.LoadFontsFromExternalSWF("Font1.swf");
 
			}
 
			public function Continue()
			{
				var text1 = new TextField();
				var format1 = new TextFormat();
				format1.font = FontsManager.CorrectFontName("CyrillicHover", 30);
				text1.setTextFormat(format1);
			}
 
 
	   }
 
}
И получаю такую Output ошибку:

Цитата:
ArgumentError: Error #1063: Argument count mismatch on Runtime_font_embed/Continue(). Expected 0, got 1.
at flash.events::EventDispatcher/flash.events:EventDispatcher::dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at FontsManager/::OnFontsLoaded()


Последний раз редактировалось Fogflasher; 26.07.2013 в 12:25.
Старый 26.07.2013, 12:54
Korchy вне форума Посмотреть профиль Отправить личное сообщение для Korchy Найти все сообщения от Korchy
  № 16  
Ответить с цитированием
Korchy
 
Аватар для Korchy

Регистрация: May 2011
Сообщений: 301
Записей в блоге: 2
2 Fogflasher

Вы прочитали у Мука главу посвященную обработке событий?
Функция Continue - обработчик события. Обработчики требуют указания в параметрах события, которое они получают. О чем вам в ошибке впрямую и пишется - функция ожидает 0 параметров, а получает 1.
Обозначьте параметр, ответственный за событие:

Код AS1/AS2:
public function Continue(e:Event):void {
}
__________________
interplanety

Старый 26.07.2013, 14:44
Fogflasher вне форума Посмотреть профиль Отправить личное сообщение для Fogflasher Найти все сообщения от Fogflasher
  № 17  
Ответить с цитированием
Fogflasher

Регистрация: Mar 2013
Сообщений: 290
Korchy, жаль если я раздражаю вас своей тупостью, но да, я ее читал.
Правда скорее в ознакомительном режиме, без закрепления всех деталей и ньюансов, для понимания.

Подозрение на аргументы у меня было, но я воспринял смысл ошибки как прямо противоположный: "Ждет 0, имеет 1", как будто бы "некий аргумент уже есть... и то что я его не вижу еще нихрена не означает, мало ли..." А тут всё проще оказалось.

Теперь программа работает без ошибок. Значение format1.font трэйсится как CyrillicHover_30pt_st, что очевидно правильно.

Однако проблема в том, что фонт почему-то не применяется.

Я сначала подумал что код функции Continue имеет ошибки:
Код AS3:
public function Continue(e:Event)
			{
				var text1 = new TextField();
				text1.autoSize = TextFieldAutoSize.LEFT;
				text1.x = 80;
				text1.y = 80;
				text1.width = 200;
				text1.text = "Text Embedding - это непросто!";
 
 
				var format1 = new TextFormat();
				format1.font = FontsManager.CorrectFontName("CyrillicHover", 30);
				format1.color = 0x0011CC;
				format1.size = 30;
				format1.align = TextFormatAlign.LEFT;
 
 
				text1.setTextFormat(format1);
 
				trace("text1.text", text1.text);
				trace("format1.font", format1.font);
 
				addChild(text1);
 
			}
Однако текст выдается, и цвет применяется, то есть setFormat работает...

Может быть проблема в файле Fonts.fla?
Может я чего-то недопонял и какой-то код там должен быть.

Добавлено через 22 минуты
Блин, всё же очень просто...

'Слона то я и не приметил', забыл строку:
Код AS3:
text1.embedFonts = true;
Korchy, Теперь всё работает, благодарю за помощь! ^_^


Последний раз редактировалось Fogflasher; 26.07.2013 в 15:08.
Создать новую тему Ответ Часовой пояс GMT +4, время: 08:58.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Теги
font embedding , runtime , внедрение шрифтов , шрифт

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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