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