دورة دروس SDL 2.0: الدرس 6 - تنزيل الخطوط باستخدام SDL_ttf

صورة

من مترجم:

هذا استمرار لسلسلة من ترجمات دروس 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 لتسجيل الأخطاء.

مع أخذ هذه المتطلبات في الاعتبار ، دعنا نكتب دالة أدفينيكست:

/**
*      
* @param message ,   
* @param fontFile ,   
* @param color ,     
* @param fontSize  
* @param renderer ,     
* @return SDL_Texture,     nullptr,  -   
*/
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;
        }       
        //       TTF_RenderText,
        //    
        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");
//   "TTF fonts are cool!"
//   RGBA
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 .

All Articles