دروس SDL 2: الدرس 5 - القوام

مرحبًا بكم جميعًا وأهلاً بكم في الدرس الخامس حول 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; } 

الدرس السابق | الدرس التالي

Source: https://habr.com/ru/post/ar456798/


All Articles