ما هو عارض SDL؟
-
21-12-2019 - |
سؤال
لقد بدأت مع 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
ومكان لتخزين الإعدادات/السياق.
لذلك تقوم بإنشاء مجموعة من الموارد، وتعليقها من العارض؛وبعد ذلك عندما يصبح جاهزًا، يمكنك إخبار العارض بتجميع كل شيء معًا وإرسال النتائج إلى النافذة.