Шрифты Google в 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

Предупреждение: та же ловушка однажды поймала собственные модули приложения. Объявить шрифт, это не то же самое, что его загрузить: canvas скачивает семейство только тогда, когда что-то его запрашивает, а ответ приходит кадром или несколькими позже.

Просмотр семейств#

Движок несёт список семейств, и программа может его прочитать, что нужно для собственного выбора шрифта внутри игры:

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

Список наполняет выбор шрифта, но не является ограничением: любое семейство Google загружается по имени через LoadGoogleFont, числится оно в списке или нет.

Что происходит при экспорте#

Где выполняется играЧто происходит
РедакторСемейство загружается с сервера Google при первом обращении по имени.
Экспорт в браузерТо же самое, а файл отдаётся из сборки, если экспортёр смог его встроить.
Native- или Bevy-сборкаФайл должен был отправиться вместе со сборкой. Сети нет.

Экспортёр читает вашу программу, находит каждое семейство, названное в открытом тексте, скачивает его и записывает в assets/fonts/<Family>.woff2. Такая сборка затем работает офлайн.

Предупреждение: семейство, вычисленное во время выполнения, невозможно найти при чтении программы, поэтому его нельзя встроить в сборку. Отчёт об экспорте сообщает об этом, и сборка откатывается на шрифт по умолчанию. Пишите LoadGoogleFont("Inter"), а не LoadGoogleFont(names[i]), для всего, что должно пережить экспорт.

Команды#

КомандаЧто она делает
LoadGoogleFont(family)Загружает семейство, возвращает id
LoadGoogleFont(fontID, family)То же самое, с id по вашему выбору
GoogleFontReady(fontID)Равна 1, когда файл готов к использованию
GoogleFontCount()Сколько семейств предлагает список
GoogleFontName(index)Одно имя семейства из списка

Всё остальное, это уже существующая шрифтовая машинерия: PrintFont(id) для Print, TextFontSet(text, id) для объекта Text, DeleteFont(id) для его удаления.

Что дальше#