shared fonts manager
._about
demo[fla]
.help(me)
.faq(?)
.feedback('post')
.get()
.links(_url)
 
[ о языковых версиях ]

часто задаваемые вопросы


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

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

  • основной файл или файлы библиотек скомпилированы в разные версии;
  • в проекте использованы статические или динамические текстовые поля содержащие шрифт с таким же именем, как и у шрифта загружаемого с помощью SFM;
  • не включен необходимый набор символов в файле-библиотеке.

- после переноса проекта с локального расположения на web шрифты перестали загружаться.

изменились относительные либо абсолютные пути к библиотекам. Если имеется такая возможность, проверьте на какие адреса идут запросы из ваших swf файлов.
Существует несколько вариантов указания адреса, в поле url диалогового окна Linkage:

ОТНОСИТЕЛЬНАЯ АДРЕСАЦИЯ

пример:
SFM/arial_n_lib.swf

в этом случае, вне зависимости от того, где будет находиться файл-контейнер библиотеки (arial_n.swf), файл-библиотека (arial_n_lib.swf) будет запрашиваться из адреса:
[путь к основному swf файлу]/SFM/arial_n_lib.swf

Предположим, что файл main.swf находится по адресу:
file:///C|/mySite/main.swf
К файлу-библиотеке в диалоговом окне окне Linkage указан путь:
SFM/arial_n_lib.swf
в этом случае запрос файла-библиотеки будет происходить по адресу:
file:///C|/mySite/SFM/arial_n_lib.swf

аналогичное поведение будет наблюдаться и при использовании в web.

резюме:
адресация к библиотеке зависит от расположения файла, ее использующего. И при переносе файла в другое место требуется перенос файлов библиотек. В проектах с несколькими файлами находящимися в разных папках требуется дублирование библиотек. Чтобы этого избежать следует применять абсолютную адресацию.

АБСОЛЮТНАЯ АДРЕСАЦИЯ

Пример для локальных тестов:
file:///C|/SFM/arial_n_lib.swf
или
/C|/SFM/arial_n_lib.swf

Пример для web:
http://www.sharedfonts.com/SFM/arial_n_lib.swf
или
/SFM/arial_n_lib.swf

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

ИТОГОВЫЕ РЕКОМЕНДАЦИИ:

Для локальных тестов web проектов:
Создайте папку "SFM" на диске "C" и разместите в ней библиотеки шрифтов с абсолютными путями вида:
file:///C|/SFM/arial_n_lib.swf

Для использования в web:
Создайте папку "SFM" в корне сайта и разместите в ней библиотеки шрифтов с путями относительно корня сайта вида:
/SFM/arial_n_lib.swf

В проекте используйте run-time определение использования в web или local:

_root.sfm_prefix = this._url.substr(0, 4) == "file" ? "file:///C|/" : "";
_root.createEmptyMovieClip
("tmp_mc", 0);
_root.tmp_mc.loadMovie(_root.sfm_prefix+
"/SFM/arial_n.swf");

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

Для проектов на CD дисках:

Рекомендуется использование относительных путей, поскольку невозможно быть уверенным, на каком диске будет запущен CD.

Поэтому рекомендуется все swf файлы, использующие библиотеки разместить в одной папке, все файлы библиотек в другой и использовать относительные пути.


- я хочу использовать embeded шрифты для текстовых полей. как это лучше сделать ?

Есть два пути: используя SFM и просто включая в ролик шрифты. Использование SFM подробно расписано в разделе HELP этого сайта. Не используя SFM, я бы рекомендовал поступать следующим образом:

ГЛАВНЫЙ СОВЕТ: не включайте шрифт в ролик путем добавления его в библиотеку. В этом случае ваши возможности управлением включения требуемых символов шрифтов существенно снижаются.

Поступать рекомендую следующим образом:

1. Создаем текстовые поля. В кадре, следующем за прелодером, за пределами сцены (выше или левее) создайте динамические текстовые поля, по количеству шрифтов, которые необходимо включить в ролик. Эти текстовые поля достаточно иметь в одном кадре, чтобы шрифты были доступны во всех последующих кадрах ролика. Учтите, что для дополнительных начертаний шрифта, таких как bold, italic, italic-bold, потребуется создать отдельные текстовые поля.

2. Задайте шрифт и впишите название этого шрифта в текстовое поле. Должно получиться нечто подобное:


3. Подумайте, как вы хотите назвать соответствующие стили форматирования (по аналогии с CSS) и задайте соответственные имена текстовым полям. Я в данном примере назвал поля так: default_txt и default_black_txt.

