سؤال

لقد بدأت مع SDL2 وأواجه بعض المشاكل في محاولة فهم ما هو SDL_Renderer.

ما هذا؟ماذا تعمل، أو ماذا تفعل؟ما الفرق بين SDL_Renderer وSDL_Window وSDL_Surface وSDL_Texture وكيفية ارتباطهم؟

واجهت مشكلات مع هذا عند محاولة فهم هذا الرمز التمهيدي:

#include <iostream>
#include <SDL2/SDL.h>

int main()
{
    /* Starting SDL */
    if (SDL_Init(SDL_INIT_EVERYTHING) != 0) {
        std::cout << "SDL_Init Error: " << SDL_GetError() << std::endl;
        return 1;
    }

    /* Create a Window */
    SDL_Window *window = SDL_CreateWindow("Hello World!", 100, 100, 640, 480, SDL_WINDOW_SHOWN);
    if (window == nullptr) {
        std::cout << "SDL_CreateWindow Error: " << SDL_GetError() << std::endl;
        return 1;
    }

    /* Create a Render */
    SDL_Renderer *render = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
    if (render == nullptr) {
        std::cout << "SDL_CreateRenderer Error: " << SDL_GetError() << std::endl;
        return 1;
    }

    /* Load bitmap image */
    SDL_Surface *bmp = SDL_LoadBMP("./Tutorial/res/Lesson1/hello.bmp");
    if (bmp == nullptr) {
        std::cout << "SDL_LoadBMP Error: " << SDL_GetError() << std::endl;
        return 1;
    }

    /* Upload surface to render, and then, free the surface */
    SDL_Texture *texture = SDL_CreateTextureFromSurface(render, bmp);
    SDL_FreeSurface(bmp);
    if (texture == nullptr){
        std::cout << "SDL_CreateTextureFromSurface Error: " << SDL_GetError() << std::endl;
        return 1;
    }

    /* Draw the render on window */
    SDL_RenderClear(render); // Fill render with color
    SDL_RenderCopy(render, texture, NULL, NULL); // Copy the texture into render
    SDL_RenderPresent(render); // Show render on window

    /* Wait 2 seconds */
    SDL_Delay(5000);

    /* Free all objects*/
    SDL_DestroyTexture(texture);
    SDL_DestroyRenderer(render);
    SDL_DestroyWindow(window);

    /* Quit program */
    SDL_Quit();
    return 0;
}

كنت أستخدم البرنامج التعليمي Twinklebear (مقترح على SDL Wiki) ونظرت أيضًا في وثائق SDL Wiki وبعض الكتب.لكن كلهم ​​يفترضون أنني أعرف هذه التعريفات.

هل كانت مفيدة؟

المحلول

SDL_Window

SDL_Window هي البنية التي تحتوي على جميع المعلومات حول النافذة نفسها:الحجم والموضع وملء الشاشة والحدود وما إلى ذلك.


SDL_Renderer

SDL_Renderer هو الهيكل الذي يتعامل مع جميع التقديم.إنه مرتبط بـ أ SDL_Window لذلك لا يمكن تقديمه إلا ضمن ذلك SDL_Window.كما أنه يتتبع الإعدادات المتعلقة بالعرض.هناك العديد من الوظائف الهامة المرتبطة SDL_Renderer

  • SDL_SetRenderDrawColor(renderer, r, g, b, a);
    يؤدي هذا إلى تعيين اللون الذي تقوم بمسح الشاشة عليه (انظر أدناه)

  • SDL_RenderClear(renderer);
    يؤدي هذا إلى مسح هدف العرض باستخدام لون الرسم المعين أعلاه

  • SDL_RenderCopy(
    ربما تكون هذه هي الوظيفة التي ستستخدمها كثيرًا، فهي تُستخدم لعرض ملف SDL_Texture ولها المعلمات التالية :

    • SDL_Renderer* renderer,
      العارض الذي تريد استخدامه للعرض.
    • SDL_Texture* texture,
      الملمس الذي تريد تقديمه.
    • const SDL_Rect* srcrect, جزء النسيج الذي تريد عرضه، NULL إذا كنت تريد عرض النسيج بأكمله
    • const SDL_Rect* dstrect)
      المكان الذي تريد عرض النسيج فيه في النافذة.إذا كان العرض والارتفاع هذا SDL_Rect أصغر أو أكبر من أبعاد الملمس نفسه، سيتم تمديد الملمس وفقًا لذلك SDL_Rect
  • SDL_RenderPresent(renderer);
    تقوم وظائف SDL_Render* الأخرى بالرسم إلى هدف مخفي.ستأخذ هذه الوظيفة كل ذلك وترسمه في النافذة المرتبطة بالعارض.

SDL_Textures وSDL_Surface

ال SDL_Renderer يجعل SDL_Texture, ، الذي يخزن معلومات البكسل لعنصر واحد.إنها النسخة الجديدة من SDL_Surface وهو نفس الشيء إلى حد كبير.الفرق هو في الغالب أن SDL_Surface ما هو الا struct تحتوي على معلومات البكسل، بينما SDL_Texture هو تمثيل فعال ومخصص لبرنامج التشغيل لبيانات البكسل.

يمكنك تحويل SDL_Surface* إلى SDL_Texture باستخدام

SDL_Texture* SDL_CreateTextureFromSurface(SDL_Renderer* renderer,
                                          SDL_Surface*  surface)

بعد ذلك، يجب تحرير SDL_Surface باستخدام

SDL_FreeSurface( SDL_Surface* surface )

هناك فرق مهم آخر هو ذلك SDL_Surface يستخدم عرض البرنامج (عبر وحدة المعالجة المركزية) بينما SDL_Texture يستخدم عرض الأجهزة (عبر GPU).


SDL_Rect

أبسط بنية في SDL.يحتوي على أربعة شورتات فقط. x, y الذي يشغل المنصب و w, h الذي يحمل العرض والارتفاع.

من المهم أن نلاحظ ذلك 0, 0 هي الزاوية العلوية اليسرى في SDL.لذلك أعلى y-القيمة تعني أقل، وسيكون للزاوية اليمنى السفلية الإحداثيات x + w, y + h


يمكنك قراءة المزيد عن SDL2 على موقعي مدونة.

نصائح أخرى

افكر في SDL_Window كما بكسل المادية، و SDL_Renderer ومكان لتخزين الإعدادات/السياق.

لذلك تقوم بإنشاء مجموعة من الموارد، وتعليقها من العارض؛وبعد ذلك عندما يصبح جاهزًا، يمكنك إخبار العارض بتجميع كل شيء معًا وإرسال النتائج إلى النافذة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top