Google Fonts in BASIC

Nennen Sie eine Schriftfamilie und bekommen Sie echten Vektortext statt eines Bitmap-Sheets, mit der Wartezeit, die asynchrones Laden erfordert, und dem, was beim Export des Spiels passiert.

Wofür das gut ist#

Klassisches BASIC zeichnet Text aus einem Font-Image: einem Zeichensatz-Sheet, das Sie mit TextFontImage(text, image) setzen. Es funktioniert, es ist das, was der Dialekt schon immer getan hat, und es bleibt genau, wo es ist. Aber ein Bitmap-Sheet skaliert nicht, und es sieht aus wie das, was es ist.

LoadGoogleFont benennt stattdessen eine Familie:

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

Nichts wird entfernt. LoadFont, TextFontImage und der Bitmap-Pfad funktionieren alle weiter, und ein Programm kann sie mischen.

Das Warten ist nicht optional#

Eine Schrift ist eine Datei, und die Datei kommt an, nachdem der Aufruf zurückgekehrt ist. Zeichnen Sie, bevor sie ankommt, und die ersten Frames erscheinen in der Fallback-Schrift, was sich liest wie „der Befehl hat nichts getan".

Auf GoogleFontReady warten Sie:

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

Warnung: Dieselbe Falle hat einst die eigenen Module der App erwischt. Eine Schrift zu deklarieren heißt nicht, sie zu laden: Ein Canvas lädt eine Familie erst herunter, wenn etwas danach fragt, und die Antwort kommt einen oder mehrere Frames später an.

Die Familien durchstöbern#

Die Engine liefert eine Liste von Familien mit, und ein Programm kann sie lesen, das ist es, was ein Font-Picker in einem Spiel braucht:

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

Die Liste befüllt einen Picker; sie ist keine Begrenzung. Jede Google-Familie lädt per Namen über LoadGoogleFont, gelistet oder nicht.

Was beim Export passiert#

Wo das Spiel läuftWas passiert
Der EditorDie Familie wird beim ersten Nennen von Google geholt.
Browser-ExportGenauso, und die Datei wird aus dem Build ausgeliefert, wenn der Exporter sie bündeln konnte.
Native- oder Bevy-BuildDie Datei muss mit dem Build gereist sein. Es gibt kein Netzwerk.

Der Exporter liest Ihr Programm, findet jede Familie, die Sie im Klartext genannt haben, lädt sie herunter und schreibt sie nach assets/fonts/<Family>.woff2. Dieser Build funktioniert dann offline.

Warnung: Eine Familie, die zur Laufzeit berechnet wird, kann durch Lesen des Programms nicht gefunden werden, sie kann also nicht gebündelt werden. Der Exportbericht sagt das, und der Build fällt auf die Standardschrift zurück. Schreiben Sie LoadGoogleFont("Inter"), nicht LoadGoogleFont(names[i]), für alles, was einen Export überleben muss.

Die Befehle#

BefehlWas er tut
LoadGoogleFont(family)Lädt die Familie, gibt eine id zurück
LoadGoogleFont(fontID, family)Dasselbe, mit einer id Ihrer Wahl
GoogleFontReady(fontID)1, sobald die Datei nutzbar ist
GoogleFontCount()Wie viele Familien die Liste anbietet
GoogleFontName(index)Ein Familienname aus der Liste

Alles andere ist die bestehende Font-Maschinerie: PrintFont(id) für Print, TextFontSet(text, id) für ein Text-Objekt, DeleteFont(id), um sie zu verwerfen.

Weiterführend#