مرحبًا بكم جميعًا وأهلاً بكم في الدرس الخامس حول SDL 2 ، والذي سنقوم بتحليل القوام ، وتبسيط عمل الكمبيوتر. يمكنك العثور على جميع الدروس باللغة الإنجليزية 
هنا .
في الإصدار الثاني من SDL ، هناك فرصة جيدة جدًا لإنشاء القوام وعرضها. تجسيد الأجهزة أسرع بكثير من رسم الأسطح في نافذة.
تحتوي المواد على نوع البيانات الخاص بها - 
SDL_Texture . عند العمل باستخدام مواد ، نحتاج إلى تقديم للتقديم. الآن سنعلن كل هذا.
#include <SDL2/SDL.h> #include <SDL2/SDL_image.h> #include <iostream> using namespace std; int SCREEN_WIDTH = 640; int SCREEN_HEIGHT = 480; SDL_Window *win = NULL; SDL_Renderer *ren = NULL; SDL_Texture *flower = NULL; 
هنا أعلنا النافذة ، ونجعل هذه الزهرة. 

قمنا أيضًا بتوصيل المكتبات وتعيين أحجام النوافذ.
يجب أيضًا تغيير وظيفة 
التهيئة .
  bool ok = true; if (SDL_Init(SDL_INIT_VIDEO) != 0) { cout << "Can't init: " << SDL_GetError() << endl; ok = false; } win = SDL_CreateWindow("", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN); if (win == NULL) { cout << "Can't create window: " << SDL_GetError() << endl; ok = false; } 
أولاً ، قم بإنشاء متغير 
موافق ، حتى لا تنهي الوظيفة فورًا ، ولكن لإيجاد كل الأخطاء أثناء التهيئة. بعد ذلك ، قم بتهيئة SDL وإنشاء نافذة بطريقة معروفة.
حان الوقت لاعلان تقديم.
  ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); if (ren == NULL) { cout << "Can't create renderer: " << SDL_GetError() << endl; ok = false; } SDL_SetRenderDrawColor(ren, 0xFF, 0xFF, 0xFF, 0xFF); 
يتم التصريح عن 
التجسيد بواسطة دالة 
SDL_CreateRenderer . يستغرق 3 قيم: نافذة سيتم استخدام هذا التجسيد لها ، مؤشر برنامج التشغيل (أو -1 إذا كنا نريد العثور على أول واحد مناسب) والأعلام. لقد استخدمت الأعلام 
SDL_RENDERER_ACCELERATED و 
SDL_RENDERER_PRESENTVSYNC . هنا قائمة بجميع الأعلام:
الأعلامSDL_RENDERER_SOFTWARE - احتياطي لـ ؛
SDL_RENDERER_ACCELERATED - استخدام تسريع الأجهزة ؛
SDL_RENDERER_PRESENTVSYNC - التزامن الرأسي ؛
SDL_RENDERER_TARGETTEXTURE - دعم لتقديم إلى الملمس.
 بعد ذلك ، نستخدم دالة 
SDL_SetRenderDrawColor ، التي تحدد اللون 
للرسمات الأولية.
بعد ذلك ، تهيئة 
IMG والعودة 
موافق .
  int flags = IMG_INIT_PNG; if (!(IMG_Init(flags) & flags)) { cout << "Can't init image: " << IMG_GetError() << endl; ok = false; } return ok; } 
