BASIC에서의 구글 폰트
폰트 패밀리 이름을 지정하면 비트맵 시트 대신 진짜 벡터 텍스트를 얻습니다. 비동기 로딩이 요구하는 대기 시간과 게임을 내보낸 뒤에 일어나는 일까지.
이것은 무엇을 위한 것인가#
클래식 BASIC은 폰트 이미지로 텍스트를 그립니다: TextFontImage(text, image)로 설정하는 글리프 시트입니다. 이는 작동하고, 이 방언이 항상 해오던 방식이며, 정확히 그 자리에 그대로 남습니다. 하지만 비트맵 시트는 스케일이 되지 않고, 겉보기에도 그렇게 보입니다.
LoadGoogleFont는 대신 패밀리 이름을 지정합니다.
font = LoadGoogleFont("Inter")
PrintFont(font)
Print("Hello")
DO
Sync()
LOOP
아무것도 제거되지 않습니다. LoadFont, TextFontImage, 비트맵 경로 모두 계속 작동하며, 하나의 프로그램이 이들을 섞어 쓸 수 있습니다.
대기는 선택 사항이 아닙니다#
폰트는 파일이며, 그 파일은 호출이 반환된 뒤에 도착합니다. 파일이 도착하기 전에 그리면 처음 몇 프레임은 대체 폰트로 나오고, 이는 "명령이 아무 일도 하지 않았다"처럼 읽힙니다.
기다려야 할 대상은 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
이 목록은 선택기를 채우기 위한 것이지, 한계가 아닙니다. 목록에 있든 없든, 어떤 구글 패밀리든 LoadGoogleFont로 이름을 지정해 로드할 수 있습니다.
내보낼 때 일어나는 일#
| 게임이 실행되는 곳 | 일어나는 일 |
|---|---|
| 에디터 | 이름이 처음 지정될 때 구글에서 패밀리를 가져옵니다. |
| 브라우저 내보내기 | 동일하며, 익스포터가 번들링할 수 있었다면 파일이 빌드에서 제공됩니다. |
| 네이티브 또는 Bevy 빌드 | 파일이 빌드와 함께 이동해 있어야 합니다. 네트워크가 없습니다. |
익스포터는 프로그램을 읽어 일반 텍스트로 이름 지정된 모든 패밀리를 찾아내고, 다운로드해서 assets/fonts/<Family>.woff2에 씁니다. 그 빌드는 이후 오프라인에서도 작동합니다.
경고: 실행 시점에 계산되는 패밀리는 프로그램을 읽어서 찾아낼 수 없으므로 번들에 포함될 수 없습니다. 내보내기 보고서가 이를 알려주며, 빌드는 기본 폰트로 대체됩니다. 내보내기를 견뎌내야 하는 것이라면
LoadGoogleFont(names[i])가 아니라LoadGoogleFont("Inter")라고 쓰세요.
명령들#
| 명령 | 하는 일 |
|---|---|
LoadGoogleFont(family) | 패밀리를 로드하고 id를 돌려줌 |
LoadGoogleFont(fontID, family) | 동일하지만, 사용자가 고른 id로 |
GoogleFontReady(fontID) | 파일을 사용할 수 있게 되면 1 |
GoogleFontCount() | 목록이 제공하는 패밀리 수 |
GoogleFontName(index) | 목록에서 패밀리 이름 하나 |
나머지는 모두 기존의 폰트 기능입니다: Print를 위한 PrintFont(id), Text 오브젝트를 위한 TextFontSet(text, id), 폰트를 없애는 DeleteFont(id).