
Une bibliothèque de dispositif de texte centré sur une étiquette qui imprime au fil du temps, avec des effets et des styles.
En d'autres termes, cela apporte plus de fonctionnalités au rendu de texte dans libgdx.
À quoi cela ressemble-t-il? Un petit quelque chose comme ça ...
Ou peut-être comme ça ...

Si vous préférez regarder une vidéo plutôt que de lire ce texte, Raymond "Raeleus" Buckley a réalisé une vidéo couvrant la plupart des textratypes! Il couvre certaines choses que ce fichier ne fait pas, comme l'utilisation du compositeur de la peau, donc c'est une bonne montre malgré tout.
Il y a une étiquette "normale" ici sous la forme de Textralabel, qui agit presque exactement comme l'étiquette dans Scene2d.ui, mais permet les styles couverts ci-dessous. Cependant, une grande partie de l'utilisation peut préférer le type de mousse!
TypingLabel est un widget Scene2d.Ui assez normal et étend Textralabel. Cependant, il met des lettres sur l'écran un à la fois, à moins qu'il ne soit dit de sauter. Il s'agit d'un effet nostalgique trouvé dans de nombreux jeux de texte plus anciens, et il semble qu'une machine à écrire met en place chaque lettre à un rythme plus lent que instantané.
Oui, il a plus que le mode de machine à écrire! Le texte peut pendre au-dessus, puis se mettre en place. Il peut sauter de haut en bas dans une longue vague. Il peut vaciller et trembler, comme s'il était malade. Il peut cligner des yeux dans différentes couleurs, se déplacer dans un dégradé en douceur entre deux couleurs, ou traverser un arc-en-ciel entier. Beaucoup d'options; Beaucoup de plaisir. Les effets sont presque les mêmes que dans la dactylographie, mais il y a eu certains changements et ajouts. Vous pouvez consulter le wiki textratotypiste pour plus d'informations.
À 0,10,0, il y a de nombreux nouveaux effets. La secousse, la spirale, le spin, la foule, le rétrécissement, émerger, le rythme cardiaque, le carrousel, la courge, l'échelle, la rotation, l'attention, la surbrillance, le lien, le déclencheur, le styliste, le canon, l'océan, la pulvérisation et l'instant sont tous nouveaux pour TextratyPist (pas dans le type de label). Vous pouvez voir des instructions d'utilisation et des exemples de GIF sur la page des jetons du Wiki Textrataty. La plupart de ces effets utilisent les options de mise à l'échelle et de rotation lisses que les effets peuvent utiliser en démarrage dans TextratyPist 0.5.1. Certains utilisent le suivi de la souris, nouveau en 0.7.0, tels que la façon dont le lien répond uniquement à un clic sur une plage de texte.
Vous voudrez peut-être créer des TypingLabel même où vous n'avez pas besoin de l'effet de frappe, car TextraLabel ne gère aucun effet. Vous pouvez appeler skipToTheEnd() sur un type de type ou (en 0,7,0 et plus) sur certaines autres classes pour permettre à un type de type d'être utilisé pour le texte toujours avec des effets.
Divers jetons standard sont également présents, et ceux-ci peuvent manipuler l'effet de frappe, le remplacement variable et d'autres choses utiles:
{WAIT=f} provoque une pause de l'effet de frappe et attendre f secondes, en tant que flotteur.{SPEED=f} Modifie le temps nécessaire pour taper un glyphe typique, d'une valeur par défaut de 0.035 à f .{SLOWER} fait que tous les glyphes prennent 2x aussi longs à taper.{SLOW} fait que tous les glyphes prennent 1,5x aussi longs à taper.{NORMAL} fait que tous les glyphes prennent le 1x normal à taper.{FAST} fait que tous les glyphes prennent 0,5x aussi longs à taper.{FASTER} fait que tous les glyphes prennent 0,25x aussi longs à taper.{NATURAL=f} fait que les glyphes prennent plus ou moins de temps au hasard, mais sinon, c'est le même que {SPEED=f} .{COLOR=s} modifie la couleur du texte; Cela a beaucoup d'options, vous pouvez donc avoir par exemple "rose gris foncé".{STYLE=s} modifie le style de texte (voir ci-dessous); Cela a beaucoup d'options.{SIZE=f} modifie la taille du texte (grossièrement, par incréments de 25%); Cela prend F en pourcentage de 0 à 375.{FONT=name} Modifie la police, s'il y a une police disponible, en recherchant name .{CLEARCOLOR} Définit la couleur du texte sur la couleur par défaut, qui est généralement blanche.{CLEARSIZE} définit la taille à 100%.{CLEARFONT} définit la police sur la police d'origine (n'utilisant pas la police).{ENDCOLOR} Définit la couleur du texte sur la couleur par défaut, qui est généralement blanche. C'est la même chose que {CLEARCOLOR} .{VAR=name} est remplacé par la chaîne associée au name la variable.{IF=name;choice0=cat;choice1=b;=default} vérifie le nom de la variable et le compare à chaque choix du jeton.name est égale à un choix, le jeton est remplacé par la valeur du choix, comme cat .default .{EVENT=name} déclenche un événement, envoyant name au TypingListener, lorsque le typing atteint ce point.{RESET} Définit tous les changements de formatage et de vitesse à leurs valeurs initiales.label.setDefaultToken() peut être utilisé pour modifier les valeurs initiales, de sorte que le texte par défaut est par différents paramètres.{SKIP=n} saute dans l'effet de frappe, affichant instantanément n caractères. Les effets utilisent des accolades bouclées par défaut, mais si les accolades bouclées ne sont pas une bonne option pour votre texte (comme dans les fichiers i18n), vous pouvez utiliser [-EFFECT] comme un équivalent de {EFFECT} .
Cette bibliothèque étend ce que le type de dactylographie d'origine peut faire - il permet d'appliquer des styles au texte, tels que gras, soulignement, obliques, exposés, etc. liés aux styles sont des modifications d'échelle, qui peuvent rétrécir ou agrandir du texte sans modifier votre police et la fonction de "famille de police". Une police peut se voir attribuer une «famille» d'autres polices et noms à utiliser pour y faire référence; Cela agit comme un style normal, mais change en fait ce que la police est utilisée pour dessiner. La liste complète des styles est longue, mais n'est pas aussi détaillée que les jetons d'effet. Vous pouvez activer les styles avec quelque chose comme le balisage de couleur libgdx, dans des crochets comme [*] , ou (si le balisage est utilisé dans un TypingLabel ), vous pouvez utiliser {STYLE=BOLD} pour faire la même chose. Les balises et les noms de style sont à la fois insensibles à la casse, mais les noms de couleurs sont sensibles à la casse. La syntaxe de la branche carrée utilise principalement la ponctuation et s'inspire de la syntaxe de Markdown (que GitHub utilise, entre autres).
Dans la liste suivante, chaque entrée ressemble à quelque chose:
[*] Bascule le mode gras. Peut utiliser des noms de style * , B , BOLD , STRONG .
Cela signifie que vous pouvez toujours utiliser [*] pour activer ou désactiver le mode en gras, et dans un type de type, vous pouvez en outre utiliser la syntaxe insensible à la casse {STYLE=*} , {STYLE=B} , {STYLE=BOLD} , ou {STYLE=STRONG} pour faire la même chose.
La liste complète des styles et des étiquettes de brackets carrés connexes:
[] défait le dernier changement de style / couleur / formatage, bien qu'il ne fasse rien aux effets de la réduction des effets.[] fait dans le balisage libgdx bitmapfont, mais fonctionne sur plus que les couleurs.[ ] réinitialise tous les styles / couleurs / formatage et les effets à l'état initial.[] en nouveau [ ] .[(label)] stocke temporairement l'état de formatage actuel comme label , il peut donc être réappliqué plus tard.label peut être n'importe quelle chaîne alphanumérique. Il ne devrait probablement pas avoir d'espaces, mais peut avoir des soulignements.[ label] applique l'état de formatage stocké comme label , s'il y en a un.[*] Bascule le mode gras. Peut utiliser des noms de style * , B , BOLD , STRONG .[/] bascule le mode oblique (comme l'italique). Peut utiliser des noms de style / , I , OBLIQUE , ITALIC .[^] Bascule le mode Exposcript (et désactive l'indice ou le mode intermédiaire). Peut utiliser des noms de style ^ , SUPER , SUPERSCRIPT .[=] Bascule le mode intermédiaire (et désactive le mode Exposcript ou les indices). Peut utiliser des noms de style = , MID , MIDSCRIPT .[.] Bascule le mode des indices (et désactive le mode SuperScript ou Midscript). Peut utiliser des noms de style . , SUB , SUBSCRIPT .[_] Bascule le mode de soulignement. Peut utiliser les noms de style _ , U , UNDER , UNDERLINE .[~] Bascule le mode Strikethrough. Peut utiliser des noms de style ~ , STRIKE , STRIKETHROUGH .[!] Bascule tous les mode du boîtier supérieur (remplaçant tout autre mode de cas). Peut utiliser des noms de style ! , UP , UPPER .[,] Bascule tous les mode en bas de cas (remplacement de tout autre mode de cas). Peut utiliser des noms de style , LOW , LOWER .[;] bascule capitaliser chaque mode de mot (remplaçant tout autre mode de cas). Peut utiliser des noms de style ; , EACH , TITLE .[%DDD] , où le DDD est un pourcentage de 0 à 375, évolue le texte à ce multiple. Peut être utilisé avec {SIZE=150%} , {SIZE=%25} , ou de même, {STYLE=200%} ou {STYLE=%125} . Supprime tout mode spécial.[%] Sur son propre ensemble de texte sur l'échelle de 100% par défaut et supprime n'importe quel mode spécial. Peut être utilisé avec {STYLE=%} .[%?MODE] Supprime l'échelle et définit un mode spécial; Les modes sont répertoriés ci-dessous.[%^MODE] supprime l'échelle et définit un mode spécial en même temps que le mode des petits capitalisations; Les modes sont répertoriés ci-dessous.[@Name] , où le nom est une clé / nom de la variable family de cette police, bascule la police de type actuelle à la nommée. Peut être utilisé avec {STYLE=@Name} .[@] À lui-même réinitialise la police de caractères à cette police, ignorant sa famille. Peut être utilisé avec {STYLE=@} .[#HHHHHHHH] , où hhhhhhhh est une couleur hex rgb888 ou rgba8888 int, change la couleur. Ceci est une balise normale {COLOR=#HHHHHHHH} .[COLORNAME] , où Colorname est un nom ou une description de couleur qui sera recherché à l'extérieur, modifie la couleur.ColorUtils.describe() , qui essaie de trouver des couleurs de Palette par son nom, et permet également de décrire des mélanges de couleurs ou de changements simples comme "Light" ou "Dull".Colors de Libgdx, ainsi que environ 50 noms de couleurs minuscules supplémentaires (à partir de GDX coloré).Palette par Hue, par légèreté ou par nom.[RED] , [green yellow] , [light blue] , [duller orange] , [darker rich BLUE lavender] , [pale pink orange] et [deeper green navy] .setColorLookup() de Font avec votre propre implémentation ColorLookup pour faire ce que vous voulez ici.| , ce qui permet de rechercher des couleurs avec des noms contenant de la ponctuation. Par exemple, [|;_;] chercherait une couleur appelée ;_; , "La couleur de la tristesse" et n'agirait pas comme [;] .ColorLookup personnalisé peut ne pas, et ColorLookup.INSTANCE , qui recherche des noms de chaîne dans la classe de couleurs libgdx verbatim.{COLOR=SKY} (quelles couleurs peuvent gérer immédiatement) ou avec une description, comme {COLOR=lighter orange-red} , même à l'intérieur d'une balise comme {GRADIENT} .[+region name] , où le nom de la région est le nom d'un textureReregion à partir d'un textueratlas enregistré, ne changera pas le style, mais produira cette ligne texturégion avec le texte.KnownFonts.addEmoji() pour ajouter les icônes Twemoji de 3000+ à une police.[+saxophone] et [+?] Montreront chacune une icône de saxophone.[+call me hand, medium-dark skin tone] et [+??] .KnownFonts.addGameIcons() , qui ajoute des icônes de la collection Game-icons.net. Ceux-ci utilisent la même syntaxe: [+crystal-wand] .[-SOME_EFFECT] équivaut à utiliser des accolades bouclées autour de SOME_EFFECT ; Notez le tableau de bord ajouté.Les modes spéciaux qui peuvent être utilisés à la place de l'échelle sont:
black outline ou blacken , qui peut être utilisé avec les noms de style BLACK OUTLINE ou BLACKEN .white outline ou whiten , qui peut être utilisé avec les noms de style WHITE OUTLINE ou WHITEN .shiny , qui peut être utilisé avec les noms de style SHINY , SHINE ou GLOSSY .drop shadow ou shadow , qui peut être utilisée avec les noms de style SHADOW , DROPSHADOW ou DROP SHADOW .error , qui peut être utilisée avec l' ERROR des noms de style, REDLINE ou RED LINE .Font.PACKED_ERROR_COLOR .warn , qui peut être utilisé avec les noms de style WARN , YELLOWLINE ou YELLOW LINE .Font.PACKED_WARN_COLOR .note , qui peut être utilisé avec les noms de style NOTE , INFO , BLUELINE ou BLUE LINE .Font.PACKED_NOTE_COLOR .jostle , qui peut être utilisé avec les noms de style JOSTLE , WOBBLE ou SCATTER .[%?] .small caps , qui peuvent être utilisés avec les noms de style de style ou de SMALLCAPS SMALL CAPS .[%^] . Il ne peut pas être utilisé avec la syntaxe [%?small caps] ; il a besoin d'un caret. Le mode Small Caps peut être utilisé avec l'un des autres modes à l'exception de Jostle, en changeant %? à %^ . En dehors de cela, il n'y a pas deux modes actifs en même temps, et aucun modes ne peut être utilisé en même temps que la mise à l'échelle.
Notez que les modes utilisent une syntaxe légèrement différente pour éviter d'être confondu avec les noms de couleurs. Lorsque vous utilisez des crochets, chacun des noms donnés ici dans des cas inférieurs doit être précédé de %? La plupart du temps (les petites capuchons et la bousculade sont spéciaux). Cela signifie activer le mode rouge-sous-ligne "Erreur", vous utilisez la balise carrée [%?error] . Si vous utilisez le balisage du bravoure pour TypingLabel, vous utiliseriez les noms donnés ici dans la haute case et que vous pouvez les utiliser comme d'autres noms de style: {STYLE=ERROR} , par exemple. Le mode Small Caps est, comme mentionné, spécial; Il est généralement activé avec [%^small caps] , mais peut également être activé avec [%^] , et peut également être mélangé avec n'importe quel autre mode sauf se bousculer en modifiant le %? à %^ . Chaque fois que les petits capuchons sont actifs, la balise de bracket carré utilise %^ au lieu de %? . Le mode jostle est également spécial; Il est généralement activé avec [%?jostle] , mais peut également être activé avec [%?] seul. Jostle ne peut pas être mélangé avec de petites capuchons.
Les modes spéciaux sont un peu trop compliqués en termes de syntaxe car j'ai manqué de ponctuation que je pourrais utiliser. L'exemple courant d'un contour noir autour du texte blanc peut être obtenu avec [WHITE][%?blacken]Outlined![%][GRAY] . (L'exemple utilise GRAY comme couleur normale, mais vous pouvez également utiliser [ ] pour réinitialiser la couleur à la couleur de base configurée sur une Layout ou l'étiquette qui la maintient. Notez que [ ] réinitialise également la taille, le mode et, bien, tout.)
Plusieurs combinaisons d'effets sont disponibles en utilisant la syntaxe {VAR=ZOMBIE}urgh, brains...{VAR=ENDZOMBIE} :
{VAR=FIRE} Modifie le texte suivant pour avoir des couleurs de changement de feu. Vous pouvez le terminer avec {VAR=ENDFIRE} .{VAR=SPUTTERINGFIRE} modifie le texte suivant pour avoir des couleurs de changement de feu et redimensionner comme des flammes éclatées. Vous pouvez le terminer avec {VAR=ENDSPUTTERINGFIRE} .{VAR=BLIZZARD} Modifie le texte suivant pour vaciller dans le vent et utiliser des couleurs glacées, blanc à bleu clair. Vous pouvez le terminer avec {VAR=ENDBLIZZARD} .{VAR=SHIVERINGBLIZZARD} Modifie le texte suivant pour vaciller dans le vent et utiliser des couleurs glacées, blanc à bleu clair, et il fera au hasard les glyphes "frissonner" comme s'il était froid. Vous pouvez le terminer avec {VAR=ENDSHIVERINGBLIZZARD} .{VAR=ELECTRIFY} Modifie le texte suivant pour être une couleur violet gris terne et fait que les glyphes deviennent au hasard en jaune clair et vibrent. Vous pouvez le terminer avec {VAR=ENDELECTRIFY} .{VAR=ZOMBIE} change le texte suivant pour être "sage d'olivier foncé" (une couleur gris-vert terne), fait tourner les glyphes à gauche et à droite lentement et au hasard, fait tomber les glyphes et se remonter au hasard, et lorsqu'ils apparaissent pour la première fois). Vous pouvez le terminer avec {VAR=ENDZOMBIE} . Ceux-ci sont définis dans TypingConfig.initializeGlobalVars() , et vous pouvez définir vos propres combinaisons de la même manière que celles-ci sont définies. Par exemple, FIRE est défini avec
TypingConfig . GLOBAL_VARS . put ( "FIRE" , "{OCEAN=0.7;1.25;0.11;1.0;0.65}" );
TypingConfig . GLOBAL_VARS . put ( "ENDFIRE" , "{ENDOCEAN}" ); L'effet OCEAN ne se soucie pas des couleurs qu'il utilise; Il définit seulement un motif approximatif pour la transition entre ces couleurs. Cela signifie, contre-intuitivement, FIRE est mieux mis en œuvre avec OCEAN plutôt que GRADIENT . L'utilisation du nom FIRE est probablement préférable à OCEAN , donc le VAR global est là pour cette raison.
La possibilité de stocker des états de formatage à l'aide d'une étiquette permet un assemblage plus complexe des chaînes de balisage à partir de plusieurs sources. Vous pouvez appeler quelque chose comme font.storeState("spooky", "[/][darker gray][@?blacken]") pour stocker en permanence cet état de formatage (texte gris foncé oblique avec un contour noir) dans font , et peut ensuite réinitialiser cet état simplement en entrant [ spooky] (noter l'espace d'ouverture). Vous pouvez également créer un texte insertion qui stocke le formatage actuel avant qu'il n'écrit quoi que ce soit, et réinitialise le formatage lors de l'écriture. Cela utiliserait quelque chose comme "[(previous)][ ][BLUE][^][[citation needed][ previous]" [citation needed] Si cette chaîne est insérée au milieu d'un plus grand bloc de texte, il ne changera pas la mise en forme environnante, mais n'utilisera pas le format du bloc-enceinte Blue pour sa propre note exposante. Si vous avez plusieurs balises de magasin d'état avec la même étiquette, la valeur associée à cette étiquette changera à mesure que ces balises sont rencontrées. Vous voudrez peut-être utiliser des étiquettes uniques pour éviter de changer accidentellement la valeur d'une autre étiquette, mais ce n'est généralement pas nécessaire.
Textrataty fait une utilisation intensive de sa nouvelle classe Font , qui est une refonte complète de BitmapFont de LibgDX qui ne partage essentiellement aucun code avec son ancêtre. Une police a diverses qualités qui lui donnent plus de puissance que BitmapFont, principalement dérivées de la façon dont il stocke (et rend disponible) les images de glyphes comme texturégions dans une carte. Il n'y a rien de strictement à vous empêcher d'ajouter vos propres images à la mapping d'une police, tant qu'elles ont les informations requises à utiliser comme glyphe textuel, puis en plaçant ces images avec votre texte. Ceci est utilisé pour implémenter des emoji, comme un exemple, et peut être utilisé pour les icônes personnalisées et les emoji.
Textratypist prend en charge les polices de bitmap standard et également les polices de champ de distance, en utilisant SDF ou MSDF. TypingLabel permettra automatiquement au ShaderProgram que le type de champ de distance approprié a besoin (s'il en a besoin) et le désactive après s'être rendu. Vous pouvez modifier ce comportement en appelant manuellement la méthode Font.enableShader(Batch) sur votre police et en changeant le lot à votre autre programme ShadderProgram avec son Batch.setShader() (souvent, vous passez simplement null ici pour réinitialiser le shader). Notez que les polices SDF et MSDF doivent être informées des modifications de la taille de l'écran, en utilisant Font.resizeDistanceField() ou sur les méthodes de divers autres endroits qui appellent resizeDistanceField() . Depuis 1.0.0, vous souhaitez généralement utiliser la surcharge qui prend une Viewport ; Si vous n'avez pas de Viewport , vous n'avez pas besoin de cette surcharge. Chaque police de champ de distance que vous rendez actuellement doit faire redimensionner son champ de distance lorsque la fenêtre redimensionne, dans ApplicationListener.resize() .
Il existe plusieurs paramètres de police préconfigurés dans KnownFonts ; La documentation de chaque Getter de police indique quels fichiers sont nécessaires pour utiliser cette police. Les anciens fichiers .fnt ont été déplacés ici . Vous pouvez voir les aperçus et les descriptions de toutes les polices connues ici. Avoir desFontes connus n'est pas nécessaire pour de nombreuses polices depuis la version 1.0.0, car les polices .dat sont désormais réalisées par le même outil (FontWriter), et ont tendance à être configurées correctement prêtes à l'emploi. La variété des types de polices n'est pas incroyable, mais ce devrait être un bon point de départ. Une bonne chose à noter est la méthode KnownFonts.getStandardFamily() , qui nécessite d'avoir 16 polices dans vos actifs, mais vous permet naturellement de basculer entre l'une de ces 16 polices en utilisant la syntaxe [@Medieval] (où la médiévale est l'un des noms qu'il connaît, dans ce cas pour la "Fondation Kingthings").
Les polices utilisent ici l'extension de fichier .dat (ce qui signifie simplement que ce sont des données binaires sans format de fichier particulier). Ce sont des versions compressées de plus grandes polices .json produites par FontWriter. La compression qu'ils utilisent est compatible GWT, de sorte que ces fichiers .DAT peuvent être utilisés sur n'importe quelle plate-forme LibGDX. Vous pouvez toujours utiliser les fichiers .fnt plus anciens sans problème, et certains fichiers .fnt sont toujours utilisés ici (principalement pour les polices de pixel). Vous avez également généralement besoin d'un .png avec chaque police, bien qu'il puisse être dans un atlas.
Les fichiers de licence pour chaque police sont inclus dans le même dossier, dans knownFonts ici. Toutes les polices fournies ici ont été vérifiées pour s'assurer que leurs licences permettent une utilisation commerciale sans frais, et tout le fait. La plupart nécessitent une attribution; Vérifiez les licences pour plus de détails.
Knowfonts comprend plusieurs autres façons de configurer les instances de police existantes en ajoutant un textueratlas aux glyphes qu'ils connaissent. Cela inclut quelques-uns textures existants d'icônes et ... emoji!
Les icônes Twemoji sont également présentes dans un atlas d'images de plus de 3000 32x32; KnownFonts.addEmoji() peut les enregistrer avec une police afin que la syntaxe [+name] mentionnée ci-dessus puisse dessiner en ligne des emoji. De même, un atlas d'icônes de plus de 4000 60x60 est présent à partir de game-icons.net, et KnownFonts.addGameIcons() peut les enregistrer avec une police. Les atlas Twemoji et Game-icons.net ne peuvent pas être enregistrés en une seule police en même temps; Il n'y a pas assez d'espace libre dans la partie d'Unicode qu'ils peuvent utiliser en toute sécurité. Un moyen de contourner cela consiste à utiliser la fonction FontFamily et à ajouter une police uniquement pour les icônes ou juste pour les emoji à la famille. Il existe une méthode existante pour cela; KnownFonts.getGameIconsFont() vous permet d'obtenir une police qui est destinée à afficher des icônes de jeu, avec une cérémonie autour de son utilisation. [@Icons][+rooster][@] est un exemple rapide de la façon dont vous pouvez passer à la police produite par getGameIconsFont() , dessiner une icône et revenir en arrière.
Il y a des aperçus pour Twemoji ici, avec le char et le nom Emoji pour rechercher chaque image. De même, il y a des aperçus pour les icônes de jeu-icons.net ici, avec juste le nom nécessaire pour rechercher chaque image. N'oubliez pas que parce que les images de jeu-icons.net sont du blanc pur avec transparence, vous pouvez leur teinter n'importe quelle couleur que vous souhaitez en utilisant la syntaxe standard [RED] , [light dull green] ou [#0022EEFF] .
Les fichiers de licence pour Twemoji et les images Game-icons.net sont inclus dans knownFonts , à côté des fichiers de licence pour les polices. Bien que Twemoji ait des exigences simples pour l'attribution, les icônes de jeu nécessitent l'attribution à pas mal de contributeurs individuels; Voir la fin de ce document pour la liste, que vous pouvez et devriez copier pour accorder du crédit à tout le monde.
Il existe également des emoji à art line d'OpenMoji et des versions en couleur des mêmes emoji. Ceux-ci peuvent être mieux adaptés aux styles d'art de certains projets.
Vous pouvez faire pivoter des glyphes individuels (si vous les dessinez individuellement) ou faire tourner des blocs de texte entiers en tant que mise en page, en utilisant une surcharge facultative de Font.drawGlyph() ou Font.drawGlyphs() . Les effets personnalisés pour TypingLabel peuvent également modifier individuellement la rotation de n'importe quel glyphe, ainsi que sa position et sa balance sur X et / ou Y. Vous pouvez faire pivoter un textralabel ou taperLabel en utilisant leurs méthodes setRotation() , et la rotation agira désormais correctement pour les étiquettes avec des arrière-plans et / ou avec différents paramètres d'alignement. L'origine des rotations peut être définie dans l'étiquette, et l'étiquette entière tournera autour de ce point d'origine.
Vous pouvez également, pour certaines polices, avoir des caractères de dessin en boîte et des éléments de blocage générés automatiquement. Cela nécessite un caractère de bloc blanc solide (de toute taille, généralement 1x1) présente dans la police à ID 9608 (l'indice de bloc complet Unicode, 'u2588' ). Cela permet également une meilleure garantie de caractères soulignés et de strikethrough se connectant correctement, et sans maculage où deux soulignements ou traits de trait se chevauchent. Font tente d'activer cela dans certains cas, ou elle peut être définie avec un paramètre, mais si elle échoue, elle redevient en utilisant des traits de soulignement et des traits de traits pour le strikethrough. Toutes les polices dans KnownFonts sont configurées pour utiliser un bloc solide ou pour l'éviter spécifiquement car cette police rend mieux sans lui. Notez que si vous créez une Font à partir d'un libgdx BitmapFont , cela n'essaie même pas de fabriquer des glyphes de grille, car BitMapFonts a rarement un char à bloc solide approprié.
Une configuration supplémentaire est possible pour les caractères de dessin de boîtes qui sont réellement utilisés à cette fin (pas seulement souligner ou strikethrough). Vous pouvez régler boxDrawingBreadth sur une Font à un multiplicateur pour rendre les lignes de délai de boîte plus épaisses ou plus minces, sans changer la façon dont elles se connectent les unes aux autres.
Diverses fonctionnalités permettent une configuration supplémentaire ici. Vous pouvez définir boldStrength sur une valeur autre que la valeur par défaut 1 si vous voulez plus ou moins d'espace supplémentaire appliqué à partir du style en gras. Vous pouvez également définir obliqueStrength pour changer l'angle de la biais avec laquelle le texte oblique est dessiné. Les couleurs pour divers effets peuvent être modifiées au besoin; font.PACKED_SHADOW_COLOR peut être modifié pour utiliser une couleur d'ombre plus sombre, plus claire, plus opaque ou plus transparente, par exemple. font.PACKED_BLACK affecte le mode de contour noir, et font.PACKED_WHITE affecte le contour blanc et les modes brillants. Il existe des modes similaires pour modifier les couleurs de l'erreur, de l'avertissement et des soulignements de notes. Toutes ces configurations de couleurs s'appliquent par instance de police, vous pouvez donc avoir deux objets de police en utilisant la même police mais avec différentes couleurs configurées.
À partir de la version 0.4.0, il existe divers widgets qui remplacent leurs homologues Scene2d.UI et échangent Label contre TextraLabel , vous permettant d'utiliser le balisage. Les widgets sont ImageTextraButton , TextraButton , TextraCheckBox , TextraDialog , TextraLabel , TextraListBox , TextraTooltip et TextraWindow , ainsi que des versions alternatives de chacun qui utilisent un TypingLabel au lieu d'un TextraLabel et ont Typing dans leurs noms.
Bien que TextArea ne soit pas encore pris en charge, un homologue à TextArea est prévu et n'a pas encore fonctionné. TextraLabel est par défaut pour prendre en charge plusieurs lignes et peut être en mesure de se tenir debout pour une utilisation. TypingLabel permet également le suivi des entrées, vous pouvez donc l'utiliser pour fabriquer des régions de texte sélectionnables - lisez la suite!
Le suivi des entrées a été une option pour TypingLabel et le code qui l'utilise depuis 0,7.0. Ceci s'est développé en 0,7,4 pour permettre au texte dans un TypingLabel soit sélectionné avec label.setSelectable(true) . Vous pouvez accéder au texte actuellement sélectionné avec label.getSelectedText() ou le copier directement avec label.copySelectedText() . Lorsque l'utilisateur termine un geste de clic et de glisser sur le TypingLabel (et il est sélectionnable), un événement est également déclenché; Vous pouvez écouter "*SELECTED" dans un TypingListener et copier du texte dès qu'il est sélectionné, ou ne copier que lorsque une touche est appuyée. D'autres fonctionnalités utiles qui utilisent le suivi des entrées incluent la balise {LINK} , qui fait de la durée de texte un lien cliquable vers une adresse Internet, {TRIGGER} , qui déclenche un événement en clic et quelques autres balises qui répondent à la souris en survol ( {ATTENTION} , {HIGHLIGHT} et {STYLIST} ). Ceux-ci ne fonctionnent que pour TypingLabel , pas TextraLabel , vous voudrez peut-être utiliser un TypingLabel et appeler skipToTheEnd() pour le traiter comme un texte toujours qui répond à la saisie de l'utilisateur et peut utiliser des styles animés comme {RAINBOW} .
Vous pouvez lire dans un fichier JSON SCEINE2D.UI SKINE NORMAL avec une variante sur la classe Skin de LibGDX, FWSkin (ou l'une des classes qui l'étend), et cela chargera des styles Scene2d.Ui normaux et des styles Textratypiste spécialisés. Les styles spécialisés ne sont généralement que différents en ce qu'ils utilisent Font au lieu de BitmapFont , et sont tous imbriqués dans la classe Styles ici. Avoir un style spécialisé signifie qu'une police peut être réutilisée dans plus d'endroits, sans avoir à faire de nombreuses copies d'un bitmapfont (un par widget, parfois) ... ce qui était le cas avant Textratypist 1.0.0. En règle générale, passer de la peau à FWSKin est simple. Code comme celui-ci avant:
Skin skin = new Skin ( Gdx . files . internal ( "my-skin.json" ));Changerait cela après:
FWSkin skin = new FWSkin ( Gdx . files . internal ( "my-skin.json" )); Vous pouvez également affecter une FWSkin à une variable Skin , et c'est l'option la plus compatible, car votre variable cutanée ne sera qu'une Skin normale. Il existe certaines méthodes de commodité dans FWSkin pour gérer un peu plus les polices de champ de distance, cependant, donc l'utilisation FWSkin dans la mesure du possible est une bonne idée.
Pourquoi s'appelle-t-il FWSkin , vous vous demandez? Eh bien, il peut charger des instances de police et de bitmapfont à partir de fichiers .fnt (nécessitant une configuration cutanée uniquement pour BitmapFont ), et peut faire de même pour les polices JSON structurées, qui sont généralement créées par FontWriter, ou FW. Le but initial de FWSkin était juste de charger des fichiers de police .fnt et .json / .dat également bien, mais sa portée s'est étendue pour inclure les nouveaux styles.
Si vous avez l'habitude d'utiliser Stripe, il y a un remplacement sans rendez-vous qui fait à la fois ce que fait FWSkin et la manipulation de Freetype que fait cette bande. Il s'agit de la dépendance FreeTypist supplémentaire, disponible dans un référentiel séparé. Il permet de configurer Freetype en ayant un "com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator" dans votre peau JSON, qui est souvent produite par Skin Composer. Vous pouvez prendre des peaux normales produites par Skincomposer et compatibles avec Stripe et les utiliser avec Freetypist.
Vous pouvez l'obtenir via Gradle, mais c'est probablement une meilleure option de simplement copier dans les deux fichiers de ce dossier de Freetypist dans votre propre code. Quelle que soit la façon dont vous dépendez du freetypist, il a besoin d'une dépendance à Freetype (y compris des dépendances "plate-forme" appropriées) et à TextratyPist (actuellement 1.0.0). Lorsque des fonctionnalités sont ajoutées à FWSKIN et Textrataty en général, Freetypist doit également être mis à jour.
Vous voulez probablement obtenir des textratypes avec Gradle! La dépendance du module de base d'un projet libgdx ressemble:
implementation " com.github.tommyettinger:textratypist:1.1.0 "Cela suppose que vous dépendez déjà de libgdx; Les textratypes dépendent de la version 1.12.1 ou supérieure. Une exigence pour 1,11.0 a été ajoutée dans Textratratist 0.5.0 en raison de quelques modifications de rupture du code d'infiltration dans LiBGDX. L'exigence de 1.12.1 a été ajoutée dans 1.0.0 car certaines choses ont probablement changé, mais le 1.12.1 (ou les versions de snapshot ultérieures) devraient être assez faciles à mettre à jour.
Si vous utilisez GWT, cela devrait être compatible. Il a besoin de ces dépendances dans le module HTML:
implementation " com.github.tommyettinger:textratypist:1.1.0:sources "
implementation " com.github.tommyettinger:regexodus:0.1.16:sources "GWT en a également besoin dans le fichier gdxdefinition.gwt.xml (depuis la version 0.7.7):
< inherits name = " regexodus.regexodus " />
< inherits name = " com.github.tommyettinger.textratypist " /> Dans la version 0.7.4 et plus tôt, vous feriez une version antérieure des deux dépendances (note, il s'agit d'une ancienne version ):
// OLD VERSION
implementation " com.github.tommyettinger:textratypist:0.7.4:sources "
implementation " com.github.tommyettinger:regexodus:0.1.13:sources " et utiliserait ces hérités de GWT à la place:
<!-- OLD VERSION -->
< inherits name = " regexodus " />
< inherits name = " textratypist " />Regexodus est la bibliothèque d'expression régulière compatible avec GWT que cela utilise pour correspondre à certains modèles complexes en interne. Outre Libgdx lui-même, Regexodus est la seule dépendance de ce projet. Le GWT hérite que le Textrataty et le regexodus, car il s'avère que l'utilisation du package par défaut peut causer de vrais problèmes.
Il y a au moins une version dans la section des versions de ce dépôt, mais vous êtes toujours encouragé à utiliser Gradle pour gérer cette bibliothèque et ses dépendances.
Vous pouvez également utiliser Jitpack pour obtenir un engagement actuel, ce qui peut être pratique en cas de longue durée entre les versions. 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. Merci!
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.