BASIC 中的 Google 字型
指定一個字型家族名稱,就能得到真正的向量文字,而不是一張點陣圖字表,附帶非同步載入所需的等待方式,以及遊戲匯出後會發生什麼事。
這是做什麼用的#
經典 BASIC 是用字型圖片來畫文字的:一張你用
TextFontImage(text, image) 設定的字符表。它能用,也一直是這個方言的做法,而且會維持原樣。但一張點陣圖字表無法縮放,而且看起來就是它本身的樣子。
LoadGoogleFont 改用指定一個字型家族名稱的方式:
font = LoadGoogleFont("Inter")
PrintFont(font)
Print("Hello")
DO
Sync()
LOOP
沒有任何東西被移除。LoadFont、TextFontImage 和點陣圖字表路徑都依然能用,一個程式也可以同時混用它們。
等待不是可省略的步驟#
一個字型是一個檔案,這個檔案會在呼叫回傳之後才抵達。如果在它就緒之前就呼叫 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) 用來丟棄它。