BASICでのGoogleフォント
フォントファミリーを指定するだけで、ビットマップシートの代わりに本物のベクターテキストが手に入る。非同期読み込みに必要な待機と、ゲームを書き出した後に何が起こるか。
これは何のためにあるか#
クラシックなBASICはフォント画像からテキストを描画します。TextFontImage(text, image)で設定するグリフのシートです。これは機能しますし、この言語がずっとやってきたことでもあり、これからもそのまま残ります。しかしビットマップシートは拡大縮小に対応せず、見た目もそれなりです。
LoadGoogleFontはその代わりにファミリー名を指定します。
font = LoadGoogleFont("Inter")
PrintFont(font)
Print("Hello")
DO
Sync()
LOOP
何も削除されていません。LoadFont、TextFontImage、そしてビットマップの経路はすべて引き続き動作し、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)。