BASICでのGoogleフォント

フォントファミリーを指定するだけで、ビットマップシートの代わりに本物のベクターテキストが手に入る。非同期読み込みに必要な待機と、ゲームを書き出した後に何が起こるか。

これは何のためにあるか#

クラシックなBASICはフォント画像からテキストを描画します。TextFontImage(text, image)で設定するグリフのシートです。これは機能しますし、この言語がずっとやってきたことでもあり、これからもそのまま残ります。しかしビットマップシートは拡大縮小に対応せず、見た目もそれなりです。

LoadGoogleFontはその代わりにファミリー名を指定します。

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

何も削除されていません。LoadFontTextFontImage、そしてビットマップの経路はすべて引き続き動作し、1つのプログラムの中でこれらを混在させることもできます。

待機は必須です#

フォントはファイルであり、呼び出しが返った後にそのファイルが届きます。到着前にPrintすると、最初の数フレームはフォールバックフォントで表示され、「コマンドが何もしなかった」ように見えます。

GoogleFontReadyが、待つべき対象です。

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

警告: かつて、この同じ落とし穴がアプリ自身のモジュールを捕まえたことがあります。フォントを宣言することは、それを読み込むことではありません。キャンバスは何かがそのファミリーを要求して初めてダウンロードを始め、その答えは1フレームか、もっと後になってから届きます。

ファミリーを閲覧する#

エンジンはファミリーの一覧を同梱しており、プログラムからそれを読み取れます。ゲーム内のフォントピッカーに必要なのはこれです。

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

この一覧はピッカーを埋めるためのものであり、制限ではありません。どのGoogleファミリーも、一覧にあるかどうかにかかわらず、LoadGoogleFontに名前を渡せば読み込めます。

書き出すと何が起こるか#

ゲームが動く場所何が起こるか
エディタそのファミリーが初めて指定された時点でGoogleから取得される。
ブラウザ書き出し同じだが、エクスポーターがバンドルできた場合はビルドからファイルが配信される。
ネイティブまたはBevyビルドファイルはビルドと一緒に運ばれていなければならない。ネットワークは存在しない。

エクスポーターはプログラムを読み取り、プレーンテキストで指定されたすべてのファミリーを見つけ出し、ダウンロードしてassets/fonts/<Family>.woff2に書き込みます。そうしてできたビルドはオフラインでも動作します。

警告: 実行時に計算されるファミリーは、プログラムを読んでも見つけられないため、バンドルできません。書き出しレポートはその旨を伝え、ビルドは既定のフォントにフォールバックします。書き出しを乗り越えなければならないものについては、LoadGoogleFont(names[i])ではなくLoadGoogleFont("Inter")と書いてください。

コマンド#

コマンド何をするか
LoadGoogleFont(family)ファミリーを読み込み、idを返す
LoadGoogleFont(fontID, family)同じだが、自分で選んだidを使う
GoogleFontReady(fontID)ファイルが使用可能になったら1
GoogleFontCount()一覧にあるファミリーの数
GoogleFontName(index)一覧から1つのファミリー名

その他はすべて既存のフォントの仕組みです。PrintのためのPrintFont(id)、TextオブジェクトのためのTextFontSet(text, id)、フォントを破棄するDeleteFont(id)

さらに進むには#