السلام عليكم .
كما نعرف يمكن استخدام Win32 API لهذا الغرض , ولكن يقولون أنها صعبة ولا تسمح بنقل اللعبة لتعمل على بيئة اللينوكس مثلا .
وكما نعرف يمكن استخدام المكتبة GLUT لهذا الغرض ولكن يقولون انها سهلة جدا لدرجة انك تفقد السيطرة على برنامجك .. والLOOP فيها عبيط او يستعبط .
قالوا لماذا لا نوجد البديل ..
ظهرت بضع من المكتبات ( من 3 الى 9 مكتبات ) هي عبارة عن FrameWork ( اطار ) للOpenGL ..
تسمح للمطورين بربط OpenGL بالنافذة .. باستقبال المدخلات من الكيبورد او الماوس ..الخ .
من هذه المكتبات SDL .
لماذا SDL ؟
حقيقة لا اعرف الجواب .. لكن سأتكلم عما اشعر به .
هي مكتبة اكثر صلابة .. اكثر انتشارا .. متطورة ,,
هي كلمات عامة لكن هناك امور اكثر تفصيلا ومنها :
- تمكنك من بناء العاب ثنائية الابعاد بدون استخدام OpenGL .
- توفر عدد من المكتبات التيي تعد من ذهب .. مثل مكتبات الصور / الشبكات / الاصوات / الخطوط / وهي تأتي منفصلة عن المكتبة الام SDL .
على العموم .. شاهد هذه الروابط ,
مثال عمل animation في SDL
TUTORIALS
ما نريده الان هو ربط OpenGL بالنظام عن طريق ال SDL .
الخطوات :
1 - سأفرض أنك تملك المكتبة وقد قمت بتثبيتها عندك وقمت بعمل برامج تطبيقية عليها ..
( ما لي نفس أشرح شيء سهل وبسيط ) ,
ولكن هناك أمور ممكن تحتاجها ,,
اذا كنت تعمل على الفيجوال سي .. فتحتاج خطوات اضافية :
1 - أنشئ مشروع جديد من نوع Console .
2- Alt + F7
4- انظر الصورتين وطبق ما تراه .
Resized to 90% (was 721 x 281) - Click image to enlarge
الان ألصق هذا الكود .
#include <windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <SDL/SDL.h>
# pragma comment (lib, "opengl32.lib") /* link with Microsoft OpenGL lib */
# pragma comment (lib, "glu32.lib") /* link with Microsoft OpenGL Utility lib */
# pragma comment (lib, "sdl.lib")
# pragma comment (lib, "sdlmain.lib")
int main( int argc, char* argv[] )
{
SDL_Init(SDL_INIT_VIDEO);
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5); //Use at least 5 bits of Red
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5); //Use at least 5 bits of Green
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5); //Use at least 5 bits of Blue
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16); //Use at least 16 bits for the depth buffer
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); //Enable double buffering
SDL_SetVideoMode(640, 480, 16, SDL_OPENGL );
glViewport(0,0,640,480);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0f, 640, 480, 0.0f, -1.0f, 1.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glDisable(GL_DEPTH_BUFFER_BIT);
SDL_Event event;
while(1)
{
if(SDL_PollEvent(&event))
{
switch (event.type)
{
case SDL_QUIT:
SDL_Quit();
exit(0); ////
break;
}
}
// draw
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0,0,0);
glRectf(0,0,100,100);
glVertex2f(100,100);
glEnd();
SDL_GL_SwapBuffers();
}
return 0;
}
الكود واضح ..
طبعا تستدعي الملف sdl.h من المكان اللي انت وضعته فيه .
انا قمت بانشاء مجلد اسمه sdl ولصقت فيه جميع ملفات sdl الرأسية .. ونسخت هذا المجلد ووضعته في مجلد include الموجود في مسار الفيجوال سي ,,
و تستطيع تطبيق الكود على اكثر من مترجم فالامر بسيط ..( خاصة مترجم Visual cpp 6 تستطيع ترجمت الكود بنفس الطريقة التي شرحتها في الاعلى ) .
اذا اردت المزيد من الخيارات مثل :
المزيد عن الevent مثل :
هل النافذة مفعلة .. هل تم تغيير ابعاد النافذة .. الخ .
فانه بامكانك ذلك ..
وايضا بامكانك تجعل النافذة full screen .
وايضا بامكانك الاستفادة من خدمة تقدمها مكتبة SDL وهي تحميل صور BMP واستخراج الkey Color ,,
بالتالي تستخدمه مع الاكساء في OpenGL .
هذه المكتبة ممتازة و تقدم عدد كبير من الخيارات الاضافية ..
لعلنا نناقشها في القسم العام لاحقا ( ان شاء الله ) .
baseSDL_OpenGL.zip (6.31كيلو )