Google Fonts no BASIC

Nomeie uma família de fontes e receba texto vetorial de verdade em vez de uma folha bitmap, com a espera que o carregamento assíncrono exige e o que acontece assim que o jogo é exportado.

Para que serve isso#

O BASIC clássico desenha texto a partir de uma imagem de fonte: uma folha de glifos que você define com TextFontImage(text, image). Funciona, é o que o dialeto sempre fez, e continua exatamente onde está. Mas uma folha bitmap não escala, e parece o que é.

LoadGoogleFont nomeia uma família em vez disso:

font = LoadGoogleFont("Inter")
PrintFont(font)
Print("Hello")
DO
  Sync()
LOOP

Nada é removido. LoadFont, TextFontImage e o caminho bitmap continuam funcionando, e um programa pode misturar os dois.

A espera não é opcional#

Uma fonte é um arquivo, e o arquivo chega depois que a chamada retorna. Imprimir antes de ele chegar faz os primeiros quadros saírem na fonte de fallback, o que se lê como "o comando não fez nada".

GoogleFontReady é o que você espera:

font = LoadGoogleFont("Inter")
ready = 0
DO
  IF ready = 0
    IF GoogleFontReady(font) = 1
      PrintFont(font)
      ready = 1
    ENDIF
  ENDIF
  Print("Hello")
  Sync()
LOOP

Aviso: a mesma armadilha já pegou os próprios módulos do aplicativo uma vez. Declarar uma fonte não é carregá-la: um canvas só baixa uma família quando algo a pede, e a resposta chega um quadro ou vários depois.

O motor traz uma lista de famílias, e um programa pode lê-la, o que é o que um seletor de fonte dentro de um jogo precisa:

count = GoogleFontCount()
FOR i = 0 TO count - 1
  Print(GoogleFontName(i))
NEXT i

A lista alimenta um seletor; ela não é um limite. Qualquer família do Google carrega pelo nome através de LoadGoogleFont, listada ou não.

O que acontece quando você exporta#

Onde o jogo rodaO que acontece
O editorA família é buscada do Google na primeira vez que é nomeada.
Exportação para navegadorO mesmo, e o arquivo é servido a partir do build quando o exportador conseguiu empacotá-lo.
Build nativo ou BevyO arquivo precisa ter viajado junto com o build. Não há rede.

O exportador lê o seu programa, encontra toda família que você nomeou em texto puro, baixa e a grava em assets/fonts/<Family>.woff2. Esse build então funciona offline.

Aviso: uma família calculada em tempo de execução não pode ser encontrada lendo o programa, então não pode ser empacotada. O relatório de exportação avisa isso, e o build recorre à fonte padrão. Escreva LoadGoogleFont("Inter"), não LoadGoogleFont(names[i]), para qualquer coisa que precise sobreviver a uma exportação.

Os comandos#

ComandoO que faz
LoadGoogleFont(family)Carrega a família, devolve um id
LoadGoogleFont(fontID, family)O mesmo, com um id que você escolhe
GoogleFontReady(fontID)1 assim que o arquivo está utilizável
GoogleFontCount()Quantas famílias a lista oferece
GoogleFontName(index)Um nome de família da lista

Todo o resto é o mecanismo de fonte já existente: PrintFont(id) para Print, TextFontSet(text, id) para um objeto Text, DeleteFont(id) para descartá-la.

Indo além#