BASIC-এ Google fonts

একটা ফন্ট পরিবারের নাম দিন আর একটা bitmap শিট-এর বদলে আসল ভেক্টর টেক্সট পান, asynchronous লোডিংয়ের জন্য যে অপেক্ষা দরকার এবং গেম এক্সপোর্ট হলে কী ঘটে, সহ।

এটা কীসের জন্য#

ক্লাসিক BASIC একটা font image থেকে টেক্সট আঁকে: TextFontImage(text, image) দিয়ে সেট করা glyph-এর একটা শিট। এটা কাজ করে, ডায়ালেক্টটা সবসময় এটাই করে এসেছে, আর এটা ঠিক যেখানে আছে সেখানেই থাকবে। কিন্তু একটা bitmap শিট স্কেল করে না, আর এটা যা তা-ই দেখায়।

LoadGoogleFont এর বদলে একটা পরিবারের নাম দেয়:

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

কিছুই সরানো হয়নি। LoadFont, TextFontImage এবং bitmap পথ সবগুলো কাজ করতে থাকে, আর একটা প্রোগ্রাম এগুলো মিশিয়েও নিতে পারে।

অপেক্ষাটা ঐচ্ছিক নয়#

একটা ফন্ট একটা ফাইল, আর ফাইলটা কলটা রিটার্ন করার পর আসে। এটা পৌঁছানোর আগে Print করলে প্রথম ফ্রেমগুলো 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 তখনই একটা পরিবার ডাউনলোড করে যখন কিছু এটা চায়, আর উত্তরটা এক ফ্রেম বা কয়েক ফ্রেম পরে আসে।

পরিবারগুলো ব্রাউজ করা#

ইঞ্জিন একটা পরিবারের তালিকা নিয়ে আসে, আর একটা প্রোগ্রাম সেটা পড়তে পারে, একটা গেমের ভেতরে একটা ফন্ট picker-এর যা দরকার তা এটাই:

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

তালিকাটা একটা picker ভরায়; এটা কোনো সীমা নয়। যেকোনো Google পরিবার LoadGoogleFont-এর মাধ্যমে নাম ধরে লোড হয়, তালিকাভুক্ত হোক বা না হোক।

এক্সপোর্ট করলে যা ঘটে#

গেমটা যেখানে চলেযা ঘটে
এডিটরপরিবারটা প্রথমবার নাম নেওয়ার সময় Google থেকে fetch করা হয়।
Browser exportএকই, আর exporter সেটা bundle করতে পারলে ফাইলটা build থেকে serve করা হয়।
Native বা Bevy buildফাইলটা build-এর সাথেই যেতে হতো। কোনো নেটওয়ার্ক নেই।

Exporter আপনার প্রোগ্রাম পড়ে, আপনি plain text-এ নাম দিয়েছেন এমন প্রতিটা পরিবার খুঁজে বের করে, সেটা ডাউনলোড করে এবং assets/fonts/<Family>.woff2-এ লিখে দেয়। তারপর সেই build অফলাইনে কাজ করে।

সতর্কতা: run time-এ গণনা করা একটা পরিবার প্রোগ্রাম পড়ে খুঁজে পাওয়া যায় না, তাই এটা bundle করা যায় না। export রিপোর্ট সেটাই বলে, আর build ডিফল্ট ফন্টে fallback করে। যা কিছুকে একটা export টিকে থাকতে হবে তার জন্য 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)

আরও এগিয়ে যান#

  • সম্পূর্ণ পরিবার, প্রতিটা প্যারামিটারসহ: Font কমান্ড
  • ডায়ালেক্টটা নিজে: BASIC ভাষা