4. Теперь нужно включить эти шрифты в ролик. Для этого выделяем текстовое поле, в панели properties нажимаем кнопку Character... Откроется меню "Character options". Выбираем требуемые наборы символов (удерживая CTRL для множественного выбора), жмем OK.
Учтите, что многие нужные символы находятся в Latin extended или в других наборах.
Например вам требуется иметь символы «»©. Для этого не обязательно использовать специальные наборы целиком, поскольку имеется другой путь.
Скопируйте эти символы в текстовые поля (обязательно!), опять откройте меню Character options и нажмите кнопку Auto Fill.
Результат должен оказаться таким:

Настоятельно рекомендую вставлять специальные символы в текстовые поля и только затем помещать их в строку "Include these characters:" с помощью кнопки Auto Fill. Причина проста: в данном шрифте может попросту не оказаться требуемых символов. Если вы вставив символ в текстовое поле не увидели его, значит этого символа нет в выбранном шрифте и вы будете знать это. Иначе, если вставлять символы непосредственно в строку "Include these characters:", то символы в этой строке отобразятся, но в откомпилированном ролике вы их не увидите и будете долго гадать отчего такое случилось.

5. Создаем программный доступ к шрифтам. Для этого, в том же кадре (в вeрхнем слое) пишем следующий скрипт:

_level0.fmt_container = _level0.text_formats_container || {}
ASSetPropFlags(_level0, "fmt_container", 7, 1);
_level0.fmt_container.default_fmt = this.default_txt.getNewTextFormat()
_level0.fmt_container.default_black_fmt = this.default_black_txt.getNewTextFormat()

Мы получили ссылку на объект-контейнер _level0.fmt_container (если его еще нет, то создали).
В этом контейнере будут храниться ссылки на TextFormat объекты.

Контейнер мы поместили не в _global, а в _level0, это важно, поскольку если мы пожелаем использовать shared библиотеки шрифтов, или использовать этот ролик как shared, то мы избежим проблемы доступа к _global при использовании разных версий swf.

Для тех, кто еще не в курсе: если в ролик 7й версии загрузить ролик 6й версии,
и попытаться обратиться к переменной в _global, то ничего не получится, попробуйте:

ролик 7й версии:

_global.any_variable = "hello world!" this.any_mc.loadMovie("movie_published_to_6_player.swf")

ролик 6й версии:

trace(_global.any_variable)//undefined

- причина этому проста: _global разный у роликов разной версии!!!



6. Использование. Если применять default_fmt или default_black_fmt к текстам вот так:

my_txt.setTextFormat(0, 1000, _level0.fmt_container.default_fmt)
my_txt.embedFonts = true
то вы обнаружите, что заменяются размеры и цвет и т.п., на те, которые были использованы в текстовых полях default_txt и default_black_txt.
Иногда именно это и нужно, а иногда это нежелательно.
Если требуется назначить только шрифт, рекомендую идти следуюшим путем:

var def_fmt = new TextFormat()
var sample_fmt = _level0.fmt_container.default_fmt
def_fmt.font = sample_fmt.font
def_fmt.bold = sample_fmt.bold
def_fmt.italic = sample_fmt.italic
my_txt.setTextFormat(0, 1000, def_fmt)
my_txt.embedFonts = true

Возможен и второй путь. Достаточно создать новый TextFormat объект прямо указав ему шрифт:

var def_fmt = new TextFormat()
def_fmt.font = "Artemius TT"
my_txt.setTextFormat(0, 1000, def_fmt)
my_txt.embedFonts = true
и это даже будет работать. Но это неправильный путь.
Если потребуется изменить шрифт, то в первом случае вам не потребуется ничего, кроме замены шрифта в текстовом поле-библиотеке. Во втором случае вам придется обыскать весь код проекта, чтобы заменить название шрифта. Это в общем несложно, если вы делали этот проект, но если кто-то другой будет работать с вашим исходником, то это может стать существенной проблемой.
Вторая причина, по которой не стоит идти вторым путем: вы просто можете ошибиться в названии шрифта или указать неправильное начертание.

7. Часто требуется использовать тексты из внешних источников с HTML и CSS форматированием. Если вы уверены, что необходимые шрифты включены, как это было описано выше, то никаких особых действий, чтобы использовать embeded шрифты не требуется. Достаточно указать текстовому полю:
my_txt.embedFonts = true

при парсинге проигрыватель сам обыщет библиотеки и найдет требуемый шрифт.
Это относится и к shared библиотекам.

Итак, в итоге имем:
названия шрифтов нигде не используются. Используются только TextFormat объекты, создающиеся на основании шрифтов, заданных текстовым полям. Мы имеем визуальный контроль за шрифтами и за тем, какие дополнительные символы использованы. Замена шрифта на другой не влечет за собой перелопачивания кода. Если использовано HTML или CSS форматирование, то шрифты система находит самостоятельно.

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

© 2004 Ivan Dembicki