الآن نكتب وظيفة 
الحمل .
 bool load() { bool ok = true; SDL_Surface * temp_surf = NULL; temp_surf = IMG_Load("flower.png"); if (temp_surf == NULL) { cout << "Can't load image: " << IMG_GetError() << endl; ok = false; } 
هنا أنشأنا أيضا متغير 
موافق ، لنفس الاحتياجات. قاموا بإنشاء سطح مؤقت وتحميل الصور زهرة في ذلك.
التالي نحتاج إلى جعل نسيج من السطح.
  flower = SDL_CreateTextureFromSurface(ren, temp_surf); if (flower == NULL) { cout << "Can't create texture from surface: " << SDL_GetError() << endl; ok = false; } 
سوف 
تساعدنا الوظيفة 
SDL_CreateTextureFromSurface في إنشاء النسيج. يأخذ على تقديم والقيم السطحية. تقوم بإرجاع مثيل فئة 
SDL_Texture .
لكي لا تسد الذاكرة ، نحتاج إلى تنظيف السطح المؤقت. بعد ذلك ، 
عد جيدًا ووظيفة جاهزة.
لقد اتخذت الدالة 
Quit بعض الإجراءات الأخرى.
 void quit() { SDL_DestroyWindow(win); win = NULL; SDL_DestroyRenderer(ren); ren = NULL; SDL_DestroyTexture(flower); flower = NULL; SDL_Quit(); IMG_Quit(); } 
هنا قمنا بإزالة النافذة ، وجعلها ، والملمس وترك 
SDL و 
IMG . أنا أيضا تعيين جميع الكائنات المحذوفة إلى 
NULL لتنظيف ذاكرة أفضل.
نبدأ في كتابة الوظيفة 
الرئيسية .
 int main (int argc, char ** argv) { if (!init()) { quit(); return 1; } if (!load()) { quit(); return 1; } 
لقد كتبنا التهيئة والتحميل ، ونحن لا نتوقف هنا.
والخطوة التالية هي خلق 2 المتغيرات.
  bool run = true; SDL_Event e; 
سيكون لهذا البرنامج دورة رئيسية لتحديث الذاكرة ، لذلك دعونا نبدأ في إلغاء تسجيلها.
 while (run) { while(SDL_PollEvent(&e) != 0) { if (e.type == SDL_QUIT) { run = false; } } 
معالجة الحدث من الضغط على الصليب وهذا كل شيء.
حان الوقت للرسم. عند استخدام القوام والتقديم ، يتم استخدام وظائف مختلفة للتقديم من تلك التي نعرفها. لمسح شاشة القوام المرسومة ، يتم 
استخدام وظيفة 
SDL_RenderClear . يرسم الشاشة بالألوان التي حددناها بواسطة وظيفة 
SDL_SetRenderDrawColor . يتم 
استخدام وظيفة SDL_RenderCopy لتقديم النسيج ، ويتم 
استخدام SDL_RenderPresent لتحديث الشاشة. سنكتبها الآن.
  SDL_RenderClear(ren); SDL_RenderCopy(ren, flower, NULL, NULL); SDL_RenderPresent(ren); } 
سنقوم 
بتحليل وظيفة 
SDL_RenderCopy فقط. يستغرق 4 معاني. الأول عبارة عن تجسيد ، والثاني عبارة عن نسيج ، والثالث عبارة عن مستطيل نرغب في قطع منطقته للتقديم ، أما الرابع فهو مستطيل تستخدم إحداثياته للتقديم ، والعرض والارتفاع لتغيير حجم النسيج.
بعد ذلك ، 
قم باستدعاء وظيفة " 
إنهاء" وإرجاع 
0 .
  quit(); return 0; } 
على هذا سأنتهي من الدرس ، إذا لم يكن هناك شيء واضح - اكتب ، ولكن أقول وداعًا للجميع ، إلى اللقاء!
بالمناسبة ، إليك الرمز الكامل:
 #include <SDL2/SDL.h> #include <SDL2/SDL_image.h> #include <iostream> using namespace std; int SCREEN_WIDTH = 640; int SCREEN_HEIGHT = 480; SDL_Window *win = NULL; SDL_Renderer *ren = NULL; SDL_Texture *flower = NULL; bool init() { bool ok = true; if (SDL_Init(SDL_INIT_VIDEO) != 0) { cout << "Can't init: " << SDL_GetError() << endl; ok = false; } win = SDL_CreateWindow("", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN); if (win == NULL) { cout << "Can't create window: " << SDL_GetError() << endl; ok = false; } ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); if (ren == NULL) { cout << "Can't create renderer: " << SDL_GetError() << endl; ok = false; } SDL_SetRenderDrawColor(ren, 0xFF, 0xFF, 0xFF, 0xFF); int flags = IMG_INIT_PNG; if (!(IMG_Init(flags) & flags)) { cout << "Can't init image: " << IMG_GetError() << endl; ok = false; } return ok; } bool load() { bool ok = true; SDL_Surface * temp_surf = NULL; temp_surf = IMG_Load("flower.png"); if (temp_surf == NULL) { cout << "Can't load image: " << IMG_GetError() << endl; ok = false; } flower = SDL_CreateTextureFromSurface(ren, temp_surf); if (flower == NULL) { cout << "Can't create texture from surface: " << SDL_GetError() << endl; ok = false; } SDL_FreeSurface(temp_surf); return ok; } void quit() { SDL_DestroyWindow(win); win = NULL; SDL_DestroyRenderer(ren); ren = NULL; SDL_DestroyTexture(flower); flower = NULL; SDL_Quit(); IMG_Quit(); } int main (int argc, char ** argv) { if (!init()) { quit(); return 1; } if (!load()) { quit(); return 1; } bool run = true; SDL_Event e; while (run) { while(SDL_PollEvent(&e) != 0) { if (e.type == SDL_QUIT) { run = false; } } SDL_RenderClear(ren); SDL_RenderCopy(ren, flower, NULL, NULL); SDL_RenderPresent(ren); } quit(); return 0; } 
← الدرس السابق | الدرس التالي 
→