
Uma biblioteca de exibição de texto centrada em uma etiqueta que imprime ao longo do tempo, com efeitos e estilos.
Em outras palavras, isso traz mais recursos para a renderização de texto no libgdx.
Como é isso? Um pouco assim ...
Ou talvez assim ...

Se você preferir assistir a um vídeo do que ler este texto, Raymond "Raeleus" Buckley fez um vídeo cobrindo a maior parte do Textratypist! Ele cobre algumas coisas que esse arquivo não, como o uso do compositor da pele, por isso é um bom relógio, independentemente.
Há um rótulo "normal" aqui na forma de Textralabel, que atua quase exatamente como o rótulo em cenário2d.ui, mas permite os estilos cobertos abaixo. Muito uso pode preferir digitar o Label!
O typinglabel é um widget de cenário2d.ui bastante normal e estende o textralabel. No entanto, ele coloca cartas na tela uma de cada vez, a menos que seja instruído a pular. Este é um efeito nostálgico encontrado em muitos jogos mais antigos de texto, e parece que uma máquina de escrever está colocando cada letra a uma taxa mais lenta do que o intantantâneo.
Sim, ele tem mais do que o modo de máquina de escrever! O texto pode pendurar acima e depois cair no lugar. Pode pular para cima e para baixo em uma onda longa. Pode vacilar e estremecer, como se estivesse doente. Pode piscar em cores diferentes, mover -se em um gradiente suavemente entre duas cores ou atravessar um arco -íris inteiro. Muitas opções; muita diversão. Os efeitos são quase os mesmos que na digitação, mas houve algumas mudanças e acréscimos. Você pode verificar o wiki textratypist para obter mais informações.
A partir de 0,10.0, existem muitos novos efeitos. Jolt, espiral, rotação, multidão, encolhimento, emergem, batimentos cardíacos, carrossel, abóbora, escala, girar, atenção, destaque, link, gatilho, estilista, canhão, oceano, pulverização e instante são todos novos no textratypist (não em tipagem-label). Você pode ver instruções de uso e amostrar GIFs na página Tokens do Textratypist Wiki. A maioria desses efeitos utiliza as opções de escala e rotação suaves que podem usar o início do Textratypist 0.5.1. Alguns usam o rastreamento do mouse, novo em 0.7.0, como como o link responde apenas a um clique em uma variedade de texto.
Você pode criar TypingLabel S, mesmo onde você não precisa do efeito de digitação, porque TextraLabel não lida com nenhum efeito. Você pode ligar para skipToTheEnd() em um tipinglabel ou (em 0,7,0 e acima) em algumas outras classes para permitir que um tipingLabel seja usado para texto parado com efeitos.
Vários tokens padrão também estão presentes, e estes podem manipular o efeito de digitação, a substituição variável e outras coisas úteis:
{WAIT=f} faz com que o efeito de digitação pausa e aguarde f , como um flutuador.{SPEED=f} altera o tempo necessário para digitar um glifo típico, de um padrão de 0.035 para f .{SLOWER} faz com que todos os glifos demorem 2x tanto para digitar.{SLOW} faz com que todos os glifos demorem 1,5x por mais tempo para digitar.{NORMAL} faz com que todos os glifos levem o 1x normal para digitar.{FAST} faz com que todos os glifos demorem 0,5x tanto tempo para digitar.{FASTER} faz com que todos os glifos demorem 0,25x tão tempo para digitar.{NATURAL=f} faz os glifos levarem aleatoriamente mais ou menos tempo para digitar, mas, caso contrário, é o mesmo que {SPEED=f} .{COLOR=s} altera a cor do texto; Isso tem muitas opções, para que você possa ter "rosa cinza escuro".{STYLE=s} altera o estilo de texto (veja abaixo); Isso tem muitas opções.{SIZE=f} altera o tamanho do texto (grosseiramente, em incrementos de 25%); Isso leva F como uma porcentagem de 0 a 375.{FONT=name} altera a fonte, se houver um FontFamily disponível, procurando name .{CLEARCOLOR} define a cor do texto para a cor padrão, que geralmente é branca.{CLEARSIZE} define o tamanho para 100%.{CLEARFONT} define a fonte para a fonte original (não usando a FontFamily).{ENDCOLOR} define a cor do texto para a cor padrão, que geralmente é branca. É o mesmo que {CLEARCOLOR} .{VAR=name} é substituído por qualquer string associada ao name variável.{IF=name;choice0=cat;choice1=b;=default} verifica o nome da variável e o compara a cada opção no token.name for igual a uma opção, o token será substituído pelo valor da opção, como cat .default .{EVENT=name} aciona um evento, enviando name para o tipingListener, quando a digitação atinge esse ponto.{RESET} Define todas as alterações de formatação e velocidade em seus valores iniciais.label.setDefaultToken() pode ser usado para alterar os valores iniciais; portanto, os padrões de texto para algumas configurações diferentes.{SKIP=n} pula à frente no efeito de digitação, exibindo instantaneamente os caracteres n Os efeitos usam aparelhos encaracolados por padrão, mas se os aparelhos encaracolados não forem uma boa opção para o seu texto (como nos arquivos i18n), você poderá usar [-EFFECT] como equivalente a {EFFECT} .
Esta biblioteca estende o que o tiping-tiping original pode fazer-permite que os estilos sejam aplicados ao texto, como ousado, sublinhado, oblíquo, sobrescrito, etc. Relacionados a estilos são alterações em escala, que podem encolher ou aumentar o texto sem alterar sua fonte e o recurso "Família da fonte". Uma fonte pode receber uma "família" de outras fontes e nomes para se referir a eles; Isso age como um estilo normal, mas na verdade muda o que a fonte é usada para desenhar. A lista completa de estilos é longa, mas não é tão detalhada quanto os tokens de efeito. Você pode ativar estilos com algo como marcação de cores libgdx, em suportes quadrados como [*] , ou (se a marcação for usada em um TypingLabel ), você pode usar {STYLE=BOLD} para fazer a mesma coisa. Tags e nomes de estilo são insensíveis a maiúsculas, mas os nomes de cores são sensíveis à caixa. A sintaxe do bracket quadrado usa principalmente pontuação e é inspirada na sintaxe de Markdown (que o Github usa, entre outros lugares).
Na lista a seguir, cada entrada se parece com:
[*] Alterna o modo negrito. Pode usar nomes de estilo * , B , BOLD , STRONG .
Isso significa que você sempre pode usar [*] para ativar ou desativar o modo ousado e, em um tipinglabel, pode usar a sintaxe insensível a maiúsculas de minúsculas {STYLE=*} , {STYLE=B} , {STYLE=BOLD} ou {STYLE=STRONG} para fazer a mesma coisa.
A lista completa de estilos e tags de suporte quadrado relacionadas:
[] Descarga a última mudança para estilo/cor/formatação, embora não faça nada com os efeitos de digitação.[] na marcação de bitmapfont libgdx, mas funciona com mais do que cores.[ ] Redefina todos os estilos/cores/formatação e efeitos no estado inicial.[] para o novo [ ] .[(label)] armazena temporariamente o estado de formatação atual como label , para que possa ser aplicado posteriormente.label pode ser qualquer sequência alfanumérica. Provavelmente não deveria ter espaços, mas pode ter sublinhados.[ label] reaplicam o estado de formatação armazenado como label , se houver um.[*] Alterna o modo negrito. Pode usar nomes de estilo * , B , BOLD , STRONG .[/] Alterna o modo oblíquo (como itálico). Pode usar nomes de estilo / , I , OBLIQUE , ITALIC .[^] Alterna o modo SuperScript (e desligam o modo subscrito ou meio -descrito). Pode usar nomes de estilo ^ , SUPER , SUPERSCRIPT .[=] Alega o modo médio -script (e desligam o modo Superscript ou Subscript). Pode usar nomes de estilo = , MID , MIDSCRIPT .[.] Alega o modo subscrito (e desligam o modo Superscript ou Midscript). Pode usar nomes de estilo . , SUB , SUBSCRIPT .[_] alterna o modo sublinhado. Pode usar nomes de estilo _ , U , UNDER , UNDERLINE .[~] TOGLES STRIKETHROUGH MODO. Pode usar nomes de estilo ~ , STRIKE , STRIKETHROUGH .[!] Alterna todo o modo de caixa superior (substituindo qualquer outro modo de caso). Pode usar nomes de estilo ! , UP , UPPER .[,] Alterna todo o modo minúsculo (substituindo qualquer outro modo de caso). Pode usar nomes de estilo , LOW , LOWER .[;] TOGLES capitaliza cada modo de palavra (substituindo qualquer outro modo de caso). Pode usar nomes de estilo ; , EACH , TITLE .[%DDD] , onde o DDD é uma porcentagem de 0 a 375, escala texto para esse múltiplo. Pode ser usado com {SIZE=150%} , {SIZE=%25} ou da mesma forma, {STYLE=200%} ou {STYLE=%125} . Remove qualquer modo especial.[%] Em seus próprios conjuntos, o texto da escala 100% padrão e remove qualquer modo especial. Pode ser usado com {STYLE=%} .[%?MODE] Remove a escala e define um modo especial; Os modos estão listados abaixo.[%^MODE] remove a escala e define um modo especial ao mesmo tempo que o modo de pequena captura; Os modos estão listados abaixo.[@Name] , onde o nome é uma chave/nome na variável family desta fonte, troca o tipo de letra atual para o nomeado. Pode ser usado com {STYLE=@Name} .[@] Por sua conta, redefine o tipo de letra para esta fonte, ignorando sua família. Pode ser usado com {STYLE=@} .[#HHHHHHHH] , onde hhhhhhhh é uma cor hexadecimal rgb888 ou rgba8888 int, muda a cor. Esta é uma tag {COLOR=#HHHHHHHH} normal.[COLORNAME] , onde o Colorname é um nome de cor ou descrição que será analisado externamente, altera a cor.ColorUtils.describe() , que tenta encontrar cores da Palette por nome, e também permite descrever misturas de cores ou alterações simples como "luz" ou "monótona".Colors do LibGDX e também cerca de 50 nomes adicionais de cores minúsculas (de GDX colorido).Palette de Hue, por leveza ou pelo nome.[RED] , [green yellow] , [light blue] , [duller orange] , [darker rich BLUE lavender] , [pale pink orange] e [deeper green navy] .setColorLookup() da Font com sua própria implementação ColorLookup para fazer o que você deseja aqui.| , que permite procurar cores com nomes que contêm pontuação. Por exemplo, [|;_;] procuraria uma cor chamada ;_; , "a cor da tristeza" e não agiria como [;] .ColorLookup personalizado pode não, nem ColorLookup.INSTANCE , que procura nomes de strings na classe Libgdx Colors Class literalmente.{COLOR=SKY} (que as cores podem lidar imediatamente) ou com uma descrição, como {COLOR=lighter orange-red} , mesmo dentro de uma tag como {GRADIENT} .[+region name] , onde o nome da região é o nome de uma textureregion de uma textura registrada, não mudará o estilo, mas produzirá essa textureregion em linha com o texto.KnownFonts.addEmoji() para adicionar os Ícones Twemoji mais de 3000 a uma fonte.[+saxophone] e [+?] Mostram um ícone de saxofone.[+call me hand, medium-dark skin tone] e [+??] .KnownFonts.addGameIcons() , que adiciona ícones da coleção Game-icons.net. Estes usam a mesma sintaxe: [+crystal-wand] .[-SOME_EFFECT] é equivalente a usar aparelhos encaracolados em torno de SOME_EFFECT ; Observe o painel adicionado.Os modos especiais que podem ser usados no lugar de escala são:
black outline ou blacken , que pode ser usado com os nomes de estilo, BLACK OUTLINE ou BLACKEN .white outline ou whiten , que pode ser usado com os nomes de estilo, WHITE OUTLINE ou WHITEN .shiny , que pode ser usado com os nomes de estilo SHINY , SHINE ou GLOSSY .drop shadow ou shadow , que pode ser usado com os nomes de estilo, SHADOW , DROPSHADOW ou DROP SHADOW .error , que pode ser usado com o ERROR de nomes de estilo, REDLINE ou RED LINE .Font.PACKED_ERROR_COLOR .warn , que pode ser usado com os nomes de estilo WARN , YELLOWLINE ou YELLOW LINE .Font.PACKED_WARN_COLOR .note , que pode ser usado com os nomes INFO NOTE BLUELINE ou BLUE LINE .Font.PACKED_NOTE_COLOR .jostle , que pode ser usado com os nomes de estilos JOSTLE , WOBBLE ou SCATTER .[%?] .small caps , que podem ser usadas com os nomes de estilo SMALLCAPS ou SMALL CAPS .[%^] . Não pode ser usado com a sintaxe [%?small caps] ; Precisa de um cuidador. O modo Small Caps pode ser usado com qualquer um dos outros modos, exceto o Jostle, alterando %? para %^ . Fora isso, nenhum modos não pode estar ativo ao mesmo tempo, e nenhum modos pode ser usado ao mesmo tempo que a escala.
Observe que os modos usam sintaxe ligeiramente diferente para evitar serem confundidos com nomes de cores. Ao usar colchetes quadrados, cada um dos nomes dados aqui em casos mais baixos deve ser precedido por %? Na maioria das vezes (pequenos bonés e tacos são especiais). Isso significa ativar o modo de Red-Underline "Erro", você usa a tag de suporte quadrado [%?error] . Se estiver usando a marcação de braceleira para o TypingLabel, você usaria os nomes fornecidos aqui no caso superior e pode usá-los como outros nomes de estilo: {STYLE=ERROR} , por exemplo. O modo Small Caps é, como mencionado, especial; Geralmente é ativado com [%^small caps] , mas também pode ser ativado com [%^] e também pode ser misturado com qualquer outro modo, exceto o empurrão alterando a %? para %^ . Sempre que pequenos caps estão ativos, a tag de suporte quadrado usa %^ em vez de %? . O modo de fortalecimento também é especial; Geralmente é ativado com [%?jostle] , mas também pode ser ativado com [%?] por conta própria. O Jostle não pode ser misturado com pequenas tampas.
Os modos especiais são um pouco complicados em termos de sintaxe porque fiquei sem pontuação que poderia usar. O exemplo comum de um contorno preto em torno do texto em branco pode ser alcançado com [WHITE][%?blacken]Outlined![%][GRAY] . (O exemplo usa GRAY como cor normal, mas você também pode usar [ ] para redefinir a cor para qualquer cor base foi configurada em um Layout ou no rótulo que a segura. Observe que [ ] também redefine o tamanho, o modo e, bem, tudo.)
Várias combinações de efeitos estão disponíveis usando o {VAR=ZOMBIE}urgh, brains...{VAR=ENDZOMBIE} sintaxe:
{VAR=FIRE} altera o seguinte texto para ter cores de alteração ardente. Você pode terminar com {VAR=ENDFIRE} .{VAR=SPUTTERINGFIRE} altera o seguinte texto para fazer com que a mudança de cores e redimensione como chamas. Você pode encerrá -lo com {VAR=ENDSPUTTERINGFIRE} .{VAR=BLIZZARD} altera o seguinte texto para vacilar no vento e usar cores geladas, branco a azul claro. Você pode terminar com {VAR=ENDBLIZZARD} .{VAR=SHIVERINGBLIZZARD} altera o seguinte texto para vacilar no vento e usar cores geladas, branco a azul claro, além de produzirá aleatoriamente os glifos "agitados" como se estivessem frios. Você pode terminar com {VAR=ENDSHIVERINGBLIZZARD} .{VAR=ELECTRIFY} altera o seguinte texto para ser uma cor roxa cinza opaca e faz com que os glifos se tornem amarelo claro e vibrem. Você pode encerrá -lo com {VAR=ENDELECTRIFY} .{VAR=ZOMBIE} altera o seguinte texto para "sálvia escura de azeitona" (uma cor verde-cinza opaca), faz com que os glifos girem para a esquerda e direita lenta e aleatoriamente, fazem os glifos caírem e voltarem aleatoriamente, e quando aparecem pela primeira vez, os glifos emergem da linha de base (como se estivessem fora de um grave). Você pode terminar com {VAR=ENDZOMBIE} . Eles são definidos em TypingConfig.initializeGlobalVars() e você pode definir suas próprias combinações exatamente da mesma maneira que são definidas. Por exemplo, FIRE é definido com
TypingConfig . GLOBAL_VARS . put ( "FIRE" , "{OCEAN=0.7;1.25;0.11;1.0;0.65}" );
TypingConfig . GLOBAL_VARS . put ( "ENDFIRE" , "{ENDOCEAN}" ); O efeito OCEAN não se importa com quais cores ele usa; Define apenas um padrão aproximado de como fazer a transição entre essas cores. Isso significa, contra -intuitivamente, FIRE é melhor implementado com OCEAN e não GRADIENT . O uso do nome de FIRE provavelmente é preferível ao OCEAN , portanto, o VAR global está aqui por esse motivo.
A capacidade de armazenar estados de formatação usando um rótulo permite uma montagem mais complexa de seqüências de marcação de várias fontes. Você pode chamar algo como font.storeState("spooky", "[/][darker gray][@?blacken]") para armazenar permanentemente esse estado de formatação (texto cinza mais escuro oblíquo com um contorno preto) em font e, em seguida, pode ser redefinido para esse estado apenas entrando [ spooky] (observe o espaço de abertura). Você também pode criar algum texto de inserção que armazena a formatação atual antes de escrever qualquer coisa e redefine a formatação de volta quando terminar de escrever. Isso usaria algo como "[(previous)][ ][BLUE][^][[citation needed][ previous]" - se essa string for inserida no meio de um bloco maior de texto, não alterará a formatação circundante, mas usará a superestration azul para o seu próprio texto (a imortal [citation needed] ) e não usará a formatação do bloco circundante para o seu próprio bloco para a formatação do bloco para o seu próprio bloco para o seu próprio bloco. Se você possui várias tags de estados com o mesmo rótulo, o valor associado a esse rótulo será alterado à medida que essas tags são encontradas. Você pode querer usar rótulos exclusivos para evitar alterar acidentalmente o valor de outra etiqueta, mas isso geralmente não é necessário.
A Textratypist faz uso pesado de sua nova classe Font , que é uma revisão completa do bitmapfont da libgdx que compartilha essencialmente nenhum código com seu ancestral. Uma fonte possui várias qualidades que oferecem mais poder do que o BitmapFont, principalmente derivadas de como ele armazena (e disponibiliza) as imagens do glifos como textureregions em um mapa. Não há nada estritamente impedindo que você adicione suas próprias imagens ao mapping de uma fonte, desde que tenham as informações necessárias para serem usadas como um glifo textual e, em seguida, colocando essas imagens com seu texto. Isso é usado para implementar emoji, como um exemplo, e pode ser usado para ícones personalizados e emoji.
O Textratypist suporta fontes de bitmap padrão e também fontes de campo a distância, usando SDF ou MSDF. TypingLabel ativará automaticamente o programa shader que o tipo de campo apropriado precisa (se precisar de um) e desabilitá -lo após a renderização. Você pode alterar esse comportamento chamando manualmente o método Font.enableShader(Batch) em sua fonte e alterando o lote de volta para o seu outro programa Shadercher de escolha com o método Batch.setShader() (geralmente, você apenas passa aqui para redefinir o shader). Observe que as fontes SDF e MSDF precisam ser informadas sobre as alterações no tamanho da tela, usando Font.resizeDistanceField() ou qualquer um dos métodos de vários outros lugares que chamam de resizeDistanceField() . Desde 1.0.0, você normalmente deseja usar a sobrecarga que leva uma Viewport ; Se você não tiver uma Viewport , não precisa dessa sobrecarga. A fonte de cada campo de distância que você está renderizando atualmente precisa ter seu campo de distância redimensionado quando a janela redimensionar, no ApplicationListener.resize() .
Existem várias configurações de fonte pré -configuradas nos KnownFonts ; A documentação para cada fonte de fonte diz que arquivos são necessários para usar essa fonte. Os antigos arquivos .fnt foram movidos para cá . Você pode ver visualizações e descrições de todas as fontes conhecidas aqui. Ter conhecidos não é necessário para muitas fontes desde a versão 1.0.0, porque as fontes .dat agora são feitas pela mesma ferramenta (fontwriter) e tendem a ser configuradas corretamente prontas para uso. A variedade de tipos de fontes não é incrível, mas deve ser um bom ponto de partida. Uma coisa legal a ser observada é o método KnownFonts.getStandardFamily() , que requer ter 16 fontes em seus ativos, mas, naturalmente, permite alternar entre qualquer uma dessas 16 fontes usando a sintaxe [@Medieval] (onde medieval é um dos nomes que sabe, neste caso "Kingthings Foundation").
As fontes aqui usam a extensão do arquivo .dat (o que significa apenas dados binários sem formato de arquivo específico). São versões compactadas de fontes .json maiores produzidas pelo Fontwriter. A compactação que eles usam é compatível com GWT, para que esses arquivos .dat possam ser usados em qualquer alvo de plataforma libgdx. Você ainda pode usar os arquivos .FNT mais antigos sem problemas, e alguns arquivos .fnt ainda são usados aqui (principalmente para fontes de pixel). Você também geralmente precisa de um .png com cada fonte, embora possa estar em um atlas.
Os arquivos de licença para cada fonte estão incluídos na mesma pasta, em knownFonts aqui. Todas as fontes fornecidas aqui foram verificadas para garantir que suas licenças permitam uso comercial sem taxas, e tudo. A maioria requer atribuição; Verifique as licenças para obter detalhes.
O conhecido FONTS inclui várias outras maneiras de configurar as instâncias de fonte existentes, adicionando uma textura aos glifos que eles conhecem. Isso inclui algumas texturas existentes de ícones e ... emoji!
Os ícones twemoji também estão presentes em um atlas de imagens de mais de 3000 32x32; KnownFonts.addEmoji() pode registrá -los com uma fonte para que a sintaxe [+name] mencionada acima possa desenhar emoji em linha. Da mesma forma, um atlas de ícones de mais de 4000 60x60 está presente no jogo-icons.net, e KnownFonts.addGameIcons() pode registrá-los com uma fonte. Twemoji e Game-icons.net atlas não podem ser registrados em uma fonte ao mesmo tempo; Não há espaço livre suficiente na parte do Unicode que eles possam usar com segurança. Uma maneira de contornar isso é usar o recurso FontFamily e adicionar uma fonte apenas para ícones ou apenas para emoji à família. Existe um método existente para isso; KnownFonts.getGameIconsFont() permite obter uma fonte que se destina apenas a exibir icons, com alguma cerimônia em torno de seu uso. [@Icons][+rooster][@] é um exemplo rápido de como você pode mudar para a fonte produzida pelo getGameIconsFont() , desenhe um ícone e alternar novamente.
Existem visualizações para Twemoji aqui, com o emoji char e o nome para procurar cada imagem. Da mesma forma, existem pré-visualizações para os ícones do Game-icons.net aqui, com o nome necessário para procurar cada imagem. Lembre-se de que, como as imagens Game-icons.net são brancas puras com transparência, você pode tonificar-lhes qualquer cor que desejar usar a sintaxe [RED] , [light dull green] ou [#0022EEFF] .
Os arquivos de licença para Twemoji e as imagens do jogo-icons.net estão incluídos em knownFonts , ao lado dos arquivos de licença para fontes. Embora a Twemoji tenha requisitos simples de atribuição, o Game-ICons requer atribuição a alguns colaboradores individuais; Veja o final deste documento para a lista, que você pode e deve copiar para dar crédito a todos.
Há também emoji de arte de linha do OpenMoji e versões coloridas do mesmo emoji. Estes podem ser mais adequados para os estilos de arte de certos projetos.
Você pode girar glifos individuais (se os desenhar individualmente) ou girar blocos inteiros de texto como um layout, usando uma sobrecarga opcional de Font.drawGlyph() ou Font.drawGlyphs() . Os efeitos personalizados para TypingLabel também podem alterar individualmente a rotação de qualquer glifo, bem como sua posição e escala em x e/ou y. Você pode girar um textralabel ou tipinglabel usando seus métodos setRotation() , e a rotação agora atuará corretamente para rótulos com fundos e/ou com diferentes configurações de alinhamento. A origem para rotações pode ser definida no rótulo e a etiqueta inteira girará em torno desse ponto de origem.
Você também pode, para algumas fontes, ter caracteres de desenho de caixa e elementos de bloco ser gerados automaticamente. Isso precisa de um caractere de bloco branco sólido (de qualquer tamanho, tipicamente 1x1) presente na fonte no ID 9608 (o índice de bloco completo unicode, 'u2588' ). Isso também permite uma melhor garantia de caracteres sublinhados e atingidos se conectando corretamente e sem manchas onde dois sublinhos ou hífens se sobrepõem. Font tenta ativar isso em alguns casos, ou pode ser definida com um parâmetro, mas se falhar, ele voltará ao uso do sublinhado para sublinhamento e hífens para striketrough. Todas as fontes nos KnownFonts são configuradas para usar um bloco sólido ou para evitá -lo especificamente, porque essa fonte se torna melhor sem ele. Observe que, se você criar uma Font a partir de um BitmapFont libgdx, isso padrão não tentando fazer glifos de grade, porque o bitmapfonts raramente possui um char de bloco sólido adequado.
Alguma configuração extra é possível para caracteres de desenho de caixas que são realmente usados para esse fim (não apenas sublinhe ou atacam). Você pode definir boxDrawingBreadth em uma Font como um multiplicador para tornar as linhas de desenho de caixa mais grossas ou mais finas, sem alterar a maneira como elas se conectam.
Vários recursos permitem configuração extra aqui. Você pode definir boldStrength para algum valor que não seja o padrão 1 se desejar mais ou menos espaço extra aplicado a partir do estilo em negrito. Você também pode definir obliqueStrength para alterar o ângulo da inclinação com o qual o texto oblíquo é desenhado. As cores para vários efeitos podem ser alteradas conforme necessário; font.PACKED_SHADOW_COLOR pode ser alterado para usar uma cor de sombra mais escura, mais clara, mais opaca ou mais transparente, por exemplo. font.PACKED_BLACK afeta o modo de contorno preto, e font.PACKED_WHITE afeta o contorno branco e os modos brilhantes. Existem modos semelhantes para alterar as cores de erro, aviso e nota sublinha. Todas essas configurações de cores se aplicam por instância da fonte, para que você possa ter dois objetos de fonte usando o mesmo tipo de letra, mas com cores diferentes configuradas.
A partir da versão 0.4.0, existem vários widgets que substituem seus colegas cenários2d.ui e trocam Label para TextraLabel , permitindo que você use a marcação neles. Os widgets são ImageTextraButton , TextraButton , TextraCheckBox , TextraDialog , TextraLabel , TextraListBox , TextraTooltip e TextraWindow , além de versões alternativas de cada um que usam um TypingLabel em vez de um TextraLabel e tenham Typing seus nomes.
Embora TextArea ainda não seja apoiada, uma contraparte para TextArea está planejada e ainda não funcionou. TextraLabel padrão é apoiar várias linhas e pode ser capaz de se destacar para algum uso. TypingLabel permite o rastreamento de entrada também, para que você possa usá -lo para fazer regiões selecionáveis de texto - continue lendo!
O rastreamento de entrada tem sido uma opção para TypingLabel e o código que o usa desde 0.7.0. Isso se expandiu em 0.7.4 para permitir que o texto em um TypingLabel seja seleção com label.setSelectable(true) . Você pode acessar o texto atualmente selecionado com label.getSelectedText() ou copiá-lo diretamente com label.copySelectedText() . Quando o usuário conclui um gesto de clique e arrastar sobre o tipinglabel (e é selecionado), um evento também é acionado; Você pode ouvir "*SELECTED" em um TypingListener e copiar texto assim que for selecionado ou apenas copiar quando alguma tecla for pressionada. Outros recursos úteis que usam o rastreamento de entrada incluem a tag {LINK} , que faz um período de texto um link clicável para um endereço da Internet, {TRIGGER} , que desencadeia um evento em clique e algumas outras tags que respondem ao mouse pairando ( {ATTENTION} , {HIGHLIGHT} e {STYLIST} ). Eles funcionam apenas para TypingLabel , não TextraLabel ; portanto, você pode usar um TypingLabel e chamar skipToTheEnd() para tratá -lo como um texto parado que acontece para responder à entrada do usuário e pode usar estilos animados como {RAINBOW} .
Você pode ler em um arquivo JSON de cenário normal2d.ui com uma variante na classe Skin da libgdx, FWSkin (ou uma das classes que a estende), e isso carregará estilos normais cenários2d.ui e estilos textratypist especializados. Os estilos especializados normalmente são diferentes, pois usam Font em vez do BitmapFont e estão todos aninhados na aula Styles aqui. Ter um estilo especializado significa que uma fonte pode ser reutilizada em mais lugares, sem ter que fazer muitas cópias de um bitmapfont (um por widget, às vezes) ... que era o caso antes do Textratypist 1.0.0. Normalmente, mudar de pele para fwskin é direto. Código como este antes:
Skin skin = new Skin ( Gdx . files . internal ( "my-skin.json" ));Mudaria para isso depois:
FWSkin skin = new FWSkin ( Gdx . files . internal ( "my-skin.json" )); Você também pode atribuir um FWSkin a uma variável Skin , e essa é a opção mais compatível, pois sua variável de pele será apenas uma Skin normal. Existem alguns métodos de conveniência no FWSkin para lidar com as fontes de campo de distância um pouco mais facilmente, portanto, usar FWSkin sempre que possível é uma boa idéia.
Por que se chama FWSkin , você se pergunta? Bem, ele pode carregar instâncias de fonte e bitmapfont a partir de arquivos .fnt (precisando de configuração de pele apenas para BitmapFont ) e pode fazer o mesmo para fontes JSON estruturadas, que aqui geralmente são criadas pelo FontWriter ou FW. O objetivo inicial do FWSkin era apenas para carregar os arquivos de fonte .fnt e .json/.dat igualmente bem, mas seu escopo se expandiu para incluir os novos estilos.
Se você está acostumado a usar o Stripe, há uma substituição que faz tanto o que FWSkin faz e o manuseio do Freetype que o Stripe faz. Esta é a dependência extra FreeTypist , disponível em um repositório separado. Ele permite a configuração do Freetype, possuindo um "com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator" em sua pele JSON, que é frequentemente produzida pelo compositor da pele. Você pode tomar peles normais produzidas pelo Skincomposer e compatíveis com o Stripe e usá -las com Freetypist.
Você pode obtê -lo via gradle, mas provavelmente é uma opção melhor apenas copiar nos dois arquivos desta pasta no Freetypist em seu próprio código. Independentemente de como você depende do Freetypist, ele precisa de uma dependência do Freetype (incluindo dependências apropriadas de "plataforma") e do Textratypist (atualmente 1.0.0). Quando os recursos são adicionados ao FWSkin e ao Textratypist em geral, o Freetypist também deve ser atualizado.
Você provavelmente quer conseguir Textratypist com Gradle! A dependência de um módulo principal de um projeto libgdx se parece:
implementation " com.github.tommyettinger:textratypist:1.1.0 "Isso pressupõe que você já dependa do libgdx; Textratypist depende da versão 1.12.1 ou superior. Um requisito para 1.11.0 foi adicionado no Textratypist 0.5.0 devido a algumas alterações de ruptura no código da dica de ferramenta no libgdx. O requisito para 1.12.1 foi adicionado em 1.0.0 porque algumas coisas provavelmente mudaram, mas 1.12.1 (ou as versões instantâneas subsequentes) devem ser muito fáceis de atualizar.
Se você usar o GWT, isso deve ser compatível. Precisa dessas dependências no módulo HTML:
implementation " com.github.tommyettinger:textratypist:1.1.0:sources "
implementation " com.github.tommyettinger:regexodus:0.1.16:sources "O GWT também precisa disso no arquivo gdxDefinition.gwt.xml (desde a versão 0.7.7):
< inherits name = " regexodus.regexodus " />
< inherits name = " com.github.tommyettinger.textratypist " /> Na versão 0.7.4 e anterior, você faria uma versão anterior de ambas as dependências (note, esta é uma versão antiga ):
// OLD VERSION
implementation " com.github.tommyettinger:textratypist:0.7.4:sources "
implementation " com.github.tommyettinger:regexodus:0.1.13:sources " e usaria esses herdos do GWT:
<!-- OLD VERSION -->
< inherits name = " regexodus " />
< inherits name = " textratypist " />Regexodus é a biblioteca de expressão regular compatível com GWT que usa para corresponder a alguns padrões complexos internamente. Além do próprio libgdx, o regexodus é a única dependência que este projeto possui. O GWT Herits foi alterado para Textratypist e Regexodus, porque acaba usando o pacote padrão pode causar problemas reais.
Há pelo menos uma versão na seção de lançamentos deste repositório, mas você ainda é incentivado a usar o Gradle para lidar com essa biblioteca e suas dependências.
Você também pode usar o Jitpack para obter uma confirmação atual, o que pode ser útil se houver um longo período entre os lançamentos. 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. Obrigado!
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.