من مترجم:
هذا استمرار لسلسلة من ترجمات دروس Twinklebear ، المتوفرة في الأصل هنا . الترجمة مجانية جزئيًا وقد تحتوي على تعديلات طفيفة أو إضافات من المترجم. ترجمة أول درسين - التأليفInvalidPointerوالثالث والرابع ل k1-801.قائمة الدروس:تنزيل الخطوط باستخدام SDL_ttf
في هذا البرنامج التعليمي ، سوف نتعلم كيفية عرض خطوط خطوط True Type باستخدام مكتبة الملحقات SDL_ttf. يتطابق تثبيت المكتبة مع تثبيت SDL_image في الدرس 3 ، ولكن بدلاً من "صورة" نكتب ببساطة "ttf" (يجب على مستخدمي Windows أيضًا نسخ ملف freetype dll). لذا قم بتنزيل SDL_ttf ، وألق نظرة على الوثائق وابدأ البرنامج التعليمي!أول شيء نحتاجه للعمل مع SDL_ttf هو خط ttf. باستخدام BitFontMaker ، قام المؤلف بإنشاء خط فظيع إلى حد ما يمكنك تنزيله من المستودعولكن إذا كان لديك بالفعل خط جميل خاص بك ، يمكنك استخدامه. يوفر هذا الخط أحرف ASCII البسيطة فقط ، لذلك إذا حاولت عرض أحرف غير ASCII ، فمن المحتمل ألا تنجح. ستتم كتابة كود هذا الدرس استنادًا إلى الدرس 5 ، كالمعتاد يمكنك تنزيله من Github . سيتم تغيير الصور والقطع المتحركة والرسومات في هذا البرنامج التعليمي.عرض النص
يوفر SDL_ttf عدة طرق لعرض الخطوط ذات السرعة والجودة المتنوعة ، بالإضافة إلى القدرة على عرض أحرف UTF8 و Unicode. توفر الوثائق نظرة عامة جيدة على طرق العرض المختلفة ، لذلك يجب عليك قراءة ومعرفة المزيد عنها ، ومتى وأي طريقة تريد استخدامها اعتمادًا على متطلبات الجودة والسرعة. في هذا البرنامج التعليمي ، سنستخدم TTF_RenderText_Blended ، حيث ليس لدينا حدود زمنية ونريد أن يكون نصنا جميلًا. تقبل وظائف عرض النص المختلفة لون RGB SDL_Color ، والذي يمكننا استخدامه لتحديد لون النص المراد رسمه.لسوء الحظ ، لا يمكن عرض SDL_ttf إلا على السطح ، لذلك عليك اتخاذ خطوة إضافية بعد عرض النص لإنشاء نسيج منه يمكننا رسمه باستخدام العارض. بالطبع ، ستظل بحاجة إلى تنزيل الخط ، الذي سنستخدمه ، والذي يتم باستخدام TTF_OpenFont ، حيث يمكنك أيضًا تحديد حجم الخط المطلوب.كتابة دالة مرافقة النص
لتسهيل حياتنا ، سننشئ وظيفة التقديم التي ستتلقى نصًا ، وملفًا يحتوي على خط TTF ، واللون ، والحجم المطلوب والعارض لتحميل النسيج النهائي. تقوم الوظيفة بفتح الخط وعرض النص وتحويله إلى نسيج وإرجاع النسيج. نظرًا لأن المشاكل يمكن أن تنشأ ، فأنت بحاجة إلى التحقق من كل استدعاء مكتبة للأخطاء والتعامل معها بشكل صحيح ، على سبيل المثال ، الموارد النظيفة وأخطاء السجل وإرجاع nullptr حتى نعلم أن شيئًا سيئًا قد حدث. يُبلغ SDL_ttf عن جميع أخطاءه من خلال SDL_GetError ، بحيث يمكنك الاستمرار في استخدام logSDLError لتسجيل الأخطاء.مع أخذ هذه المتطلبات في الاعتبار ، دعنا نكتب دالة أدفينيكست:
SDL_Texture* renderText(const std::string &message, const std::string &fontFile,
SDL_Color color, int fontSize, SDL_Renderer *renderer)
{
TTF_Font *font = TTF_OpenFont(fontFile.c_str(), fontSize);
if (font == nullptr){
logSDLError(std::cout, "TTF_OpenFont");
return nullptr;
}
SDL_Surface *surf = TTF_RenderText_Blended(font, message.c_str(), color);
if (surf == nullptr){
TTF_CloseFont(font);
logSDLError(std::cout, "TTF_RenderText");
return nullptr;
}
SDL_Texture *texture = SDL_CreateTextureFromSurface(renderer, surf);
if (texture == nullptr){
logSDLError(std::cout, "CreateTexture");
}
SDL_FreeSurface(surf);
TTF_CloseFont(font);
return texture;
}
تحذير الأداء
من المهم جدًا ملاحظة أنه في كل مرة نريد فيها عرض النص ، وإعادة فتح الخط وإغلاقه ، وهو ما يناسب حالتنا ، نظرًا لأننا نعرض النص مرة واحدة ، ولكن إذا أردنا عرض الكثير من النص و / أو كثيرًا ، فمن الأفضل الحفاظ على فتح الخط بقدر ما نحتاج. سيقبل إصدارنا من حرف النص لهذه الحالة الأكثر تكرارًا TTF_Font * بدلاً من اسم ملف الخط ولن يتم فتحه وإغلاقه ، حيث سيتم تعديل عمر ملف الخط بشكل منفصل.تهيئة SDL_ttf
كما هو الحال مع SDL ، نحتاج إلى تهيئة المكتبة قبل استخدامها. يتم ذلك باستخدام TTF_Init ، والتي ستُرجع 0 إذا نجحت. لتهيئة SDL_ttf ، فإننا نسمي هذه الوظيفة فقط بعد تهيئة SDL ونتحقق من القيمة المرتجعة للتأكد من أن كل شيء على ما يرام.if (TTF_Init() != 0){
logSDLError(std::cout, "TTF_Init");
SDL_Quit();
return 1;
}
باستخدام برنامج تقديم النص
من خلال وظيفة التقديم الملائمة ، يمكننا عرض النص في مكالمة واحدة بسيطة. في هذا البرنامج التعليمي ، اعرض النص "خطوط TTF رائعة!" أبيض ، بحجم 64 بالخط الذي نزلناه من قبل. ثم يمكننا طلب العرض والارتفاع بنفس الطريقة كما في أي نسيج آخر ، وحساب إحداثيات س / ص لرسم رسالة في وسط النافذة.const std::string resPath = getResourcePath("Lesson6");
SDL_Color color = { 255, 255, 255, 255 };
SDL_Texture *image = renderText("TTF fonts are cool!", resPath + "sample.ttf",
color, 64, renderer);
if (image == nullptr){
cleanup(renderer, window);
TTF_Quit();
SDL_Quit();
return 1;
}
int iW, iH;
SDL_QueryTexture(image, NULL, NULL, &iW, &iH);
int x = SCREEN_WIDTH / 2 - iW / 2;
int y = SCREEN_HEIGHT / 2 - iH / 2;
ارسم النص
في النهاية ، يمكننا رسم النسيج ، كما فعلنا من قبل قبل استخدام وظيفة أدفينكتتيكور.
SDL_RenderClear(renderer);
renderTexture(image, renderer, x, y);
SDL_RenderPresent(renderer);
إذا سار كل شيء وفقًا للخطة ، فسترى شيئًا مثل هذا:
نهاية الدرس 6
هذا كل ما تحتاج إلى معرفته لبدء استخدام SDL_ttf! تأكد من التحقق من الوثائق لمعرفة ما يمكن لهذه المكتبة. كالعادة ، إذا كان لديك مشاكل مع الدرس ، يمكنك الكتابة في التعليقات.أصبح المؤلف مشغولاً بمشاريع أخرى ولم يعد بإمكانه كتابة الدروس بعد الآن ، لذلك كان هذا هو الدرس الأخير من الدورة. يمكنك مشاهدة دروس Lazy Foo أو قراءة الأمثلة والوثائق من ويكي SDL .