خطوط Google في BASIC

سمِّ عائلة خط واحصل على نص متجهي حقيقي بدلًا من صفيحة بت مان، مع الانتظار الذي يتطلبه التحميل غير المتزامن وما يحدث بمجرد تصدير اللعبة.

ما الغاية من هذا#

يرسم BASIC الكلاسيكي النص من صورة خط (font image): صفيحة رموز (glyphs) تضبطها بـTextFontImage(text, image). تعمل، وهذا ما فعلته اللهجة دائمًا، وتبقى في مكانها تمامًا. لكن صفيحة نقطية (bitmap) لا تتحجم، وتبدو كما هي فعلًا.

يسمِّي LoadGoogleFont عائلة بدلًا من ذلك:

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

لا شيء يُحذَف. تستمر LoadFont وTextFontImage ومسار البت مان جميعها في العمل، ويمكن لبرنامج أن يمزج بينها.

الانتظار ليس اختياريًا#

الخط ملف، ويصل الملف بعد أن يعود الاستدعاء. اطبع قبل وصوله وستخرج الإطارات الأولى بالخط الاحتياطي (fallback)، وهذا يُقرأ كأن «الأمر لم يفعل شيئًا».

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)الأمر نفسه، بمعرِّف تختاره أنت
GoogleFontReady(fontID)يساوي 1 بمجرد أن يصبح الملف قابلًا للاستخدام
GoogleFontCount()كم عائلة تعرضها القائمة
GoogleFontName(index)اسم عائلة واحدة من القائمة

كل شيء آخر هو آلية الخطوط الموجودة أصلًا: PrintFont(id) لـPrint، وTextFontSet(text, id) لكائن Text، وDeleteFont(id) لإسقاطه.

للمزيد#