Просмотр полной версии : [flash8] Нюанс по сглаживанию текста
Друзья, вопрос пожалуй прост, но ответа для себя найти не смог :umnik2:
Можно ли сделать, чтобы динамическое текстовое поле со внедренным шрифтом типа bitmap text вело себя при анимации также как статическое текстовое поле с этим же шрифтом? Т.е. в моменты нахождения поля в целочисленных координатах текст отображался без сглаживания, а когда поле в дробных координатах - срабатывало сглаживание.
Пример во вложении.
На самом деле вопрос не простой.
Легальным способом в IDE этого не добиться (лично я не знаю :D). Хотя возможно и есть варианты с всякими фокусами, типа BitmapData, но я расскажу про вариант с редактированием swf.
В архиве два swf:
bt-original.swf - обычное поведение.
bt-hack.swf - поведение как у статичного поля.
Как этого добиться?
Для начала нужен hex-редактор или хотя бы вьювер. Я пользуюсь Far и плагином к нему "HEX редактор"
SWF состоит из блоков тегов с данными, за шрифты отвечают три тега DefineFont, DefineFont2 и DefineFont3.
DefineFont - для шрифта который используется только в статичных полях.
Если этот же фонт используется и для динамического, то уже нужен тег DefineFont2, а для 8-ки DefineFont3 (у него более точное позиционирование вершин глифа), но оба имеют одинаковую структуру:
RECORDHEADER Header
UI16 FontID
UB[1] FontFlagsHasLayout
UB[1] FontFlagsShiftJIS
UB[1] FontFlagsSmallText <-то что нам нужно
UB[1] FontFlagsANSI
UB[1] FontFlagsWideOffsets
UB[1] FontFlagsWideCodes
UB[1] FontFlagsItalic
UB[1] FontFlagsBold
UI8 LanguageCode
UI8 FontNameLen
UI8[FontNameLen] FontName
...
и далее
Header имеет переменную длину, поэтому рассказать про него не буду, зайдем лучше с конца. :D
А именно с FontName. Если взять любой из swf в аттаче, и посмотреть содержимое в hex виде, то легко можно найти запись "Verdana_14pt_st" (для этого надо отключить галочку Compress Movie в настройках публикации swf, а потом лучше сжать с помощью flasm), это и есть FontName.
Перед ним идет байт FontNameLen определяющий число байтов отводимых под FontName. В нашем случаи там стоит 0x10 (то есть в 16 dec, хотя длина строки 15, просто число отводимых байт может быть больше, поэтому после "Verdana_14pt_st" стоит 0x00).
Дальше, то есть впереди, байт LanguageCode 0x01.
А вот впереди стоящий байт, то, что нам нужно. Каждый бит этого байт - флаг, что видно из таблицы выше.
В bt-original.swf там
0xA4 10100100
А в bt-hack.swf
0x84 10000100
Флаг FontFlagsSmallText отвечает за то, как будет вести себя вершины глифа в динамическом текстовом поле (в статичном поле вершины отображаются, как есть).
Если - 1, то вершины привязываются с размерам пикселя, что и давало - скачкообразное движение.
Если - 0, то так же, как и в статичном поле.
Поэтому, если надо добиться плавного движения, надо взять 3-ий байт перед именем шрифта, разложить его на биты и заменить третий бит на 0.
Замучаешься каждый раз при компиляции это ваять :)
Может быть проще использовать заточенный под флеш пиксельный шрифт и не париться?
Может быть проще использовать заточенный под флеш пиксельный шрифт и не париться?Быстрее прочитать про короткий/длиный заголовок тега, научиться определять тип тега и его длину, и написать программу, которая ищет DefineFont2 или DefineFont3 и меняет в байте нужный бит.
Но еще быстрее, это взять ASV, открыть свою флешку и сформировать из файл ttf с готовым пикслеподобным шрифтом, который сделал флеш при компиляции swf (в примере Verdana_14pt_st). Установить его, и вместо связки Verdana + Bitmap text, выставить Verdana_14pt_st + Anti-alias for animation.
Быстрее прочитать про короткий/длиный заголовок тега, научиться определять тип тега и его длину, и написать программу, которая ищет DefineFont2 или DefineFont3 и меняет в байте нужный бит.
Но еще быстрее, это взять ASV, открыть свою флешку и сформировать из файл ttf с готовым пикслеподобным шрифтом, который сделал флеш при компиляции swf (в примере Verdana_14pt_st). Установить его, и вместо связки Verdana + Bitmap text, выставить Verdana_14pt_st + Anti-alias for animation.
И все равно, использовать нормальный пиксельный шрифт гораздо проще и быстрее :victory:
И все равно, использовать нормальный пиксельный шрифт гораздо проще и быстрее :victory:Если у тебя есть все нужные размеры.
Там обычно один размер используется. На то он и пиксельный.
Там обычно один размер используется. На то он и пиксельный.У тебя есть шрифт с размеров 10, а теперь надо тебе с размеров 14. Где возьмешь? Или 15?
Пиксельные шрифты фиксированного размера. А то, что делает флеш в качестве пиксельного, врядли сойдет.
... врядли сойдет.Ты всегда путаешься свои запросы с чужими:p
Ну если есть желание извращаться — вперед, я не против :D
chingachgoog
24.01.2008, 13:41
С пиксельным шрифтом была засада при полноэкранном режиме - начинал биться, хотя при задуманном размере выглядел хорошо.
PS Что-то я в Hex-редакторе (Hex-editor 3.12) ничего указанного iNils-ом не нашел :(
Ни "define", ни "Verdana", ни т.п...
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.