Korchy (korchy) wrote,
Korchy
korchy

Categories:

Переход с Adobe CS3 на FlashDevelop

FlashDevelop принято хвалить. Мол, это лучшая на сегодня среда для разработки flash-приложений. На самом же деле серьезных причин перехода всего полторы:
1. Бесплатность. Если лицензия на CS3 принадлежит не вам, а предприятию, на котором вы работаете, или же вовсе вам не принадлежит: бесплатность - весомый довод в пользу перехода.
2. Вроде бы (догнав проект на CS3 до 300+ классов я еще не сталкивался с этой проблемой) компилятор CS3 не любит больших проектов, сбоит, ссылаясь на недостаток памяти.
На этом все. Все остальные причины, которые так любят превозносить (автокомплит, автоимпорт, подстветка, переходы по классам), охватывает одно определение: личное удобство. Все перечисленное - это удобство набивания кода. Обычно же в любом проекте 90% времени занимает не долбление по клавишам, а отладка, поиск ошибок и мучительные размышления "ЧЯДНТ?".
Мое личное мнение: если вы не столкнулись с проблемой платности среды или недостатка памяти компилятора, и вас все устраивает в работе в CS3 - заморачиваться с переходом на FlashDevelop не стоит.
Если же вы столкнулись с двумя перечисленными причинами, или просто хотите улучшить удобство работы с кодом, практические заметки о переносе рабочего проекта с CS3 на FlashDevelop:


1. Установка FlashDevelop
   Скачать последнюю версию FlashDevelop, на данный момент 4.2.1.
      оставляем галочку FLEX SDK и Дебаг-плеер, убираем галочки с AIR.

2. Копирование проекта AS3
   Создать новый проект AS3
   Удалить класс Main, созданный по умолчанию
   Скопировать к директорию src созданного проекта классы проекта из CS3
   Установить основной класс приложения:
      В ClassExplorer - правой кнопкой мышки на основном классе - Set Document Class

3. При попытке компиляции выдается ошибка вида:
   INITIALIZING: ?
   
   Скопировать файл из
      C:\Program Files\Java\jre6\bin\msvcr71.dll
      в
      C:\WINDOWS\system32\msvcr71.dll
   
   (Файлы приведены для версии java 6. Если на компьютере установлена более поздняя версия - скопировать нужно библиотеку из нее - будет отличаться номер директории jre и цифры в названии файла библиотеки. В любом случае нужно брать файлы из последней установленной на компьютере версии)

4. При компиляции вылезает ошибка вида:
   Unable to load DLL 'jvm.dll'
   
   Скопировать файл из
      C:\Program Files\Java\jre6\bin\msvcr71.dll
      в
      C:\Program Files\Java\jre6\bin\client\msvcr71.dll
   
   (В зависимости от версии java - как в п.3)

5. Автокомплит
   Перенастроить автокомплит на завершение с пробела на Tab и Enter:
      В настройках FD:
         Tools - Program Settings - Flash Develop
            Completion List Insertion Triggers - указать: \n \t

6. В окно Output не выводится trace
   Оказывается при компиляции в release-версии плеера FlashDevelop режет трейсы. Для вывода трейсов в окно output нужно использовать debug-сборку.
   Скачать debug-версию flash-плеера. В принципе можно взять последнюю, но если учитывать, с какой неохотой пользователи обновляют flash-плеер на своих компьютерах, стоит взять версию пониже. Например 10.3. Почему не 9.0, которой пользовались в CS3? При работе debug-версии девятый плеер периодически съедает диспатч события COMPLETE. С версией 10.3 такого замечено не было.
   Из скачанного архива скопировать debug-версию плеера (файл flashplayer10_3r183_43_win_sa_debug) в C:\Program Files\FlashDevelop\Tools\flexlibs\runtimes\player\-версия плеера-\win\.
   В настройках FlashDevelop изменить:
      Tools - Programm settings - Flash Viewer
         External Player Path - указать путь к debug-версии плеера
   В настройках проекта:
      Project - Properties
         Platform
            установить Flash Player 10.3
         Test Project
            установить Play: External Player

7. Шаблон базового класса
   В директории C:\Documents and Settings\имя пользователя\Local Settings\Application Data\FlashDevelop\Templates\ProjectFiles\AS3Project\
      в текстовом редакторе исправить файлы:
         Class.as.fdt
         Class.as.fdt.wizard
      В директории C:\Documents and Settings\имя пользователя\Local Settings\Application Data\FlashDevelop\Templates\
      в текстовом редакторе исправить файлы:
         AS3.fdt
   
   Содержимое исправить на необходимый шаблон.

8. Шрифты
В проект в FlashDevelop шрифты внедряются метатегом [EMBED]. Но есть одна особенность. Метатег [EMBED] не позволяет встроить шрифт в виде BitmapText, поэтому проэмбевив использовавшиеся в проекте в SC3 шрифты, необходимо будет или потратить достаточно много усилий на подгонку формата шрифта по пикселям, либо мириться со смазыванием на определенных разрешениях монитора.
Один из вариантов решения данной проблемы - использование внешней *.SWF со шрифтами.
Открыть старый привычный CS3 и встроить шрифты стандартным образом. Скомпилировать *.SWF. Он не будет запускаться или выполняться каким-то образом, от него требуются только шрифты.
В проекте делаем класс загрузки и регистрации внешних шрифтов:

package PackageName
{
   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("FontName1")));
            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(FontsManager.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;
      }
//-----------------------------------------------------------------------------------------------------
   }
}

В функции OnFontsLoaded необходимо перечислить все шрифты, встроенные в swf через CS3, чтобы они зарегистрировались в системе путем добавления строчек вида:
Font.registerFont(Class(LoaderInfo(e.target).applicationDomain.getDefinition("FontNameXXX")));
Не забываем, что жирное и курсивное начертание встраивается отдельными шрифтами. FontNameXXX - имя, под которым данный шрифт был встроен в swf на CS3.
Статическая функция CorrectFontName нужна для проверки наличия загруженности и возврата правильного названия шрифта т.к. после встраивания в swf на CS3 шрифты именуются как: ИмяШрифта_РазмерШрифтаpt_st. Обращение к имени шрифта в проекте нужно выполнять через нее.
Скомпилированную swf со шрифтами скопировать в рабочую директорию.

Оформив класс загрузчика шрифтов, в основной функции проекта вызываем загрузку:

var MyFontsManager:FontsManager = new FontsManager();
MyFontsManager.addEventListener(FontsManager.FONTS_LOADED,Continue);
MyFontsManager.LoadFontsFromExternalSWF("FileWithFonts.swf");

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

Теперь можно пользоваться встроенными (с BitmapText) шрифтами в проекте. Например в TextField необходимо использовать встроенный шрифт Arial размера 10:

var MyTextField = new TextField();
var MyTextFieldFormat = new TextFormat();
MyTextFormat.font = FontsManager.CorrectFontName("Arial",10);
MyTextField.setTextFormat(MyTextFormat);

Tags: actionscript 3.0, cs3, flashdevelop, progr
Subscribe

  • Нора сингулярности

    Не теряя времени, Алиса бросилась в погоню. Опять казалось, что она вот- вот догонит его, и опять она успела услышать, как Кролик, сворачивая за…

  • +35 в тени

    - Почему, - Антиопа показала картинку с двумя петухами, - здесь написано, что ее смысл понимают только половина людей, а у нас - его не понимает…

  • Молодой Остап

    - Мне нужна твоя одежда, ботинки и мотоцикл... - Может быть, тебе дать еще ключ от квартиры, где деньги лежат? Читать дальше:…

Comments for this post were disabled by the author