
Библиотека текстовых дисков, сосредоточенная вокруг лейбла, которая печатается со временем, как с эффектами, так и стилями.
Другими словами, это привносит больше функций в текстовый рендеринг в Libgdx.
Как это выглядит? Немного подобного ...
Или, может быть, так ...

Если вы предпочитаете посмотреть видео, чем прочитать этот текст, Рэймонд "Раелеус" Бакли снял видео, охватывающее большинство Textratypist! Он охватывает некоторые вещи, которые этот файл не делает, например, использование композитора кожи, так что это хорошие часы независимо.
Здесь есть «нормальный» ярлык в форме Textralabel, который действует почти точно так же, как этикетка в Scene2d.ui, но позволяет стили, охватываемые ниже. Однако много использования может предпочесть TypingLabel!
TypingLabel - это довольно нормальный виджет сцены2D.UI и расширяет Textralabel. Тем не менее, он ставит буквы на экране по одному, если только ему не сказано, чтобы пропустить вперед. Это ностальгический эффект, который можно найти во многих старых текстовых играх, и похоже, что пишущая машинка устанавливает каждую букву с некоторой более медленной, чем мгновенной скоростью.
Да, у него больше, чем режим пишущей машинки! Текст может висеть выше, а затем упасть на место. Это может прыгать вверх и вниз в длинной волне. Он может колебаться и дрожать, как будто он больен. Он может мигать в разных цветах, плавно перемещаться в градиенте между двумя цветами или пройти через целую радугу. Много вариантов; Много веселья. Эффекты практически такие же, как и при печати, но были некоторые изменения и дополнения. Вы можете проверить Textratypist Wiki для получения дополнительной информации.
По состоянию на 0,10,0, есть много новых эффектов. Jolt, Spiral, Spin, Muds, Shroink, Emerge, Heartbeat, Carousel, Squash, Scale, Outte, внимание, выделение, ссылку, триггер, стилист, пушка, океан, распыление и мгновенные-все это новое для Textratypist (не в печатном плане). Вы можете увидеть инструкции по использованию и попробовать GIF -файлы на странице Textratypist Wiki Tokens. Большинство из этих эффектов используют параметры гладкого масштабирования и вращения, которые могут использовать эффекты, начиная с Textratypist 0.5.1. Некоторые используют отслеживание мышей, новое в 0,7.0, например, как ссылка реагирует только на щелчок по диапазону текста.
Возможно, вы захотите создать TypingLabel S даже там, где вам не нужен эффект печати, потому что TextraLabel не обрабатывает никаких эффектов. Вы можете позвонить skipToTheEnd() на TypingLabel или (в 0,7,0 и выше) на некоторых других классах, чтобы позволить использовать TypingLabel для неподвижного текста с эффектами.
Также присутствуют различные стандартные токены, и они могут манипулировать эффектом типирования, замены переменной и другими полезными вещами:
{WAIT=f} заставляет эффект печати паузу и ждать f секунд, как поплавок.{SPEED=f} изменяет время, необходимое для ввода типичного глифа, от дефолта от 0.035 до f{SLOWER} заставляет все глифы занимают 2 раза до долгого типа.{SLOW} заставляет все глифы занимают 1,5x до долгого типа.{NORMAL} заставляет все глифы принимать обычные 1x до долгого типа.{FAST} заставляет все глифы занимают 0,5x до долгого типа.{FASTER} все глифы занимают 0,25x до долгого типа.{NATURAL=f} заставляет Glyphs случайно больше или меньше времени для типа, но в остальном совпадает с {SPEED=f} .{COLOR=s} изменяет цвет текста; У этого есть много вариантов, так что вы можете иметь, например, «темно -серый розовый».{STYLE=s} меняет стиль текста (см. Ниже); У этого есть много вариантов.{SIZE=f} изменяет размер текста (грубо, с шагом 25%); Это требует F в процентах от 0 до 375.{FONT=name} меняет шрифт, если есть доступный шрифт, посмотрев name .{CLEARCOLOR} устанавливает цвет текста в цвет по умолчанию, который обычно белый.{CLEARSIZE} Устанавливает размер на 100%.{CLEARFONT} устанавливает шрифт на исходный шрифт (не используя шрифт).{ENDCOLOR} устанавливает цвет текста в цвет по умолчанию, который обычно белый. Это то же самое, что {CLEARCOLOR} .{VAR=name} заменяется любой строкой, связанной с name переменной.{IF=name;choice0=cat;choice1=b;=default} проверяет имя переменной и сравнивает его с каждым выбором в токене.name , равна выбору, токен заменяется значением выбора, таким как cat .default .{EVENT=name} запускает событие, отправляя name в TypingListener, когда типинг достигает этой точки.{RESET} Устанавливает все изменения форматирования и скорости в их начальные значения.label.setDefaultToken() может использоваться для изменения начальных значений, поэтому текст по умолчанию в некоторых различных настройках.{SKIP=n} пропускает вперед в эффекте печати, мгновенно отображая n символов. Эффекты используют кудрявые скобки по умолчанию, но если вьющиеся скобки не являются хорошим вариантом для вашего текста (например, в файлах i18n), вы можете использовать [-EFFECT] в качестве эквивалента {EFFECT} .
Эта библиотека расширяет то, что может сделать оригинальная маркировка типиза-она позволяет применять стили к тексту, например, жирную шрифту, подчеркивание, наклонное, суперпресс и т. Д., Связанные со стилями, которые могут сменять масштаб, которые могут сокращать или увеличивать текст без изменения шрифта, а функция «Font Family». Шрифту может быть назначена «семья» других шрифтов и имен, которые можно использовать для обозначения их; Это действует как обычный стиль, но на самом деле меняет то, что используется для рисования. Полный список стилей длинный, но не такой подробный, как токены эффекта. Вы можете включить стили с чем -то вроде разметки цвета Libgdx, в квадратных скобках, таких как [*] или (если разметка используется в TypingLabel ), вы можете использовать {STYLE=BOLD} чтобы сделать то же самое. Теги и имена стилей оба нечувствительны к случаям, но имена цветов чувствительны к случаям. Синтаксис Square-Bracket использует в первую очередь пунктуацию и вдохновлен синтаксисом Markdown (который использует Github, среди других мест).
В следующем списке каждая запись выглядит как:
[*] Переключает смелый режим. Может использовать названия стилей * , B , BOLD , STRONG .
Это означает, что вы всегда можете использовать [*] для включения или выключения жирного шрифта, а в типинге-линии вы можете дополнительно использовать нечувствительный к случаю синтаксиса {STYLE=*} , {STYLE=B} , {STYLE=BOLD} или {STYLE=STRONG} чтобы сделать то же самое.
Полный список стилей и связанных с ними тегов квадратных кронштейнов:
[] ОТКЛЮЧИВАЕТ последнее изменение в стиле/цвете/форматировании, хотя оно ничего не делает с эффектами типизинга.[] делает в разметке Bitmapfont Libgdx, но работает не только на цветах.[ ] сбрасывает все стили/цвета/форматирование и эффекты в начальное состояние.[] на новый [ ] .[(label)] временно хранит текущее состояние форматирования в качестве label , поэтому его можно повторно нанести позже.label может быть любой буквенно -цифровой строкой. У него, вероятно, не должно быть места в нем, но может иметь недостатки.[ label] повторно примените состояние форматирования, хранящее как label , если он есть.[*] Переключает смелый режим. Может использовать названия стилей * , B , BOLD , STRONG .[/] переключает косой режим (как курсив). Может использовать названия стилей / , I , OBLIQUE , ITALIC .[^] Переключает режим SuperScript (и выключает SDIC -sepcript или режим Midscript). Может использовать названия стилей ^ , SUPER , SUPERSCRIPT .[=] Переключают режим среднего значения (и отключают режим SuperScript или Script). Может использовать названия стилей = , MID , MIDSCRIPT .[.] Переключает режим индекса (и отключает режим SuperScript или Midscript). Может использовать названия стилей . , SUB , SUBSCRIPT .[_] Переключатели подчеркивают режим. Может использовать названия стилей _ , U , UNDER , UNDERLINE .[~] Переключает режим ударения. Может использовать названия стилей ~ , STRIKE , STRIKETHROUGH .[!] Переключают весь режим верхнего чехла (заменяя любой другой режим корпуса). Может использовать названия стилей ! , UP , UPPER .[,] Переключает весь режим нижнего чехла (замена любого другого режима корпуса). Может использовать названия стилей , LOW , LOWER .[;] Переключает капитализацию каждого режима Word (заменяя любой другой режим корпуса). Может использовать названия стилей ; , EACH , TITLE .[%DDD] , где DDD составляет процент от 0 до 375, масштабирует текст на несколько. Можно использовать с {SIZE=150%} , {SIZE=%25} , или аналогично, {STYLE=200%} или {STYLE=%125} . Удаляет любой специальный режим.[%] В своих собственных наборах текст в масштабе по умолчанию на 100% и удаляет любой специальный режим. Можно использовать с {STYLE=%} .[%?MODE] Удаляет масштаб и устанавливает специальный режим; Режимы перечислены ниже.[%^MODE] Удаляет шкалу и устанавливает специальный режим одновременно с режимом малых каментов; Режимы перечислены ниже.[@Name] , где имя является ключом/именем в family переменной этого шрифта, переключает текущий шрифт на именованную. Можно использовать с {STYLE=@Name} .[@] самостоятельно сбрасывает шрифт на этот шрифт, игнорируя его семью. Можно использовать с {STYLE=@} .[#HHHHHHHH] , где HHHHHHH - это шестнадцатеричный RGB888 или RGBA8888 Int Color, меняет цвет. Это нормальный {COLOR=#HHHHHHHH} .[COLORNAME] , где Colorname - это название цвета или описание, которое будет рассмотрено извне, изменяет цвет.ColorUtils.describe() , который пытается найти какие -либо цвета по Palette по имени, а также позволяет описывать микс цветов или простых изменений, таких как «свет» или «скучный».Colors Libgdx, а также около 50 дополнительных имен нижних цветов (от красочного gdx).Palette от Hue, по легкостью или по имени.[RED] , [green yellow] , [light blue] , [duller orange] , [darker rich BLUE lavender] , [pale pink orange] и [deeper green navy] .Font setColorLookup() с собственной реализацией ColorLookup , чтобы сделать то, что вы хотите здесь.| , что позволяет искать цвета с именами, которые содержат пунктуацию. Например, [|;_;] будет искать цвет под названием ;_; «Цвет грусти», и не будет действовать как [;] .ColorLookup не может, а также ColorLookup.INSTANCE , который смотрит имена строк в классе Libgdx Colles Class.{COLOR=SKY} (какие цвета могут обрабатывать сразу) или с описанием, таким как {COLOR=lighter orange-red} , даже внутри тега, такой как {GRADIENT} .[+region name] , где название региона является названием TextureRegion из зарегистрированного TextuReAtlas, не изменит стиль, но будет создавать этот тексторрегион с текстом.KnownFonts.addEmoji() чтобы добавить 3000+ значков Twemoji к шрифту.[+saxophone] и [+?] Каждый покажет иконку саксофона.[+call me hand, medium-dark skin tone] и [+??] .KnownFonts.addGameIcons() , который добавляет значки из коллекции Game-icons.net. Они используют один и тот же синтаксис: [+crystal-wand] .[-SOME_EFFECT] эквивалентно использованию вьющиеся скобки вокруг SOME_EFFECT ; Обратите внимание на добавленную черту.Специальные режимы, которые можно использовать вместо масштабирования:
black outline или blacken , которые можно использовать с названиями стилей BLACK OUTLINE или BLACKEN .white outline или whiten , который можно использовать с названиями стилей WHITE OUTLINE или WHITEN .shiny , который можно использовать с названиями стилей SHINY , SHINE или GLOSSY .drop shadow или shadow , которые можно использовать с именами стилей SHADOW , DROPSHADOW или DROP SHADOW .error , которая может использоваться с ERROR имен стилей, REDLINE или RED LINE .Font.PACKED_ERROR_COLOR .warn , которое можно использовать с названиями стилей, WARN , YELLOWLINE или YELLOW LINE .Font.PACKED_WARN_COLOR .note , которое можно использовать с NOTE стиля, INFO , BLUELINE или BLUE LINE .Font.PACKED_NOTE_COLOR .jostle , который можно использовать с именами стилей JOSTLE , WOBBLE или SCATTER .[%?] .small caps , которые можно использовать с именами стилей, SMALLCAPS или SMALL CAPS .[%^] . Его нельзя использовать с синтаксисом [%?small caps] ; Это нуждается в камере. Режим малых крышек может использоваться с любым из других режимов, за исключением Jostle, изменив %? до %^ . Кроме этого, никакие два режима не могут быть активными одновременно, и ни один режимы не могут быть использованы в то же время, что и масштабирование.
Обратите внимание, что режимы используют немного другой синтаксис, чтобы не путать с именами цветов. При использовании квадратных кронштейнов каждому из названий, приведенных здесь в нижнем случае, следует предшествовать %? Большую часть времени (маленькие кепки и толкаются особенные). Это означает, что для включения режима Red-Underline «ошибка» вы используете тег квадратного кронштейна [%?error] . Если вы используете кудрявую маршруту для TypingLabel, вы бы использовали имена, приведенные здесь, в верхнем случае, и можете использовать их, как и другие названия стилей: {STYLE=ERROR} , например. Режим малых крышек, как уже упоминалось, особенный; Обычно он включен с [%^small caps] , но также может быть включен с [%^] , а также может быть смешан с любым другим режимом, кроме Jostle, изменяя нормальный %? до %^ . Всякий раз, когда малые крышки активны, квадратная кроншковая метка использует %^ вместо %? Полем Режим Jostle также особенный; Обычно он включен с [%?jostle] , но также может быть включен с [%?] Сами. Толкаль не может быть смешана с небольшими кепками.
Специальные режимы немного чрезмерны с точки зрения синтаксиса, потому что у меня кончилась пунктуация, которую я мог бы использовать. Общий пример черного контура вокруг белого текста может быть достигнут с помощью [WHITE][%?blacken]Outlined![%][GRAY] . (В примере используется GRAY в качестве обычного цвета, но вы также можете использовать [ ] для сброса цвета в любой базовый цвет, который был настроен на Layout или на метке, которая его удерживает. Обратите внимание, что [ ] также сбрасывает размер, режим и, ну, ну, все.)
Несколько комбинаций эффектов доступны с использованием {VAR=ZOMBIE}urgh, brains...{VAR=ENDZOMBIE} синтаксис:
{VAR=FIRE} изменяет следующий текст, чтобы иметь огненные изменения цвета. Вы можете закончить это {VAR=ENDFIRE} .{VAR=SPUTTERINGFIRE} изменяет следующий текст, чтобы иметь огненные меняющиеся цвета и изменить размер, как всплывание пламени. Вы можете закончить это {VAR=ENDSPUTTERINGFIRE} .{VAR=BLIZZARD} изменяет следующий текст, чтобы колебаться в ветре и использовать ледяные цвета, белый до светло -голубых. Вы можете закончить это {VAR=ENDBLIZZARD} .{VAR=SHIVERINGBLIZZARD} изменяет следующий текст, чтобы колебаться на ветру и использовать ледяные цвета, белый до светло -голубых, плюс он случайным образом заставит глиф «дрожь», как будто холодный. Вы можете закончить это {VAR=ENDSHIVERINGBLIZZARD} .{VAR=ELECTRIFY} изменяет следующий текст на тусклый серый фиолетовый цвет и случайным образом заставляет глифы становиться светлым желтым и вибрировать вокруг. Вы можете закончить это {VAR=ENDELECTRIFY} .{VAR=ZOMBIE} изменяет следующий текст на «темный оливковый шалфей» (тусклый серо-зеленый цвет), заставляет глифы вращаться влево и вправо медленно и случайным образом, заставляет глифы падать и выходить из строя случайным образом, а когда они появляются, появляются глифы из базовой линии (как будто измельчение из границы). Вы можете закончить это {VAR=ENDZOMBIE} . Они определены в TypingConfig.initializeGlobalVars() , и вы можете определить свои собственные комбинации точно так же, как они определены. Например, FIRE определяется
TypingConfig . GLOBAL_VARS . put ( "FIRE" , "{OCEAN=0.7;1.25;0.11;1.0;0.65}" );
TypingConfig . GLOBAL_VARS . put ( "ENDFIRE" , "{ENDOCEAN}" ); Эффекту OCEAN все равно, какие цвета он использует; Это только определяет приблизительный рисунок для перехода между этими цветами. Это означает, что противоречие, FIRE лучше всего реализуется с OCEAN а не GRADIENT . Использование названия FIRE , вероятно, предпочтительнее OCEAN , поэтому глобальный VAR здесь по этой причине.
Способность хранить форматирование форматирования с использованием метки позволяет некоторую более сложную сборку строк разметки из нескольких источников. Вы можете назвать что -то вроде font.storeState("spooky", "[/][darker gray][@?blacken]") чтобы навсегда сохранить это состояние форматирования (наклонной темный серый текст с черным наброском) в font , а затем может сбросить в это состояние, просто вступив в [ spooky] (обратите внимание на первое место). Вы также можете создать какой-то вставленный текст, в котором хранится текущее форматирование, прежде чем он что-либо будет писать, и сбрасывает форматирование обратно, когда это будет написано. Это использовало бы что -то вроде "[(previous)][ ][BLUE][^][[citation needed][ previous]" - если эта строка будет вставлена в середину большего блока текста, она не изменит окружающую форматирование, но будет использовать синий SuperScript для своего собственного текста (бессмертная [citation needed] ) и не будет использовать какую -либо форматирование окружающего блока. Если у вас есть несколько тегов State Store с одной и той же меткой, значение, связанное с этой меткой, будет изменено по мере того, как встречаются эти теги. Возможно, вы захотите использовать уникальные этикетки, чтобы избежать случайного изменения значения другой этикетки, но обычно это обычно не нужно.
Textratypist широко использует свой новый класс Font , который является полным пересмотром Bitmapfont Libgdx, который по существу не имеет кода со своим предком. Шрифт обладает различными качествами, которые придают ему больше мощности, чем Bitmapfont, в основном из того, как он хранит (и делает доступными) глифные изображения в виде текстовых перевозок на карте. Нет ничего строго не мешать вам добавлять свои собственные изображения в mapping шрифта, если у них есть необходимая информация, которая будет использоваться в качестве текстового глифа, а затем помещать эти изображения с вашим текстом. Это используется для реализации смайликов в качестве одного примера, и может использоваться для пользовательских значков и смайликов.
Textratypist поддерживает стандартные шрифты растрового изображения, а также шрифты на расстоянии, используя SDF или MSDF. TypingLabel автоматически включит шейдерскую программу, которой необходим соответствующий тип поля расстояния (если он нуждается в нем), и отключить ее после рендеринга. Вы можете изменить это поведение, вручную вызывая метод Font.enableShader(Batch) на своем шрифте, и изменив партию обратно на другую выборную программу по выбору с помощью метода Batch.setShader() (часто, вы просто передаете здесь NULL, чтобы сбросить шейдер). Обратите внимание, что шрифты SDF и MSDF необходимо сообщить об изменениях в размере экрана, используя Font.resizeDistanceField() или любое из различных методов мест, которые называются resizeDistanceField() . Начиная с 1.0.0, вы обычно хотите использовать перегрузку, которая занимает Viewport ; Если у вас нет Viewport , вам не нужна такая перегрузка. Каждый шрифт поля на расстоянии, который вы в настоящее время выполняете, должен иметь изменение своего расстояния, когда окно изменяется, в ApplicationListener.resize() .
Есть несколько предварительно настроенных настройки шрифта в KnownFonts ; В документации для каждого геттера шрифта говорится, какие файлы необходимы для использования этого шрифта. Старые файлы .fnt были перемещены сюда . Вы можете увидеть превью и описания всех известных шрифтов здесь. Наличие знаменитыхфонтов не требуется для многих шрифтов с версии 1.0.0, потому что шрифты .dat теперь изготавливаются все с помощью одного и того же инструмента (шрифта) и, как правило, настроены правильно за пределами коробки. Разнообразие типов шрифтов не удивительно, но это должно быть хорошей отправной точкой. Одна приятная вещь, которую следует отметить, - это метод KnownFonts.getStandardFamily() , который требует иметь 16 шрифтов в ваших активах, но, естественно, позволяет вам переключаться между любыми из этих 16 шрифтов, используя [@Medieval] синтаксис (где средневековый - одно из имен, которые он знает, в этом случае для «Фонда Kingthings Foundation»).
Шрифты здесь используют расширение файла .dat (что просто означает, что это двоичные данные без конкретного формата файла). Они представляют собой сжатые версии более крупных шрифтов. Сжатие, которое они используют, совместимо с GWT, поэтому эти файлы .DAT можно использовать на любой платформе LibGDX. Вы все еще можете использовать более старые файлы .fnt без проблем, а некоторые файлы .fnt все еще используются здесь (в основном для пиксельных шрифтов). Вам также обычно нужен .png с каждым шрифтом, хотя он может быть в атласе.
Файлы лицензии для каждого шрифта включены в одну и ту же папку, в knownFonts здесь. Все шрифты, предоставленные здесь, были проверены, чтобы гарантировать, что их лицензии разрешают коммерческое использование без сборов, и все это делают. Большинство требуют атрибуции; Проверьте лицензии для получения подробной информации.
Знаменитые FoNts включают несколько других способов настройки существующих экземпляров шрифта, добавляя текстовые процессы в глифы, которые они знают. Это включает в себя несколько существующих TextureAtlases of Icons и ... смайликов!
Значки Twemoji также присутствуют в атласе изображений более 3000 32x32; KnownFonts.addEmoji() может зарегистрировать их с помощью шрифта, поэтому синтаксис [+name] упомянутый выше, может нарисовать эмодзи встроенный. Точно так же атлас значков более 4000 60x60 присутствует от Game-icons.net, и KnownFonts.addGameIcons() может зарегистрировать их шрифтом. Как Twemoji, так и Game-icons.net Atlases не могут быть зарегистрированы одним шрифтом одновременно; В той части Unicode не хватает свободного пространства, которое они могут безопасно использовать. Способ обойти это - использовать функцию Fontfamily и добавить шрифт только для значков или только для смайликов в семью. Для этого есть существующий метод; KnownFonts.getGameIconsFont() позволяет вам получить шрифт, который предназначен для демонстрации игровых иконов, с некоторой церемонией вокруг его использования. [@Icons][+rooster][@] - быстрый пример того, как вы могли бы переключиться на шрифт, произведенный getGameIconsFont() , нарисуйте значок и переключитесь обратно.
Здесь есть предварительные просмотр Twemoji, с символом эмодзи и имени, чтобы найти каждое изображение. Аналогичным образом, здесь есть предварительные просмотра значков Game-icons.net, с именем, необходимым для поиска каждого изображения. Помните, что, поскольку изображения Game-icons.net являются чистыми белыми с прозрачностью, вы можете подкрасить их любой цвет, который вы хотите, используя стандартный [RED] , [light dull green] или [#0022EEFF] синтаксис.
Файлы лицензии для изображений Twemoji и Game-icons.net включены в knownFonts , рядом с файлами лицензий для шрифтов. В то время как Twemoji имеет простые требования к атрибуции, Game-Icons требует атрибуции к нескольким отдельным участникам; Смотрите конец этого документа для списка, который вы можете и должны скопировать, чтобы отдать должное всем.
Есть также линейные смайлики от OpenMoji и полноцветные версии того же эмодзи. Это может лучше подходить для художественных стилей определенных проектов.
Вы можете повернуть отдельные глифы (если вы нарисуете их индивидуально) или повернуть целые блоки текста в качестве макета, используя дополнительную перегрузку Font.drawGlyph() или Font.drawGlyphs() . Пользовательские эффекты для TypingLabel также могут индивидуально изменять вращение любого глифа, а также его положение и масштаб на x и/или y. Вы можете повернуть Textralabel или TypingLabel, используя их методы setRotation() , и теперь вращение будет действовать правильно для метков с фоном и/или с различными настройками выравнивания. Происхождение поворотов может быть установлено на метке, и вся этикетка будет вращаться вокруг этой точки происхождения.
Вы также можете, для некоторых шрифтов, автоматически генерируются символы рисования и блок-элементов. Это нуждается в сплошном белом блоке (любого размера, обычно 1x1), присутствующего в шрифте в ID 9608 (индекс полного блока Unicode, 'u2588' ). Это также дает лучшую гарантию подчеркивания и ударов символов, соединяющихся правильно, и без размахивания, где два подчеркивания или дефиса перекрывают друг друга. Font пытается включить это в некоторых случаях, или он может быть установлен с параметром, но если он не удается, то он возвращается к использованию подчеркивания для подчеркивания и дефисов для удара. Все шрифты в KnownFonts либо настроены, чтобы использовать твердый блок, либо для конкретного избегания его, потому что этот шрифт лучше без него производится. Обратите внимание, что если вы создаете Font из BitmapFont libgdx, это по умолчанию даже не пытается сделать глиф сетей, потому что растровые кабины редко имеют подходящий твердый блок.
Некоторая дополнительная конфигурация возможна для символов рисования коробки, которые фактически используются для этой цели (не только подчеркивая или поражая). Вы можете установить boxDrawingBreadth на Font на какой-то множитель, чтобы сделать линии рисования коробки толстыми или более тонкими, не изменяя то, как они подключаются друг к другу.
Различные функции позволяют здесь дополнительную конфигурацию. Вы можете установить boldStrength на какое -то значение, кроме по умолчанию 1, если вы хотите, чтобы более или менее дополнительное пространство было применено из смелого стиля. Вы также можете установить obliqueStrength чтобы изменить угол перекоса, который начитывается на косой текст. Цвета для различных эффектов могут быть изменены с учетом необходимости; font.PACKED_SHADOW_COLOR можно изменить, например, более темный, легкий, более непрозрачный или более прозрачный теневой цвет. font.PACKED_BLACK влияет на режим черного контура, а font.PACKED_WHITE влияет на белый контур и блестящие режимы. Есть аналогичные режимы, чтобы изменить цвета ошибок, предупреждения и подчеркивания Note. Все эти цветовые конфигурации применяются на экземпляре шрифта, поэтому у вас могут быть два объекта шрифта, используя один и тот же шрифт, но с настройками разных цветов.
Начиная с выпуска 0.4.0, существуют различные виджеты, которые заменяют их аналоги Scene2d.ui и обменяют Label для TextraLabel , что позволяет вам использовать наценку в них. Виджеты являются ImageTextraButton , TextraButton , TextraCheckBox , TextraDialog , TextraLabel , TextraListBox , TextraTooltip и TextraWindow , а также альтернативные версии каждого, которые используют TypingLabel вместо TextraLabel и Typing их имена.
В то время как TextArea еще не поддерживается, запланирована коллега TextArea , и она еще не сработала. TextraLabel по умолчанию поддерживает несколько линий и может быть в состоянии подчеркнуть некоторое использование. TypingLabel также разрешает отслеживание ввода, так что вы можете использовать его для изготовления выбираемых областей текста - читать дальше!
Отслеживание ввода было вариантом для TypingLabel и кода, который использует его с 0,7.0. Это расширилось в 0,7,4, чтобы позволить тексту в TypingLabel выбираемой с помощью label.setSelectable(true) . Вы можете получить доступ к выбранному в настоящее время текст с помощью label.getSelectedText() или скопировать его непосредственно с помощью label.copySelectedText() . Когда пользователь завершает жест щелчка и перетаскивания над TypingLabel (и он выбирается), также запускается событие; Вы можете прослушать "*SELECTED" в TypingListener и скопировать текст, как только он будет выбран, или копировать только при нажатии клавиши. Другие полезные функции, которые используют отслеживание ввода, включают тег {LINK} , который делает диапазон текста, кликабельную ссылку на интернет-адрес, {TRIGGER} , который запускает событие на щелчке, и несколько других тегов, которые отвечают на Hovering Mouse ( {ATTENTION} , {HIGHLIGHT} и {STYLIST} ). Они работают только для TypingLabel , а не TextraLabel , поэтому вы можете использовать TypingLabel и вызовать skipToTheEnd() чтобы относиться к нему как все еще текст, который отвечает на пользовательский ввод и может использовать анимированные стили, такие как {RAINBOW} .
Вы можете прочитать в обычной сцене2D. UI Skin Json File с вариантом на классе Skin Libgdx, FWSkin (или один из классов, который его расширяет), и это будет загружать обычные стили Scene2d.ui и специализированные стили Textratypist. Специализированные стили, как правило, отличаются только в том смысле, что они используют Font вместо BitmapFont , и все вкладываются в класс Styles здесь. Наличие специализированного стиля означает, что один шрифт может быть повторно использован в большем количестве мест, без необходимости делать много копий растрового цвета (иногда один виджет) ... что было в случае с Textratypist 1.0.0. Как правило, переход от кожи на Fwskin проста. Код, как это, раньше:
Skin skin = new Skin ( Gdx . files . internal ( "my-skin.json" ));Изменится на это после:
FWSkin skin = new FWSkin ( Gdx . files . internal ( "my-skin.json" )); Вы также можете назначить FWSkin с переменной Skin , и это самый совместимый вариант, так как ваша переменная кожи будет просто нормальной Skin . FWSkin FWSkin есть некоторые удобные методы, чтобы немного легче обрабатывать шрифты на расстоянии.
Почему это называется FWSkin , вы удивляетесь? Что ж, он может загружать экземпляры как шрифт, так и растровые экземпляры из файлов .fnt (нуждающаяся в конфигурации кожи только для BitmapFont ) и может сделать то же самое для структурированных шрифтов JSON, которые здесь обычно создаются FontWriter или FW. Первоначальная цель FWSkin состояла в том, чтобы просто загрузить из файлов .fnt и .json/.dat Font одинаково хорошо, но его объем расширился, чтобы включить новые стили.
Если вы привыкли использовать полосу, есть замена, которая делает как то, что делает FWSkin , так и обработку Freetype, которую делает полоса. Это дополнительная зависимость FreeTypist , доступная в отдельном репозитории. Это позволяет настроить Freetype, имея "com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator" в вашей коже JSON, который часто производится композитором кожи. Вы можете взять нормальные скины, произведенные Skincomposer, и совместимы с полосой и использовать их с Freetypist.
Вы можете получить его через Gradle, но это, вероятно, лучший вариант просто скопировать в двух файлах из этой папки во Фрититисте в ваш собственный код. Независимо от того, как вы зависите от Freetypist, он нуждается в зависимости от Freetype (включая соответствующие «зависимости» платформы) и от Textratypist (в настоящее время 1.0.0). Когда функции добавляются в Fwskin и Textratypist в целом, Freetypist также должен быть обновлен.
Вы, вероятно, хотите получить Textratypist с Gradle! Зависимость для основного модуля проекта LIBGDX выглядит как:
implementation " com.github.tommyettinger:textratypist:1.1.0 "Это предполагает, что вы уже зависят от Libgdx; Textratypist зависит от версии 1.12.1 или выше. Требование для 1.11.0 было добавлено в Textratypist 0.5.0 из -за некоторых нарушающих изменений в коде подъема инструментов в LIBGDX. Требование для 1.12.1 было добавлено в 1.0.0, потому что некоторые вещи, вероятно, изменились, но 1.12.1 (или последующие выбросы снимков) должны быть довольно легко обновить.
Если вы используете GWT, это должно быть совместимо. Ему нужны эти зависимости в модуле HTML:
implementation " com.github.tommyettinger:textratypist:1.1.0:sources "
implementation " com.github.tommyettinger:regexodus:0.1.16:sources "GWT также нуждается в этом в файле gdxdefinition.gwt.xml (с момента версии 0.7.7):
< inherits name = " regexodus.regexodus " />
< inherits name = " com.github.tommyettinger.textratypist " /> В версии 0.7.4 и ранее вы станете более ранней версией обеих зависимостей (примечание, это старая версия ):
// OLD VERSION
implementation " com.github.tommyettinger:textratypist:0.7.4:sources "
implementation " com.github.tommyettinger:regexodus:0.1.13:sources " и вместо этого будет использовать эти наследование GWT:
<!-- OLD VERSION -->
< inherits name = " regexodus " />
< inherits name = " textratypist " />Regexodus-это GWT-совместимая библиотека регулярной экспрессии, которая использует для того, чтобы соответствовать некоторым сложным моделям внутри. Помимо самого Libgdx, Regexodus является единственной зависимостью, который есть в этом проекте. Унаследование GWT изменилось для Textratypist и для Regexodus, потому что оказывается, что использование пакета по умолчанию может вызвать реальные проблемы.
В разделе «Выпуски этого репо» есть по крайней мере один релиз, но вы все еще рекомендуются использовать Gradle для обработки этой библиотеки и ее зависимостей.
Вы также можете использовать Jitpack, чтобы получить текущий коммит, который может быть удобен, если между выпусками есть длинный промежуток. Current gdx-liftoff and gdx-setup projects all can use JitPack dependencies without needing any extra configuration. You would use this dependency in your core module:
implementation ' com.github.tommyettinger:textratypist:de5a52f340 ' You can change de5a52f340 to any commit in the Commits tab of https://jitpack.io/#tommyettinger/textratypist , but you should not use -SNAPSHOT -- it can change without your requesting it to, which is not what you want!
You can also depend on FreeTypist using:
implementation " com.github.tommyettinger:freetypist:1.1.0 "(Now, FreeTypist 1.1.0 uses TextraTypist 1.1.0 .)
And if you target HTML and have FreeType working somehow, you would use this Gradle dependency:
implementation " com.github.tommyettinger:freetypist:1.1.0:sources "And this inherits line:
< inherits name = " com.github.tommyettinger.freetypist " />FreeType doesn't work out-of-the-box on GWT, though there is this].
Some parts of TextraTypist act differently from their counterparts in scene2d.ui and Rafa Skoberg's typing-label.
A big quirk is that Font and BitmapFont have some core disagreements about how to parse a .fnt file, and the results of creating a Font with new Font("MyFont.fnt") can be different from new Font(new BitmapFont(Gdx.files.internal("MyFont.fnt"))) . BitmapFont reads in padding information (and does so incorrectly according to the BMFont spec), where Font ignores padding information entirely. Some .fnt files have been made so they look right in libGDX by using padding, but they will look wrong in other frameworks/engines without that padding. Font compromises by allowing manual adjustment of x and y position for all glyphs (y often needs to be adjusted, either to a positive or negative value), as well as the width and height of glyphs (these are useful less frequently, but can be helpful to stretch or squash a font). It may take some tweaking to get a Font made from a BitmapFont to line up correctly with other widgets. You also may need to adjust the offsetX, offsetY, and maybe xAdvance parameters if you load an atlas (such as with addEmoji() or addGameIcons() ), and the adjustments may be quite different for a Font made from a BitmapFont vs. a Font made directly from a .fnt file. Since 0.8.1, Font can parse an extended version of the .fnt format that permits floats for any spatial metrics, and not just ints. No files actually use this here and now, because the Structured JSON files produced by fontwriter all use floats internally for everything.
If you load text from a file and display it, you can sometimes get different results from creating that text in code, or loading it on a different machine. This should only happen if the file actually is different -- that is, the files' line endings use rn when checked out with Git on a Windows machine, or n on MacOS or Linux machines. TextraTypist uses r to mark some kinds of "soft" line breaks that can be re-wrapped, and n for "hard" line breaks that must always create a new line. Having rn present generally shows up as two lines for every line break. A simple solution that works for many projects is to include a .gitattributes file in your project root, like the one here. This can be used to force all text files or all text files with a certain file extension to use LF mode, where only a single n is used for line breaks. It's still recommended to keep .bat files using CRLF mode, with rn used, for compatibility. Using .gitattributes from the start is a good idea, and should keep files exactly the same on all current OSes. Older Windows programs (like Notepad from Windows 7) aren't able to read n line endings, but the versions distributed with recent Windows can use n easily, as can almost all code-oriented text editors.
Colors can be written out as hex strings, like #FF7700 or #9783EDFF , given by name, or described using a simple syntax. The full list of (case-sensitive!) names can be seen ordered by hue, by lightness, or by name. You can take one or more of these color names, optionally add adjectives like "light" or "dull", and get a color that mixes the named colors and applies changes from the adjectives. There are some tricky things here:
Colors class, and are ALL_CAPS , sometimes with underscores. Other names are from colorful-gdx, and are lowercased single words. In a few cases, the same word refers to a different color value if you use ALL_CAPS or use lowercase ( ORANGE and orange are a good example).ColorUtils.unevenMix() . You can have a number after any color name, which assigns a weight to that color for the mixing. Higher numbers will cause their preceding color to have more effect on the result; any non-negative integers are allowed.0x00000100 ), or fully transparent very dark blue, which is used as a placeholder because visually it is the same as transparent black. If a color does wind up as 256 at the time it is finally rendered, it will probably be ignored.Palette with its static addColor() method. This makes another color name usable, but won't retroactively make that color name parse correctly. You may have to call methods like Font.markup() again, so it's best if you can change colors before using them.If you encounter issues with TypingLabel tokens, and you use ProGuard, the configuration for that tool needs a small addition:
-keep class com.github.tommyettinger.textra.** { *; }
There may be more strict versions of this ProGuard instruction possible, but at the very least, the com.github.tommyettinger.textra.effects package needs to be kept as-is, for reflection reasons. You may also need to ensure the com.github.tommyettinger.textra.Effect class is kept. Keeping all of TextraTypist should be perfectly fine for obfuscation purposes because this is an open-source library, but it does add a small amount to the size of the final JAR or APK. Right now, that appears to be 202 KB if you don't include any assets, so I wouldn't worry about it.
Distance field fonts might not be worth the hassle of resizing each font's distance field, but they do look much better at very large sizes than standard fonts. Using a standard font actually can look better for small-to-moderate size adjustments. The best approach when you don't need large text seems to be to use a large standard font texture, without SDF or MSDF, and scale it down as needed. Since 1.0.0, all fonts support emoji. Older versions did not support emoji in MSDF fonts.
If you happen to use both tommyettinger's TextraTypist library and tommyettinger's colorful-gdx library, you may encounter various issues. ColorfulBatch appeared to be incompatible because it uses an extra attribute per-vertex (compared to SpriteBatch), but an adjustment it already does seems to make it compatible without changes. Color description can be done by both colorful-gdx's SimplePalette and ColorUtils.describe() here, but descriptions would really need to use the RGBA color space to work as expected. Alternative shaders from colorful-gdx's Shaders class generally won't work correctly with the known fonts here and the defaults for neutral colors (here, white is the neutral color, but in most shaders that allow lightening, 50% gray is the neutral color). The easiest solution for all this is to use a normal, vanilla SpriteBatch for TextraTypist rendering, and whatever ShaderProgram or ColorfulBatch you want for colorful-gdx rendering.
Games that use custom Batch classes with additional attributes don't work out-of-the-box with Font , but it provides an extension point to allow subclasses to function with whatever attributes the Batch needs. Overriding Font.drawVertices() allows quite a lot of flexibility to handle unusual batches, and you can generally leave the custom Font unchanged other than the drawVertices() override. If you implement Font 's copy constructor just by calling super(font); , and still allow it to take a Font argument, then you can quickly take Fonts from KnownFonts and make copies using your subclass. The JavaDocs for Font.drawVertices() detail what each of the 20 floats passed in via an array to drawVertices are expected to do; custom Batches could have 24 or more floats and so would need to put the 20 existing floats in the positions their Batch expects.
Sometimes, you may need to enable or disable integer positioning for certain fonts to avoid a strange GPU-related visual artifact that seems to only happen on some Nvidia GPUs. When this happens, glyphs may appear a half-pixel or so away from where they should be, in seemingly randomly-picked directions. It looks awful, and the integer position code at least should resolve it most of the time. Integer positions don't work well if you use world units that span multiple pixels in length, but this bug is an absolute mystery, and also doesn't happen at all on integrated GPUs, and may not happen on AMD GPUs. How it behaves on Apple Silicon graphics, I also do not know. The Issues tab is always available for anyone who wants to try to debug this! It is possible that some fixes introduced in the 0.7.x releases may have already eliminated this bug, but I'm not especially optimistic that it is always gone.
The gdx-freetype extension produces BitmapFont outputs, and you can create a Font from a BitmapFont without any issues. However, FreeType's "Auto" hinting settings both look worse than they normally should with Font, and can trigger the GPU artifact covered immediately above. Instead of "AutoSlight", "AutoMedium", or "AutoFull" hinting, you can choose "Slight", "Medium", or "Full", which makes the font look more legible and avoids the GPU half-pixel-offset issue. I don't have any idea why this happens, but because hinting can be set either in the FreeType generator parameters or (if you use Stripe or FreeTypist from this repo) set in a Skin file with "hinting": "Full" , it isn't hard to fix.
There are some known issues with scaling, rotation, and integer-positioning in 0.7.5 through 0.9.0. You may see labels slide a little relatively to their backgrounds when rotated smoothly, and some (typically very small) fonts may need integer positions enabled to keep a stable baseline. Font debug lines may be quite incorrect in some of these versions, also, even if the text displays correctly to users. Scaling has improved significantly in 0.7.8, as has the handling of debug lines, but rotation still has some subtle bugs. A bug was fixed starting in 0.8.0 that made extra images in a Font (such as emoji) scale differently and drift when the Font they were mixed with scaled. That same bug also made an ordinary Font drift slightly as its scale changed; this is also fixed. Positions and sizes for background color and for images from an atlas have improved in 0.8.2, so selecting text shouldn't cover up text as badly with the background, and emoji should be fully surrounded by their selection background. Positions along the line vertically, while the text is scaled, improved in 0.8.3 so that the scaling is relative to the center of the line, rather than the bottom of the line. Some other code already expected scaling to be centered like that, so this change makes scaling look better, usually. In 0.9.0, integer positioning can still be set, but it does nothing; in practice, setting it was causing more problems than improvements. The few fonts that one would think would need integer positions (pixel fonts) actually look better without it. There are still some rotation issues in 0.9.0, though they mostly happen when the descent is configured to an extreme value, or sometimes other metrics. Lining up underline/strikethrough with rotated text is also a challenge.
Word wrap periodically seems to break and need fixing across different releases. The most recent time this happened was in 0.7.9, which also affected 0.8.0 and was fixed (I hope) in 0.8.1. A different wrapping-related bug was fixed more recently, in 0.8.3 ; this was rare, and only affected TypingLabel when some effects were present.
There's other issues with word wrap if you expect it to behave exactly like Label in libGDX. Here, we don't break words, even if a single word is longer than the width of a TextraLabel or TypingLabel . The reason for this is twofold: first, breaking words without proper hyphenation logic can change the meaning of those words, and second, fixing this could be a ton of work. I do intend to try to make this configurable and match Label by default in some near-future version. The word wrap behavior for multiple whitespace characters changed in version 0.10.0, and should be essentially correct now. Remember that word wrap only makes sense in the context of scene2d.ui for a widget (such as a TypingLabel or TextraLabel) if that widget has been sized by scene2d.ui, usually by being in a Table cell, or sometimes by being in a Container. You may need to add a label to a Table or Container, then set the width and/or height of that Cell or Container, to get wrap to act correctly.
A possibly-frequent issue (with an easy fix) that may start occurring with version 0.9.0 and later is that TextraTypist now requires Java 8 or higher. All modern desktop OSes support Java 8, and this has been true for 9 years. Android has supported Java 8 (language level, though only some APIs) for several years, and older versions can use "desugaring" to translate more-recent Java code to be compatible with (much) older Android versions. GWT has supported language level 8 for years, as well; 2.8.2, which libGDX is built with, allows using Java 8 features, and 2.11.0, which an alternate libGDX backend supports, allows using even more. RoboVM doesn't support any new APIs added in Java 8, but it has supported language level 8 from the start. TextraTypist doesn't use any APIs from Java 8, but does now use functional interfaces and method references. Having these features allows us to remove some nasty reflection-based code, and that in turn helps usage on platforms where reflection is limited, such as GWT and Graal Native Image. GWT was able to work before, but Graal Native Image would have needed a lot of configuration to be added for every game/app that used TextraTypist. The other issue is that if TextraTypist continued to target Java 7 for its library code, it wouldn't compile with Java 20 or later, and the LTS release 21 has been out for almost a year.
If you're upgrading to TextraTypist 1.0.0 or later, and you haven't changed Skin usage at all, you'll probably encounter some bugs. These are quick to fix by changing Skin to FWSkin , or if you used Stripe, FreeTypistSkin from FreeTypist. There is also a FWSkinLoader for use with AssetManager , and FreeTypist has a FreeTypistSkinLoader . FWSkin allows loading the new types of scene2d.ui styles that reuse Font instances rather than making new ones often. It also allows loading BitmapFont and Font objects from .fnt, .json, and .dat files (where .dat is the compressed JSON format this repo uses), requiring only configuration for BitmapFont in the skin .json .
If you want to make your own Fonts, you can use Hiero or AngelCode BMFont as you always have been able to, but now you can also use FontWriter (though it is Windows-only for now). FontWriter can output SDF and MSDF distance field fonts, as well as standard bitmap fonts, and it always ensures the files have been processed how TextraTypist prefers them (they need a small white square in the lower right to use for block drawing and underline/strikethrough, plus a specific transparency change makes certain overlapping renders with alpha keep their intended colors). These processing changes could be done by running BlockStamper and TransparencyProcessor in the TextraTypist tests, but that's a hassle, so using FontWriter is preferred. It outputs .json and .dat font files, as well as a .png texture. You only need the .png file AND (the .dat file OR the .json file), but the .dat file is smaller, so it is usually preferred. The .json file can be hand-edited, but it isn't very easy to do that given how it is inside.
This is based very closely on typing-label, by Rafa Skoberg. Typing-label is MIT-licensed according to its repo LICENSE file, but (almost certainly unintentionally) does not include any license headers in any files. Since the only requirement of the MIT license is to leave any license text as-is, this Apache-licensed project is fully compliant with MIT. The full MIT license text is in the file typing-label.LICENSE , and the Apache 2 license for this project is in the file LICENSE . Apache license headers are also present in all library source files here. The Apache license does not typically apply to non-code resources in the src/test/resources folder; individual fonts have their own licenses stored in that directory.
Twemoji isn't a font, so it might be best to mention it separately. It's licensed under CC-BY 4.0, and requires attribution to Twitter if used. Twemoji's guidelines for attribution are here. (The documentation still says Twitter, not X, and to my knowledge X doesn't employ any of the active Twemoji team, so... I would link back to the Twemoji repo, so that it is up to them).
Like Twemoji, Game-Icons.png isn't a font, and it has quite a few contributors to the project. Because all icons in the project are on one PNG file, you must credit all the contributors who licensed their art under CC-BY, and it may be ideal just to credit all the contributors, period. The list is in the license.
OpenMoji is also not a font, but it clearly has a CC-BY-SA 4.0 license, and the BY clause should be satisfied by attributing the OpenMoji Project. The SA clause should be satisfied by any users of OpenMoji continuing to provide attribution. There isn't a non-commercial clause for any assets here.
The logo was made by Raymond "raeleus" Buckley and contributed to this project. It can be used freely for any purpose, but I request that it only be used to refer to this project unless substantially modified.
Wow, raeleus has really helped a tremendous amount. Both by testing TextraTypist in his Skin Composer app (which found quite a lot of bugs, small and large), and advising on proper scene2d.ui layout practices (which were not easy to get 100% right), the large 0.5.2 release (and those after it) would not be what it is today without his input. Спасибо!
Thanks to fraudo for helping me go step-by-step to figure out how badly I had screwed up rotation with backgrounds, and for writing most of LabelRotationTest . Release 0.5.5 would still probably be in development for months without that help, so thanks are in order.
Thanks to piotr-j (evilentity), mas omenos, and DMC from the libGDX Discord, for really thoroughly testing TextraTypist. IncongruityTest was originally piotr-j's work, and it helped me figure out which fonts in KnownFonts had incorrect bounds information. TableWrapTest was based closely on mas omenos' work, and was useful to locate a wrapping bug. DMC managed to track down a very elusive ProGuard issue, which is now documented in this README.md , as well as noticing and helping debug a variety of issues with code that I had no idea people were already using. Sanda Moen, fourlastor, tecksup, and Siavash Ranbar helped track down some maddening bugs affecting word wrap; thanks to everyone who's put up with those kinds of bug! IgorApplications has helped track down various SDF-related bugs and pointed out that a feature (full-color emoji in SDF fonts) was possible, so thanks as well!
Of course, I have to thank Rafa Skoberg for writing quite a lot of the code here! About 2/3 of the effects are almost purely by Rafa, much of the TypingLabel-related code is nearly unchanged from his work, and in general he showed what libGDX UIs could be just by making the initial code.
Thanks to all the font designers who made fonts we use here; by making your fonts freely available, you perform a great service to the people who depend on them.
Thanks to Twitter for generously contributing Twemoji to the world of open source; having broadly available emoji makes them much more usable. Note that because this was a generous action by Twitter, it happened before its acquisition/change to "X".
Thanks to the many contributors to game-icons.net for producing high-quality free icons to game developers everywhere. The icons in Game-Icons.png were made by:
(Projects that use TextraTypist can copy the above list of Game-Icons.png contributors to comply with its license.)
Thanks again to the OpenMoji project! That was clearly a lot of work. OpenMoji is licensed as CC BY-SA 4.0.
Thanks also to the developers of the Noto Fonts and Emoji! They are OFL 1.1 licensed. The Noto Color Emoji here also used data from the MIT-licensed EmojiBase project to create the atlas.