مرحباً بالجميع ، هذا هو الدرس السادس في SDL 2 ، وقد جاء صغيراً ، لكن الأمر يستحق المتابعة. جميع الدروس
هنا .
في هذا الدرس سوف نوجه رسم البدائيين. لنبدأ ونرحب بكم في الدرس
أولاً ، دعنا نرى ماهية البدائية. بدائية الرسم هو أبسط كائن هندسي يتم عرضه على شاشة العرض: نقطة ، مقطع خط ، مستطيل ، قوس ، دائرة ، إلخ. في SDL 2 ، يمكننا فقط رسم نقاط ، مستطيلات ، وخطوط.
دعنا ننكب على الكود
#include <SDL2/SDL.h> #include <iostream> using namespace std; int SCREEN_WIDTH = 640; int SCREEN_HEIGHT = 480; SDL_Window *win = NULL; SDL_Renderer *ren = NULL;
لن أصف إعلان المتغيرات ، دعنا ننتقل.
bool init() { bool ok = true; if (SDL_Init(SDL_INIT_VIDEO) != 0) { cout << "Can't init SDL: " << SDL_GetError() << endl; } 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); if (ren == NULL) { cout << "Can't create renderer: " << SDL_GetError() << endl; ok = false; } return ok; }
في
التهيئة ، قم بتهيئة SDL 2 ، وقم بإنشاء نافذة وعرضها هنا أيضًا ، لا تترك.
أنا لا أكتب وظيفة
تحميل ، لأننا لسنا بحاجة لتحميل أي شيء.
في وظيفة
Quit ، نقوم ببساطة بإزالة النافذة ، وجعل SDL 2 غير مهيأ.
void quit() { SDL_DestroyWindow(win); win = NULL; SDL_DestroyRenderer(ren); ren = NULL; SDL_Quit; }
سيتم تخطي المكالمة إلى وظيفة
التهيئة والانتقال إلى الجزء الأكثر إثارة للاهتمام. لرسم مستطيل ، نحتاج إلى إنشاء كائن من النوع
SDL_Rect . هناك حاجة إلى الإحداثيات والأبعاد للرسم.
قليلاً حول
SDL_Rect : نوع البيانات هذا عبارة عن صفيف من 4 أرقام:
x و
y و
w و
h - بهذا الترتيب. بمعنى ، هذا الرمز:
SDL_Rect rect = {1، 1، 1، 1}؛ - صحيح تماما.
هذا يكمل نظرية
SDL_Rect ، دعنا نبدأ كتابة التعليمات البرمجية.
SDL_SetRenderDrawColor(ren, 0x00, 0x00, 0x00, 0x00); SDL_RenderClear(ren); SDL_SetRenderDrawColor(ren, 0xFF, 0xFF, 0xFF, 0xFF); SDL_Rect rect1 = {10, 10, 50, 50}; SDL_RenderFillRect(ren, &rect1);
قيل لنا هنا للطلاء أن يرسم باللون الأسود ويملأهم بالنافذة بأكملها. بعد ذلك قالوا للطلاء باللون الأبيض. بعد ذلك ، أنشأنا مستطيلًا ذو إحداثيات (10 ؛ 10) وأبعاد 50 × 50. الدالة
SDL_RenderFillRect توجه مستطيل.
رسم المخطط التفصيلي للمستطيل فقط لا يختلف كثيرًا.
SDL_Rect rect2 = {70, 10, 50, 50}; SDL_RenderDrawRect(ren, &rect2);
أنشأنا مستطيلًا وسميت الدالة
SDL_RenderDrawRect . إنها ترسم فقط الخطوط العريضة للمستطيل على الشاشة.
والخطوة التالية هي رسم خط.
SDL_RenderDrawLine(ren, 10, 70, 640 - 10, 70);
ليست هناك حاجة مستطيل لرسم خط. تقبل الدالة
SDL_RenderDrawLine قيم التجسيد وإحداثيات أربعة. هذه هي إحداثيات نقطة البداية ونقطة النهاية. قررت رسم خط أفقي بمسافة بادئة من الحواف بمقدار 10 بكسل.
نقاط الرسم لا تختلف تقريبًا عن خطوط الرسم. نحن ندعو وظيفة
SDL_RenderDrawPoint ونمر في تقديم وإحداثيات هذه النقطة. ولكن فقط لرسم نقطة ليست مثيرة للاهتمام ، دعنا نكتب للأفضل ، حيث من خلال 3 بكسل سوف نرسم النقاط.
for (int i = 10; i <= 640-10; i +=4 ) { SDL_RenderDrawPoint(ren, i, 90); }
لقد حصلنا على خط منقط أفقي للنقاط.
على هذا الرسم قد توقف. يبقى فقط تحديث الشاشة وضبط وقت الإيقاف المؤقت والخروج والعودة
0 .
SDL_RenderPresent(ren); SDL_Delay(5000); quit(); return 0; }
بهذا نختتم درسنا ، إليك الكود الكامل:
#include <SDL2/SDL.h> #include <iostream> using namespace std; int SCREEN_WIDTH = 640; int SCREEN_HEIGHT = 480; SDL_Window *win = NULL; SDL_Renderer *ren = NULL; bool init() { bool ok = true; if (SDL_Init(SDL_INIT_VIDEO) != 0) { cout << "Can't init SDL: " << SDL_GetError() << endl; } 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); if (ren == NULL) { cout << "Can't create renderer: " << SDL_GetError() << endl; ok = false; } return ok; } void quit() { SDL_DestroyWindow(win); win = NULL; SDL_DestroyRenderer(ren); ren = NULL; SDL_Quit; } int main (int arhc, char ** argv) { if (!init()) { quit(); system("pause"); return 1; } SDL_SetRenderDrawColor(ren, 0x00, 0x00, 0x00, 0x00); SDL_RenderClear(ren); SDL_SetRenderDrawColor(ren, 0xFF, 0xFF, 0xFF, 0xFF); SDL_Rect rect1 = {10, 10, 50, 50}; SDL_RenderFillRect(ren, &rect1); SDL_Rect rect2 = {70, 10, 50, 50}; SDL_RenderDrawRect(ren, &rect2); SDL_RenderDrawLine(ren, 10, 70, 640 - 10, 70); for (int i = 10; i <= 640-10; i +=4 ) { SDL_RenderDrawPoint(ren, i, 90); } SDL_RenderPresent(ren); SDL_Delay(5000); quit(); return 0; }
وأقول وداعا لك ، وداعا للجميع!
<< الدرس السابق || الدرس القادم
>>