BASIC 中的 Google 字型

指定一個字型家族名稱,就能得到真正的向量文字,而不是一張點陣圖字表,附帶非同步載入所需的等待方式,以及遊戲匯出後會發生什麼事。

這是做什麼用的#

經典 BASIC 是用字型圖片來畫文字的:一張你用 TextFontImage(text, image) 設定的字符表。它能用,也一直是這個方言的做法,而且會維持原樣。但一張點陣圖字表無法縮放,而且看起來就是它本身的樣子。

LoadGoogleFont 改用指定一個字型家族名稱的方式:

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

沒有任何東西被移除。LoadFontTextFontImage 和點陣圖字表路徑都依然能用,一個程式也可以同時混用它們。

等待不是可省略的步驟#

一個字型是一個檔案,這個檔案會在呼叫回傳之後才抵達。如果在它就緒之前就呼叫 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

警告: 這個陷阱曾經抓到過應用程式自己的模組。宣告一個字型不代表載入它:畫布只會在有東西真正要用到某個字型家族時才下載它,而答案會在一幀,或好幾幀之後才會抵達。

瀏覽字型家族清單#

引擎內建一份字型家族清單,程式可以讀取它,這正是遊戲內建字型選擇器所需要的:

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

這份清單只是用來填滿一個選擇器;它不是一個限制。任何 Google 字型家族,不論是否列在清單裡,都可以透過 LoadGoogleFont 依名稱載入。

匯出時會發生什麼事#

遊戲執行的地方會發生什麼
編輯器該字型家族會在第一次被指定名稱時,從 Google 抓取。
瀏覽器匯出版本相同做法,而且在匯出工具能夠打包字型的情況下,檔案會從組建裡直接提供。
原生或 Bevy 組建檔案必須已經隨組建一起帶過去。這裡沒有網路可用。

匯出工具會讀取你的程式,找出你以純文字指定的每一個字型家族名稱,下載它,並寫進 assets/fonts/<Family>.woff2。那個組建之後就能離線運作。

警告: 一個在執行期才計算出來的字型家族名稱,無法透過讀取程式碼被找到,所以也無法被打包進去。匯出報告會說明這一點,組建則會退回使用預設字型。任何需要在匯出後依然能用的地方,請寫 LoadGoogleFont("Inter"),而不是 LoadGoogleFont(names[i])

指令一覽#

指令作用
LoadGoogleFont(family)載入該字型家族,回傳一個 id
LoadGoogleFont(fontID, family)相同功能,但 id 由你自行指定
GoogleFontReady(fontID)檔案可用時回傳 1
GoogleFontCount()清單裡有多少個字型家族
GoogleFontName(index)清單中的一個字型家族名稱

其他一切都是既有的字型機制:Print 用的是 PrintFont(id),一個 Text 物件用的是 TextFontSet(text, id)DeleteFont(id) 用來丟棄它。

進一步閱讀#