OpenGL .. الدرس رقم 5

 OpenGL .. الدرس رقم 5  أضيف في: 9-6-1427هـ
نتعلم في هذا الدرس الإكساء .. بماذا يفيدنا الإكساء ؟ .. تخيل بانك تريد عمل قذيفة لتتحرك أمامك على الشاشة .. لو أردنا عمل القذيفة بالتقنيات التي درسناها سابقا أي بالمضلعات فسوف نحصل على قذيفة .. ولكن لن
عليها بشكل احترافي .. فسوف تكون القذيفة عبارة عن مجموعة من المربعات والمثلثات تغطيها بعض الألوان وتطير في عرض الشاشة .. هل هذا مانريده حقا ؟ بالطبع لا وهنا نحتاج الى الإكساء .. تخيل بأنه لدينا صورة حقيقة لقذيفة او صورة مصممة بالفوتوشوب أو الماكس لقذيفة .. نستطيع اضافتها إلى قذيفتنا التي قمنا بتصميمها حتى تعطينا شكل خارجي حقيقي للقذيفة هذا من جهة .. من جهة أخرى الإكساء يساعد على جعل التطبيق يعمل بسرعة .. فالقذيفة اذا كانت بدون اكساء تكون عبارة عن المئات من المضلعات بينما بالاكساء تكون عبارة عن قطعة واحدة وهي الصورة التي قمنا باستخدامها لإكساء القذيفة .. في درسنا هذا سوف نقوم باستخدام الاكساء على مربع .. بسم الله نبدأ

الدرس ..

CODE
#include <windows.h>
#include <stdio.h>
#include <gl\gl.h>
#include <gl\glu.h>
#include <gl\glaux.h>

HDC hDC=NULL;
HGLRC hRC=NULL;
HWND hWnd=NULL;
HINSTANCE hInstance;

bool keys[256];
bool active=TRUE;
bool fullscreen=TRUE;

GLfloat xrot;
GLfloat yrot;
GLfloat zrot;

GLuint texture[1];
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

الكود السابق موجود في الدرس الاول بإستثناء 5 اضافات جديدة عليه
الإضافة الاولى هي الملف الرأسي #include <stdio.h> وهذا الملف الرأسي يجعلنا نتعامل مع الملفات حيث نحتاج لاحقا الأمر fopen() والذي لايعمل بدون هذا الملف الرأسي
الإضافة الثانية والثالثه والرابعة هي GLfloat لكل من X , Y , Z وهو يقوم بتدوير المربع حول تلك المحاور
الإضافة الأخيرة هي السطر قبل الأخير وفي صرحنا اننا سوف نستخدم الاكساء والذي هو عبارة عن صورة واحدة فقط واذا اردنا اضافة اكثر من صورة نقوم بكتابة العدد بدل الرقم 1

CODE
AUX_RGBImageRec *LoadBMP(char *Filename)
{
FILE *File=NULL;

الآن سوف نقوم بوضع الكود الذي يقوم بتحميل الصورة التي سنستخدمها للإكساء .. الصورة التي سنختارها يجب ان يكون كل من العرض width والارتفاع height على الاقل 64 بكسل وكحد أقصى 256 بكسل .. يوجد طرق اخرى لتجاوز تلك الارقام ولكن لم اعرفها حتى الآن .

في الكود السابق قمنا بإنشاء الهاندل handle والهاندل عبارة عن قيمة تستخدم لتعريف المصادر المراد استخدامها في البرنامج حتى يتعرف عليها البرنامج ويقوم باستخدامها والوصول اليها

CODE
if (!Filename)
{
return NULL;
}

الكود السابق يقوم بفحص ما اذا كان الملف الذي ترغب بتحميله قد تم تحديده ام لا

CODE
File=fopen(Filename,”r”);

اذا تم تحديده يقوم الكود السابق بفحص الملف فإذا كان موجودا يقوم بفتحه

CODE
if (File)
{
fclose(File);
return auxDIBImageLoad(Filename);
}

اذا كان الملف الذي أردنا فتحه مفتوح أساسا سوف يقوم الكود السابق باغلاقه

CODE
return NULL;
}

اذا لم نستطع فتح الملف سوف يقوم البرنامج بالخروج

CODE
int LoadGLTextures()
{

الكود السابق يقوم بتحميل الصورة وتحويلها حتى يتم استخدامها للإكساء

CODE
int Status=FALSE;

الكود السابق يقوم بتعريف متغير الحالة Status وتم وضع False لانه لم يتم تحميل الصورة حتى الآن

CODE
AUX_RGBImageRec *TextureImage[1];

الكود السابق يستخدم لتخزين معلومات الصورة المراد استخدامها مثل العرض والارتفاع

CODE
memset(TextureImage,0,sizeof(void *)*1);

الكود السابق يقوم بعمل مسح clear لاي معلومات قد تكون موجودة لصورة قد تكون محفوظة سابقا

CODE
if (TextureImage[0]=LoadBMP(“Data/NeHe.bmp”))
{
Status=TRUE;

الكود السابق يقوم بتحميل الصورة التي سوف تستخدم للإكساء وهي Nehe.bmp وعند اكتمال العملية بصورة صحيحة سوف يتم حفظ معلومات الصورة من خلال المتغير TextureImage[0]

CODE
glGenTextures(1, &texture[0]);
glBindTexture(GL_TEXTURE_2D, texture[0]);

الآن بعد ان قمنا بتخزين بيانات الصورة في TextureImage[0] سوف نقوم باستخدام تلك البيانات لتكوين الصورة على المربع
من الكود السابق
السطر الأول
glGenTextures(1, &texture[0]) يخبر البرنامج باننا نريد استخدام صورة واحدة فقط للإكساء وتذكر اننا في بداية البرنامج أيضا قد صرحنا بهذا الشيء ف GLuint texture[1] الموجودة في اول البرنامج تخبر البرنامج باننا نريد استخدام صورة واحدة فقط للإكساء
السطر الثاني من الكود السابق يقوم بالربط بين المعلومات التي تم تخزينها عن الصورة وبين الصورة نفسها ومن ثم تهيئتها لوضعها على المربع

CODE
glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);

GL_TEXTURE_2D يقوم باخبار البرامج باننا نستخدم مادة اكساء ثنائية الأبعاد
TextureImage[0]->sizeX يعبر عن عرض الصورة المراد استخدامها للإكساء
TextureImage[0]->sizey يعبر عن ارتفاع الصورة المراد استخدامها للإكساء
TextureImage[0]->data هو المكان الذي يأخذ منه البرنامج بيانات الصورة

CODE
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
}

الكود السابق يقوم برؤية ما اذا كانت الصورة أكبر أو اصغر من الحجم المطلوب على الشاشة ومن ثم تعديلها

CODE
if (TextureImage[0])
{
if (TextureImage[0]->data)
{
free(TextureImage[0]->data);
}

free(TextureImage[0]);
}

الكود السابق يقوم بتحرير الذاكرة المستخدمة في حفظ بيانات الصورة بعد التأكد من حفظ البيانات

CODE
return Status;
}

اذا تم كل ماسبق فان الكود السابق يجعل البرنامج يستمر واذا وجد خطأ فان البرنامج يقوم بالخروج

CODE
int DrawGLScene(GLvoid) // Here’s Where We Do All The Drawing
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer
glLoadIdentity(); // Reset The Current Matrix
glTranslatef(0.0f,0.0f,-5.0f);

glRotatef(xrot,1.0f,0.0f,0.0f); // Rotate On The X Axis
glRotatef(yrot,0.0f,1.0f,0.0f); // Rotate On The Y Axis
glRotatef(zrot,0.0f,0.0f,1.0f); // Rotate On The Z Axis

glBindTexture(GL_TEXTURE_2D, texture[0]); // Select Our Texture
glBegin(GL_QUADS);
// Front Face
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // Bottom Left Of The Texture and Quad
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); // Bottom Right Of The Texture and Quad
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); // Top Right Of The Texture and Quad
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // Top Left Of The Texture and Quad
// Back Face
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // Bottom Right Of The Texture and Quad
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); // Top Right Of The Texture and Quad
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); // Top Left Of The Texture and Quad
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); // Bottom Left Of The Texture and Quad
// Top Face
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); // Top Left Of The Texture and Quad
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // Bottom Left Of The Texture and Quad
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f); // Bottom Right Of The Texture and Quad
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); // Top Right Of The Texture and Quad
// Bottom Face
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // Top Right Of The Texture and Quad
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f); // Top Left Of The Texture and Quad
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); // Bottom Left Of The Texture and Quad
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // Bottom Right Of The Texture and Quad
// Right face
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); // Bottom Right Of The Texture and Quad
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); // Top Right Of The Texture and Quad
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); // Top Left Of The Texture and Quad
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); // Bottom Left Of The Texture and Quad
// Left Face
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // Bottom Left Of The Texture and Quad
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // Bottom Right Of The Texture and Quad
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // Top Right Of The Texture and Quad
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); // Top Left Of The Texture and Quad
glEnd();

الكود السابق لرسم وتحريك المربع وتم شرحه في دروس سابقة

الكود المصدري للدرس
http://nehe.gamedev.net/data/lessons/vc/lesson06.zip

الدرس الأصلي لمن أراد الإطلاع
http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=06
انتهى الدرس

الكاتب: AlDeaj
نُشر في <a href="https://max4arab.com/category/%d8%af%d8%b1%d9%88%d8%b3-%d8%a8%d8%b1%d9%85%d8%ac%d8%a9-%d8%a7%d9%84%d8%a7%d9%84%d8%b9%d8%a7%d8%a8/" rel="category tag">دروس برمجة الالعاب</a>، <a href="https://max4arab.com/category/%d8%b9%d8%a7%d9%85/" rel="category tag">عام</a> الموسومة <a href="https://max4arab.com/tag/%d8%af%d8%b1%d9%88%d8%b3-%d8%a8%d8%b1%d9%85%d8%ac%d8%a9-%d8%a7%d9%84%d8%a7%d9%84%d8%b9%d8%a7%d8%a8/" rel="tag">دروس برمجة الالعاب</a>

 OpenGL .. الدرس رقم 4

 OpenGL .. الدرس رقم 4  أضيف في: 9-6-1427هـ
لقد قمنا بإنشاء كل من المثلث والمربع وقمنا بتلوينهما وتحريكهما .. الآن سوف نتعلم كيف نجعل كل منهما ثلاثي الابعاد .. سوف نقوم بتحويل المثلث الى شكل هرمي ذو الوان متعددة وممتزجة .. بينما سوف نقوم بتحويل المربع الى مكعب يحتوي كل وجه منه على لون معين .. سوف نضيف الى المثلث ثلاثة اوجه ( اليمين – اليسار والخلف ) .. بينما سنضيف الى المربع 5 اوجه (اليسار – اليمين – الخلف – فوق – تحت )

الدرس ..

CODE
int DrawGLScene(GLvoid)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(-1.5f,0.0f,-6.0f);
glRotatef(rtri,0.0f,1.0f,0.0f);
glBegin(GL_TRIANGLES);

الكود السابق موجود في الدرس السابق دون تغيير وهو يقوم بانشاء المثلث ورسمه في الجهة اليسرى من الشاشة وتحريكه حول المحور Y

CODE
glColor3f(1.0f,0.0f,0.0f);
glVertex3f( 0.0f, 1.0f, 0.0f);
glColor3f(0.0f,1.0f,0.0f);
glVertex3f(-1.0f,-1.0f, 1.0f);
glColor3f(0.0f,0.0f,1.0f);
glVertex3f( 1.0f,-1.0f, 1.0f);

في هذا الكود قمنا برسم الوجه الامامي ( والذي هو عبارة عن مثلث ) للشكل الهرمي والذي يتكون من 4 اوجه .. بالطبع جميع تلك الاوجه المكونة للشكل الهرمي تتحد عند نقطه واحد وهي النقطه العليا لكل وجه من الاوجه الاربعة بينما يختلف كل منهم في النقطه السفلى اليمنى واليسرى .. طريقه شرح مكان المثلث والوانه واضحه ولمزيد من التفصيل يمكنك مراجعه الدروس السابقة لفهم مايجري .
الوجه الاول والذي تم رسمه الآن يحتوي على ثلاث نقاط مكونة مثلث والذي بدوره يكون الواجهة الأمامية للشكل الهرمي الذي سيتم رسمه في النهاية .
النقاط الثلاثة المكونة للمثلث تم وضع لون لكل نقطة منها .. فالنقطة العليا احتوت على اللون الأحمر والنقطه السفلى اليسرى احتوت على اللون الأخضر والنقطه السفلى اليمنى احتوت على اللون الأزرق

CODE
glColor3f(1.0f,0.0f,0.0f);
glVertex3f( 0.0f, 1.0f, 0.0f);
glColor3f(0.0f,0.0f,1.0f);
glVertex3f( 1.0f,-1.0f, 1.0f);
glColor3f(0.0f,1.0f,0.0f);
glVertex3f( 1.0f,-1.0f, -1.0f);

الآن سوف نقوم برسم الوجه الأيمن للشكل الهرمي ( والذي سيكون عبارة عن مثلث طبعا ) .. كما قلنا سابقا فإن جميع الاوجه تتحد عند النقطه العليا وبما اننا وضعنا النقطه العليا في الكود الأول باللون الاحمر فسوف نقوم هنا بوضعها باللون الاحمر أيضا .
بما اننا نريد رسم الشكل الهرمي وهو عبارة عن شكل ثلاثي الأبعاد فيجب ان نعلم اننا سوف نستخدم العمق .. وهو البارامتر الثالث بعد glVertex3f وسوف يكون للعمق الدور الأكبر في تحديد الأشكال ثلاثية الأبعاد ورسمها .. نعود الآن للوجه الثاني للشكل الهرمي
يتحد الوجه الأيمن مع الوجه الأمامي للشكل الهرمي في كل من
1- النقطه العليا
2- النقطه السفلى اليمنى ( للوجه الأمامي ) والنقطه السفلة اليسرى ( للوجه الايمن) .
( يجب تطبيق الدرس ورؤيته لفهم الفكرة بصورة اوضح )
لذلك نرى ان قيمة المتغيرات في النقطه العليا للوجه الامامي = قيمة المتغيرات في النقطه العليا للوجه الايمن
و قيمة المتغيرات للنقطة السفلى اليمنى للوجه الأمامي = قيمة المتغيرات للنقطه السفلى اليسرى للوجه الايمن .

النقطه الثالثه المكونة للمثلث الثاني ( والذي هو عبارة عن الوجه الأيمن للشكل الهرمي ) يجب ان تكون في عمق الشاشة ( الى الداخل ) حتى يتكون الشكل ثلاثي الابعاد لاننا اذا ضعنا جميع النقط على خط واحد فلن نرى شكل ثلاثي أبعاد .. فالشكل ثلاثي الأبعاد عبارة عن عدة نقاط متوزعة في أعماق مختلفة فنرى النقطه ذات العمق 1- مثلا بعيدة عن الشاشة والنقطه 1 قريبه من الشاشة .. واذا كانت كل النقاط تساوي 1 او -1 فلن يكون هناك فرق في العمق ولن نلاحظ شكل ثلاثي الأبعاد .

النقطه الثالثه للمثلث المكون للوجه الأيمن للشكل الهرمي سوف تكون قيمة العمق فيها تساوي -1 وهي اول نقطه في هذا الدرس تأخذ تلك القيمة .. اي انها ستكون بعيدة عن الشاشة بينما النقط الاخرى قريبه من الشاشة

وضعنا للنقطه العليا لون أحمر لانها تتشارك مع النقطه العليا للوجه الامامي والتي اخذت مسبقا اللون الاحمر .. بينما وضعنا للنقطه اليسرى السفلى اللون الازرق لانها تتشارك مع النقطه اليمنى السفلى للوجه الامامي والتي اخذت مسبقا اللون الازرق .. النقطه الثالثه وهي النقطه اليمنى السفلى اخذت اللون الاخضر وهي غير مشتركة مع اي نقطه ( حتى الآن ) .

CODE
glColor3f(1.0f,0.0f,0.0f);
glVertex3f( 0.0f, 1.0f, 0.0f);
glColor3f(0.0f,1.0f,0.0f);
glVertex3f( 1.0f,-1.0f, -1.0f);
glColor3f(0.0f,0.0f,1.0f);
glVertex3f(-1.0f,-1.0f, -1.0f);

هذا الكود للمثلث الثالث والذي يقوم بتكوين الوجه الثالث ( الخلفي) للشكل الهرمي
نلاحظ ان النقطه اليسرى السفلى للوجه الخلفي مشتركة مع النقطه اليمنى السفلى للوجه الايمن وتساويها في القيمة ولها نفس اللون وهو الاخضر .. والنقطه العليا لكلا الوجهين تحتوي على نفس القيم واللون لان كلا الوجهين مشتركان في نفس النقطه .

النقطه الثالثه في عمق = -1 كما هو الحال مع النقطه اليسرى السفلى( وهذا شيء طبيعي كون الوجه الخلفي يكون في داخل عمق الشاشة ليعطي الشكل ثلاثي الابعاد ) وتكون تلك النقطه ( والتي تم وضع اللون الازرق لها ) مع النقطة العليا والنقطه اليسرى السفلى المثلث الثالث والذي يكون الوجه الخلقي للشكل الهرمي .

CODE
glColor3f(1.0f,0.0f,0.0f);
glVertex3f( 0.0f, 1.0f, 0.0f);
glColor3f(0.0f,0.0f,1.0f);
glVertex3f(-1.0f,-1.0f,-1.0f);
glColor3f(0.0f,1.0f,0.0f);
glVertex3f(-1.0f,-1.0f, 1.0f);
glEnd();

هذا الكود يقوم بوضع الوجه الايسر للشكل الهرمي والذي فيه النقطه العليا تحتوي على اللون الاحمر وتتشارك مع باقي الاوجه في نفس النفطه والقيم .. النقطه السفلى اليسرى تحتوي على اللون الازرق وتتشارك مع النقطه اليمنى السفلى للوجه الخلفي .. النقطه السفلى اليمنى تحتوي على اللون الاخضر وتتشارك مع النقطه السفلى اليسرى للوجه الامامي
glEnd(); يقول للبرنامج باننا انتهينا من رسم الشكل الهرمي

CODE
glLoadIdentity();
glTranslatef(1.5f,0.0f,-7.0f);
glRotatef(rquad,1.0f,1.0f,1.0f);
glBegin(GL_QUADS);

الآن نقوم برسم المكعب والذي يحتوي على 6 مربعات .. سوف نقوم برسم نقاط كل مربع بعكس اتجاه عقارب الساعة .. اي اننا سوف نبدأ بالنقطه العليا اليمنى ثم النقطه العليا اليسرى ثم النقطه السفلى اليسرى واخيرا النقطه السفلى اليمنى .. عند رسم الوجه الخلفي للمكعب قد تعتقد باننا نرسم نقاطه ( مع ) عقارب الساعة ولكن اثناء رسمه تخيل باننا نقف خلفه فيصبح كأننا نرسم الوجه الأمامي للمكعب وبذلك تكون النقاط عكس عقارب الساعة .

سوف نقوم الآن برسم المكعب بعمق مقداره -7 كما هو واضح من السطر الثاني من الكود السابق حتى يكون حجم المكعب قريبا من حجم المثلث اثناء عرضه على الشاشة .. بامكانك تغيير تلك القيمه ورؤية ماقد يحصل .

السطر الثالث من الكود السابق يخبر برنامجنا بان المكعب سوف يتحرك على محاوره الثلاثة ( X , Y , Z )

السطر الرابع يخبر البرنامج باننا سوف نقوم بانشاء المكعب

CODE
glColor3f(0.0f,1.0f,0.0f);
glVertex3f( 1.0f, 1.0f,-1.0f);
glVertex3f(-1.0f, 1.0f,-1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);
glVertex3f( 1.0f, 1.0f, 1.0f);

الآن سوف نقوم بانشاء السطح الاعلى للمكعب وبما اننا سوف نرسم السطح الاعلى فسوف تكون قيمة المحور Y تساوي 1 في جميع نقاط السطح الاعلى .. نقوم بوضع النقطه العليا اليمنى للمربع (والذي يكون الوجه الاعلى للمكعب) و التي قيمها موجوده في السطر الثاني من الكود السابق .. كما نرى باننا اتجهنا الى الجهة اليمنى بمقدار 1 وهي قيمة المحور X .. قيمة المحور Y تساوي 1 كما اتفقنا من قبل بسبب اننا نرسم الوجه الاعلى للمكعب .. قيمة المحور Z تساوي – 1 وتعني اننا سوف نضع تلك النقطه في عمق الى داخل الشاشة مقداره 1

النقطه الثانيه تتحرك الى اليسار بمقدار 1 وبنفس العمق ( وهي النقطه العليا اليسرى )

النقطه الثالثه هي النقطه السفلى اليسرى وتكون الى اليسار بمقدار 1 ولكن العمق يكون الى الخارج هذه المره وليس الداخل بمقدار 1

النقطه الرابعة هي النقطه السفلى اليمنى وتكون الى اليمين بمقدار 1 وبنفس عمق النقطه اليسرى السفلى
والسطر الاول من الكود السابق يوضح باننا قمنا بوضع اللون الاخضر للوجه العلوي
الآن تم انشاء السطح الاعلى للمكعب

CODE
glColor3f(1.0f,0.5f,0.0f);
glVertex3f( 1.0f,-1.0f, 1.0f);
glVertex3f(-1.0f,-1.0f, 1.0f);
glVertex3f(-1.0f,-1.0f,-1.0f);
glVertex3f( 1.0f,-1.0f,-1.0f);

الكود السابق يبين انشاء السطح الاسفل للمكعب
السطر الاول يبين باننا اخترنا اللون البرتقالي للسطح السفلي للمكعب
النقطه العليا اليمنى للوجه السفلي للمكعب يعبر عنها السطر الثاني من الكود ( مع ملاحظه بان العمق يساوي 1 وليس -1 لانها قريبه من الشاشه وليست بعيده بعكس النقطه العليا اليمنى للوجه الاعلى للمكعب )

السطر الثالث يعبر عن النقطه السفلى اليسرى والسطر الرابع يعبر عن النقطه السفلى اليمنى

CODE
glColor3f(1.0f,0.0f,0.0f);
glVertex3f( 1.0f, 1.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);
glVertex3f(-1.0f,-1.0f, 1.0f);
glVertex3f( 1.0f,-1.0f, 1.0f);

الكود السابق يبين الوجه الامامي للمكعب باللون الأحمر وبعمق 1 الى خارج الشاشة

CODE
glColor3f(1.0f,1.0f,0.0f);
glVertex3f( 1.0f,-1.0f,-1.0f);
glVertex3f(-1.0f,-1.0f,-1.0f);
glVertex3f(-1.0f, 1.0f,-1.0f);
glVertex3f( 1.0f, 1.0f,-1.0f);

الكود السابق يبين الوجه الخلقي للمكعب باللون الأصفر وبعمق 1 إلى داخل الشاشة

CODE
glColor3f(0.0f,0.0f,1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);
glVertex3f(-1.0f, 1.0f,-1.0f);
glVertex3f(-1.0f,-1.0f,-1.0f);
glVertex3f(-1.0f,-1.0f, 1.0f);

الكود السابق يبين الوجه الايسر للمكعب باللون الأزرق ونلاحظ جميع القيم للبارامتر X تساوي 1- لاننا نقوم برسم الوجه الايسر في الجزء الايسر من منتصف المكعب

CODE
glColor3f(1.0f,0.0f,1.0f);
glVertex3f( 1.0f, 1.0f,-1.0f);
glVertex3f( 1.0f, 1.0f, 1.0f);
glVertex3f( 1.0f,-1.0f, 1.0f);
glVertex3f( 1.0f,-1.0f,-1.0f);
glEnd();

الكود السابق يبين الوجه الايمن للمكعب باللون البنفسجي ونلاحظ جميع قيم X تساوي 1 لاننا نقوم برسم الوجه الايمن في الجزء الايمن من منتصف المكعب

الكود المصدري للدرس
http://nehe.gamedev.net/data/lessons/vc/lesson05.zip

الدرس الأصلي لمن أراد الإطلاع
http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=05

انتهى الدرس

رابط الدرس التالي :
http://www.arabteam2000-forum.com/index.php?showtopic=48419

اسألكم الدعاء

الكاتب: AlDeaj
نُشر في <a href="https://max4arab.com/category/%d8%af%d8%b1%d9%88%d8%b3-%d8%a8%d8%b1%d9%85%d8%ac%d8%a9-%d8%a7%d9%84%d8%a7%d9%84%d8%b9%d8%a7%d8%a8/" rel="category tag">دروس برمجة الالعاب</a>، <a href="https://max4arab.com/category/%d8%b9%d8%a7%d9%85/" rel="category tag">عام</a> الموسومة <a href="https://max4arab.com/tag/%d8%af%d8%b1%d9%88%d8%b3-%d8%a8%d8%b1%d9%85%d8%ac%d8%a9-%d8%a7%d9%84%d8%a7%d9%84%d8%b9%d8%a7%d8%a8/" rel="tag">دروس برمجة الالعاب</a>

 OpenGL .. الدرس رقم 3

 OpenGL .. الدرس رقم 3  أضيف في: 9-6-1427هـ
في هذا الدرس سوف نتعلم كيف نقوم بتدوير كل من المثلث والمربع .. سوف يكون دوران المثلث حول المحور Y بينما دوران المربع سوف يكون حول المحور X ( وتلك ليست قاعده .. انما اخترنا للمثلث المحور Y و للمربع المحور X كمثال أي انك تستطيع ان تجعل الدوران لأي كائن على أي محور تريده ) .

سوف نتعرف في هذا الدرس على متغيرين جديدين
rtri ويستخدم لتحريك او تدوير المثلث
rquad ويستخدم لتحريك او تدوير المربع

سوف نقوم باستخدام كود الدرس السابق واضافة الاكواد الجديدة إليه .. لذا لابد من ان تكون قد تابعت وفهمت الدرس السابق حتى تكمل هذا الدرس .. سوف أقوم بوضع الكود ومن ثم شرحه .. بسم الله نبدأ ..

CODE
#include <windows.h>
#include <gl\gl.h>
#include <gl\glu.h>
#include <gl\glaux.h>

HDC hDC=NULL;
HGLRC hRC=NULL;
HWND hWnd=NULL;
HINSTANCE hInstance;

bool keys[256];
bool active=TRUE;
bool fullscreen=TRUE;

GLfloat rtri;
GLfloat rquad;

الكود السابق موجود بأكمله في الدروس السابقة ومشروح في الدرس الأول باستثناء السطرين الاخيرين من الكود فهما الاضافة الجديدة على هذا الكود .

قمنا باضافة متغيري الدوران لكل من المثلث والمربع بعد fullscreen=TRUE من الكود الأصلي
rtri مكونة من مقطعين حرف r الاول يعبر عن كلمة rotation وتعني الدوران والحروف الثلاث الباقية تعبر عن triangle وتعني المثلث .. اذا rtri تعني تدوير او دوران المثلث
rquad مثل ما سبق باستثناء ان quad تعبر عن المربع مما يعني بأن rquad تعني تدوير او دوران المربع

CODE
glRotatef(rtri,0.0f,1.0f,0.0f);

glRotatef هو المسئول عن دوران الكائن حول المحور
rtri يعبر عن ان هذا الدوران سوف يكون للمثلث
المتغيرات الثلاث بعد rtri تعبر عن كل من X للمحور الاول ، Y للمحور الثاني ، Z للمحور الثالث

نحتاج القليل من التفصيل الآن

لو تخيلنا ان المحور X عبارة عن خط مستقيم من اليسار الى اليمين او من اليمين الى اليسار ( وهو فعلا كذلك)
فإنه عندما نضع قيمة المتغير اكس تساوي 1( مع بقاء القيم الاخرى تساوي صفر ) فاننا سوف نقوم بتدوير المثلث حول هذا الخط المستقيم ولو وضعنا القيمة 1 بالسالب سوف نقوم بتدوير المثلث أيضا حول نفس الخط المستقيم ولكن باتجاه معاكس ( يجب يجب يجب ان تقوم بالتعديل في المثال حتى تكتمل الصورة لديك وتفهم مايجري فالقراءة وحدها لاتكفي )

ولو افترضنا بان المحور Y عبارة عن خط مستقيم من الأعلى إلى الأسفل او من الأسفل إلى الأعلى فعندما نضع قيمة المتغير Y تساوي 1 ( مع بقاء القيم الاخرى تساوي صفر ) فاننا سوف نقوم بتدوير المثلث حول هذا الخط المستقيم ولو كانت قيمة المتغير 1 بالسالب سوف نقوم بالتدوير ايضا حول نفس الخط المستقيم ولكن باتجاه معاكس .. مثال على ذلك الاعصار .. تخيل انك في وسط حقل زراعي ويوجد اعصار هائل متجه إليك ( لاتهرب قبل ان اكمل الشرح ) بطبيعة الحال يكون الاعصار بشكل طولي ( وهو نفس المحور Y لدينا ) والاعصار اثناء تقدمه اليك فانه يدور حول نفسه ايضا اما من اليسار الى اليمين او من اليمين الى اليسار وهذا مانريد الوصول اليه .. فاننا حين نريد تدوير المثلث حول نفسه من المحور Y فاننا سوف نرى نفس حركة الاعصار حول نفسه من اليسار لليمين او من اليمين لليسار حسب القيمة التي لدينا ان كانت سالبة او موجبه
( اكرر .. يجب يجب يجب ان تقوم بتعديل تلك القيم في المثال حتى تكتمل الصورة لديك وتفهم مايجري فالقراءة وحدها لاتكفي )

نفس الأمر ينطبق على المتغير Z بافتراض ان المحور Z عبارة عن خط مستقيم من الداخل للخارج او من الخارج للداخل ( المتغير Z يعبر عن العمق ) .. مثال على ذلك المروحة .. تخيل انك أمام مروحة وتقوم بالنظر اليها .. منتصف تلك المروحه هو المحور Z وهو يكون للداخل والخارج .. المروحه تدور حول المحور Z من اليمين لليسار او من اليسار لليمين .. عند تدوير المثلث حول المحور Z فاننا سوف نحصل على نفس حركة المروحه ويتغير اتجاه الحركة بتغير القيمة سالبة او موجبه ( مره اخرى .. يجب يجب يجب ان تقوم بتعديل تلك القيم في المثال حتى تكتمل الصورة لديك وتفهم مايجري فالقراءة وحدها لاتكفي )

اذا في الكود السابق سوف نتحرك حول المحور Y بمقدار وحده واحده .. بالطبع بامكاننا التحريك باكثر من محور الآن ولكننا لانريد الدخول في متاهات قبل تعلم الاساسيات

CODE
glBegin(GL_TRIANGLES);
glColor3f(1.0f,0.0f,0.0f);
glVertex3f( 0.0f, 1.0f, 0.0f);
glColor3f(0.0f,1.0f,0.0f);
glVertex3f(-1.0f,-1.0f, 0.0f);
glColor3f(0.0f,0.0f,1.0f);
glVertex3f( 1.0f,-1.0f, 0.0f);
glEnd();

الكود السابق موجود في الدرس السابق وقد تم شرحه هناك بالتفصيل .. لماذا اعدنا كتابته ؟ هكذا دون سبب

CODE
glLoadIdentity();
glTranslatef(1.5f,0.0f,-6.0f);
glRotatef(rquad,1.0f,0.0f,0.0f);

الآن قمنا بكتابة glLoadIdentity() مرة اخرى حتى نقوم بالرجوع إلى منتصف الشاشة .. اذا لم نقم بهذا العمل سوف يتحرك المربع في موضع غير الموضع الذي نريده فيجب علينا استخدام هذا المتغير حتى نعود إلى منتصف الشاشة ومن ثم نقوم بالتحرك الى اليمين بمقدار 1.5 لتحريك المربع في الجزء الايمن كما هو مبين من السطر الثاني من الكود ( حاول ان تزيل glLoadIdentity() وانظر ماسيحدث للمربع ووكيف سيتحرك ويتغير موضعه ) .. في الدروس السابقة كنا نتحرك إلى اليمين بمقدار 3 وحدات لاننا كنا نتحرك من الجهة اليسرى للشاشة ولكننا الآن بعد ان عدنا إلى منتصف الشاشة لانحتاج الى التحرك سوى 1.5 حتى نصل الى الجهة اليمنى .

السطر الثالث يبين بأننا قمنا بتحريك المربع حور المحور X بمقدار 1

CODE
rtri+=0.2f;
rquad-=0.15f;
return TRUE;
}

السطرين الاول والثاني يقومان بزياده وانقاص سرعة الدوران لكل من المثلث والمربع بزياده الرقم تزيد السرعة وبالنقصان تنخفض السرعة .. الاشارات الموجبة والسالبة تقوم بتغيير الاتجاه ( ولا اعلم مالحكمه من تغيير الاتجاه بهذا المتغير مع امكانيه تغييره من خلال اعطاء قيمة سالبة او موجبة للمتغير نفسه عند التدوير في البداية )

CODE
if (keys[VK_F1])
{
keys[VK_F1]=FALSE;
KillGLWindow();
fullscreen=!fullscreen;
if (!CreateGLWindow(“NeHe’s Rotation Tutorial”,640,480,16,fullscreen))
{
return 0;
}
}

هذا الكود موجود في الدروس السابقة ولم يتم تغيير سوى الرسالة التي ستظهر في قمة المشروع title

الكود المصدري للدرس

http://nehe.gamedev.net/data/lessons/vc/lesson04.zip

الدرس الأصلي لمن أراد الإطلاع

http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=04

إلى هنا انتهى درسنا والذي أرجو ان يكون واضحا

الدرس التالي:
http://www.arabteam2000-forum.com/index.php?showtopic=47617

أسألكم الدعاء

علي الدعيج
AlDeaj@Gmail.Com

الكاتب: AlDeaj
نُشر في <a href="https://max4arab.com/category/%d8%af%d8%b1%d9%88%d8%b3-%d8%a8%d8%b1%d9%85%d8%ac%d8%a9-%d8%a7%d9%84%d8%a7%d9%84%d8%b9%d8%a7%d8%a8/" rel="category tag">دروس برمجة الالعاب</a>، <a href="https://max4arab.com/category/%d8%b9%d8%a7%d9%85/" rel="category tag">عام</a> الموسومة <a href="https://max4arab.com/tag/%d8%af%d8%b1%d9%88%d8%b3-%d8%a8%d8%b1%d9%85%d8%ac%d8%a9-%d8%a7%d9%84%d8%a7%d9%84%d8%b9%d8%a7%d8%a8/" rel="tag">دروس برمجة الالعاب</a>

 OpenGL .. الدرس رقم 2

 OpenGL .. الدرس رقم 2  أضيف في: 9-6-1427هـ
في الدرس السابق تعلمنا كيفية رسم كل من المثلث والمربع في هذا الدرس سوف نتعلم كيفية اضافة الالوان لهما.

Flat coloring هو وصف التلوين الذي سوف يضاف الى المربع ويتم فيه اضافة لون واحد فقط إلى المربع
Smooth coloring وصف التلوين الذي سوف يضاف الى المثلث ويتم فيه اضافة لون لكل نقطه تلتقي بها اضلاع المثلث اي اننا سوف نضيف 3 ألوان .

سوف نقوم باستخدام كود الدرس السابق .. لذا لابد من ان تكون قد تابعت وفهمت الدرس السابق حتى تكمل هذا الدرس .. سوف أقوم بوضع الكود ومن ثم شرحه .. بسم الله نبدأ ..

الدرس ..

CODE
int DrawGLScene(GLvoid)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(-1.5f,0.0f,-6.0f);
glBegin(GL_TRIANGLES);

هذا الكود موجود في الدرس السابق لم نقم بتغيير أي شي منه
glTranslatef يوضح مكان المثلث على الشاشة ولتفصيل أكثر راجع الدرس السابق
glBegin(GL_TRIANGLES)يقوم بإنشاء المثلث

CODE
glColor3f(1.0f,0.0f,0.0f);
glVertex3f( 0.0f, 1.0f, 0.0f);

هنا نضع أول سطر من الكود المضاف
السطر الأول قمنا باضافته للمره الاولى وهو لوضع اللون للنقطة العليا للمثلث .. نقوم بوضع هذا الكود قبل كل نقطه من نقط المثلث التي رسمناها في الدرس السابق حتى نقوم بتلوين تلك النقطه باللون الذي نريد .
glColor3f يقوم بوضع الألوان
المتغيرات الثلاث بعد glColor3f هي ترتيبا تعبر عن الألوان الأحمر ، الأخضر والأزرق .. تكون قيمة تلك المتغيرات من 0.0f إلى 1.0f وكما شرحنا في “الدرس رقم صفر” فإنه كلما اقتربنا من 0.0f يكون اللون داكن وكلما اقتربنا من 1.0f يكون اللون فاتح ( مع العلم بانه في حالة وضع القيمة 0.0f في بارامتر اللون الأحمر فاننا لانحصل على لون فيكون اللون أسود لان القيمه تساوي صفر بينما اذا وضعناها 0.1f مثلا سوف يكون اللون أحمر داكن وكذلك بالنسبه لبارامتر اللون الازرق والاخضر ).
في السطر الأول من الكود السابق لدينا قيمة كل من بارامتر اللون الأخضر والازرق تساوي صفر بينما قيمة بارامتر اللون الأحمر تساوي واحد (وهذي القيم هي للنقطه العليا من المثلث وليس لكامل المثلث ) لذلك سوف نحصل على اللون الأحمر للجزء العلوي من المثلث .
السطر الثاني من الكود يعبر عن مكان تلك النقطه على الشاشة وقد تم شرحها بالتفصيل في الدرس السابق

CODE
glColor3f(0.0f,1.0f,0.0f);
glVertex3f(-1.0f,-1.0f, 0.0f);

الآن قمنا بوضع قيمة اللون الأخضر تساوي واحد وهذا اللون سوف يظهر في الجزء الأيسر السفلي من المثلث كما هو موضح من السطر الثاني

CODE
glColor3f(0.0f,0.0f,1.0f);
glVertex3f( 1.0f,-1.0f, 0.0f);
glEnd();
glTranslatef(3.0f,0.0f,0.0f);

السطر الأول من الكود السابق تم فيه وضع قيمة كل من البارامتر الأحمر والأخضر تساوي صفر وقيمة البارامتر الأزرق تساوي واحد أي اننا سوف نحصل على اللون الأزرق للنقطه الثالثة من المثلث والتي موجودة كما يشرح السطر الثاني في الجزء الايمن السفلي من المثلث
السطر الثالث يقوم بإخبار البرنامج بأننا انتهينا من رسم المثلث
السطر الرابع يقوم بنقلنا الى الجهة اليمنى من الشاشة بمقدار 3 حيث المكان الذي قمنا برسم المربع به .

لاحظ اخي القارئ بعد تطبيق الدرس نقطه تجمع الالوان وتداخلها وكيف انها تعطي ألوانا جديدة .. تلك هي الطريقة الي تستخرج بها جميع الألوان عن طريق مزج الألوان الثلاثة ( الاحمر – الاخضر – الازرق )

CODE
glColor3f(0.5f,0.5f,1.0f);
glBegin(GL_QUADS);
glVertex3f(-1.0f, 1.0f, 0.0f);
glVertex3f( 1.0f, 1.0f, 0.0f);
glVertex3f( 1.0f,-1.0f, 0.0f);
glVertex3f(-1.0f,-1.0f, 0.0f);
glEnd();
return TRUE;
}

الآن وبعد ان قمنا بتلوين المثلث ب 3 الوان سوف نقوم بتلوين المربع بلون واحد .. لا نحتاج هنا ان نقوم بوضع سطر لكل نقطه من المربع بل يكفي ان نقوم بوضع اللون مرة واحدة في البداية وسوف يظهر على المربع بكامله .
ان اردنا ان نضع اكثر من لون كما فعلنا في المثلث فسوف نقوم بنفس العمل السابق في المثلث حيث نقوم بوضع لون لكل نقطه من نقاط المربع
في الكود السابق قمنا بوضع اللون الازرق كما هو واضح من القيمة 1 للبارامتر الازرق
ووضعنا قيمة كل من البارامتر الاخضر والاحمر يساي 0.5 وبتغييرها سوف نحصل على درجات الازرق المختلفة ( قم بتغييريها ولاحظ التغير في اللون الازرق )
السطر الثاني يخبر برنامجنا باننا بصدد انشاء مربع
من السطر الثالث إلى السادس يوضح نقاط المربع ومكانه على الشاشة وقد قمنا بتفصيلها في الدرس السابق
السطر السابع يخبر برنامجنا باننا انتهينا من رسم المربع
السطر الثامن يخبر البرنامج باكمال عمله والانتقال الى الخطوة التالية

CODE
if (keys[VK_F1])
{
keys[VK_F1]=FALSE;
KillGLWindow();
fullscreen=!fullscreen;
if (!CreateGLWindow(“NeHe’s Color Tutorial”,640,480,16,fullscreen))
{
return 0;
}

هذا الكود موجود في الدرسين السابقين ولم يتم تغيير سوى الرسالة التي ستظهر في قمة المشروع title

الكود المصدري للدرس
http://nehe.gamedev.net/data/lessons/vc/lesson03.zip

الكاتب: AlDeaj
نُشر في <a href="https://max4arab.com/category/%d8%af%d8%b1%d9%88%d8%b3-%d8%a8%d8%b1%d9%85%d8%ac%d8%a9-%d8%a7%d9%84%d8%a7%d9%84%d8%b9%d8%a7%d8%a8/" rel="category tag">دروس برمجة الالعاب</a>، <a href="https://max4arab.com/category/%d8%b9%d8%a7%d9%85/" rel="category tag">عام</a> الموسومة <a href="https://max4arab.com/tag/%d8%af%d8%b1%d9%88%d8%b3-%d8%a8%d8%b1%d9%85%d8%ac%d8%a9-%d8%a7%d9%84%d8%a7%d9%84%d8%b9%d8%a7%d8%a8/" rel="tag">دروس برمجة الالعاب</a>

 OpenGL .. الدرس رقم 1

 OpenGL .. الدرس رقم 1  أضيف في: 9-6-1427هـ
تعريب بالدررس

درسنا الثاني .. مربع + مثلث على الشاشة .. ربما يقول البعض فقط مربع ومثلث ؟ ماذا سنستفيد من هذا الدرس ؟ اليكم الجواب .. جميع ماسنقوم بانشائه مع OpenGL يحتوي على مربعات ومثلثات بالاضافة إلى اننا سنتعلم في هذا الدرس كيفية انشاء كل من المربع والمثلث فاننا سوف نتعلم ايضا كيفية وضعهما على الشاشة في المكان والبعد والعمق الذي نريده اي بامكاننا بعد هذا الدرس ان شاء الله ان نقوم بتوزيع الكائنات على الشاشة بدون اي مشاكل .

الدرس ..

ماسنقوم بشرحه الآن هو ماقمنا بإضافته الى الكود الأصلي (المشروح في الدرس الأول) .. وللذي لم يقرأ الدرس الأول فالكود الذي اتحدث عنه والموجود في الدرس الأول هو أساس كل برنامج OpenGL ويجب ان يكون موجودا في كل برنامج OpenGL .

الملف المرفق مع الدرس الحالي يحتوي على الكود كاملا ( أي كود الدرس الأول والكود المضاف في هذا الدرس )

السطور التالية سوف تضاف بعدDrawGLScene(GLvoid)
سوف أقوم بووضع الكود أولا ومن ثم شرحه

CODE
int DrawGLScene(GLvoid)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();

هذا الكود موجود في الدرس السابق ، بعده مباشرة نبدا باضافة مانريد كتابته بعد الآن .. قمت باعاده كتابه هذا الكود من أجل glLoadIdentity();
عند الوصول إلى glLoadIdentity(); فإن ماسيحدث هو الرجوع إلى منتصف الشاشة
لدينا الآن ثلاث محاور X , Y , Z المحور X يتحرك من اليسار إلى اليمين على الشاشة .. المحور Y يتحرك للأعلى والأسفل على الشاشة .. المحور Z يعبر عن العمق تخيل بانه لديك عصا وعلى افتراض بانك تستطيع ادخالها بداخل الشاشة واخراجها في خط مستقيم فهذا هو المحور Z اي الدخول والخروج الى عمق الشاشة .. بالطبع يستطيع فهم هذه المحاور من درس الفيزياء وعرف قاعدة فليمنغ لليد اليمنى ومن لايعرفها (مثلي) فليقرأ التفصيل القادم ::__IHACKLOG_REMOTE_IMAGE_AUTODOWN_BLOCK__::2

لنفرض منتصف شاشة الكمبيوتر التي أمامك هي النقطه صفر فإن أي خط مستقيم لديك يتجه من اليسار لليمن من عند النقطه صفر هو المحور X يكون موجبا .. وأي خط مستقيم يتجه من اليمين لليسار من عند النقطة صفر هو المحور X أيضا ولكنه هذي المرة بالسالب .
أيضا عند النقطة صفر (والتي هي منتصف الشاشة) عندما يتحرك خط مستقيم من الأسفل إلى الأعلى فهذا هو المحور Y ويكون موجبا .. وأي خط مستقيم يتحرك من الأعلى الى الاسفل من عند النقطة صفر فهو المحور Y ولكنه سالبا .
اذا افترضنا وجود خط مستقيم من خارج الشاشة إلى داخلها عند النقطة صفر يكون هذا الخط هو المحور Z ويكون سالبا بينما اذا كان الخط المستقيم من داخل الشاشة الى خارجها يكون المحور Z موجبا .
(اعتقد ان قراءة ماسبق مرة واحدة لاتكفي) ولكم القرار ::__IHACKLOG_REMOTE_IMAGE_AUTODOWN_BLOCK__::3

لنقوم الآن بشرح الاضافات الجديدة على الكود

CODE
glTranslatef(-1.5f,0.0f,-6.0f);

glTranslatef يقوم باختيار الموضع الذي سنقوم بالبدء منه (نحن الآن في منتصف الشاشة وسوف نقوم بالتحرك الى اليسار قليلا لنرسم المثلث حتى يتبقى النصف الايمن من الشاشة لرسم المربع) .
البارامترات الثلاثة بعد glTranslatef هي ترتيبا X الاولى Y الثانية Z الثالثة
في السطر السابق يتحرك المحور اكس باتجاه اليسار (تذكر انك الان في منتصف الشاشة ولذلك تحركك الى اليسار يعتبر قيمة سالبة)
بمقدار 1.5 .. المحور Y يساوي صفر اي اننا لن قوم بالتحرك للأعلى والأسفل انما فقط نتحرك باتجاه اليسار .. المحور Z يساوي 6 بالسالب اي اننا سوف نضع الكائن الذي سنرسمه في عمق مقداره 6 الى داخل الشاشة ( العمق لايظهر جليا الان كوننا لم نقم بالرسم ثلاثي الابعاد) .

CODE
glBegin(GL_TRIANGLES);
glVertex3f( 0.0f, 1.0f, 0.0f);
glVertex3f(-1.0f,-1.0f, 0.0f);
glVertex3f( 1.0f,-1.0f, 0.0f);
glEnd();

الآن وبعد ان قمنا بالتحرك الى القسم الأيسر من الشاشة بإمكاننا إنشاء المثلث
glBegin(GL_TRIANGLES) يعني بأننا نريد البدء برسم مثلث
glEnd() يخبر OpenGL باننا انتهينا من رسم المثلث
اذا أردنا وضع 3 نقط على الشاشة كالمثلث مثلا نستخدم GL_TRIANGLES بينما اذا أردنا 4 نقط لانشاء مربع نقوم باستخدام GL_QUADS واذا اردنا استخدام اكثر من 4 نقط فنستخدم GL_POLYGON (معظم كروت الشاشة حاليا تقوم بتصيير render المجسمات كمثلثات )
السطر الأول بعد glBegin(GL_TRIANGLES) يضع النقطة الاولى من المثلث الذي يتكون بطبيعة الحال من ثلاث نقاط
البارامتر الأول للمحور X والبارامتر الثاني للمحور Y والبارامتر الثالث للمحور Z .. مثلما نرى البارامتر الأول يساوي صفر والبارامتر الثاني يساوي 1 والبارامتر الثالث يساوي صفر أي اننا سوف نتحرك فقط إلى الأعلى وبذلك تكون تلك النقطه هي النقطه العليا للمثلث
السطر الثاني بعد glBegin(GL_TRIANGLES) يبين بان المحور X يساوي 1 بالسالب اي اننا اتجهنا الى اليسار بمقدار 1 والبارامتر Y يساوي 1 بالسالب اي اننا اتجهنا لأسفل بمقدار 1 ( مع العلم باننا نتحرك الان من منتصف النصف الأيسر للشاشة وليس من النقطه العليا للمثلث) والبارامتر الثالث يساوي صفر اي اننا لم نتحرك في العمق (العمق لن نحتاجه الا عند العمل على الرسم ثلاثي الابعاد) وبذلك تتكون لدينا النقطه الثانية للمثلث والتي تكون في الجزء الأيسر السفلي من المثلث
السطر الثالث بعد glBegin(GL_TRIANGLES) يبين البارامتر الاول يساوي 1 بالموجب اي انه يتحرك إلى اليمين بمقدار 1 والبارامتر الثاني Y يساوي 1 بالسالب اي انه يتحرك للأسفل بمقدار 1 ( ونذكر بان هذا التحرك من منصف الجزء الأيسر من الشاشة وليس من النقطه العليا للمثلث او النقطه التي في الجزء الايسر السفلي من المثلث ) والبارامتر الثالث يساوي صفر .. وبذلك تتكون النقطه الثالثه من المستطيل وهي في الجزء السفلي الايمن من المثلث .

CODE
glTranslatef(3.0f,0.0f,0.0f);

الآن نقوم بالتحرك الى اليمين لرسم المربع .. وسوف نتحرك بمقدار 3 نقاط .. اولا نتحرك 1.5 الى اليمين لنرجع الى منتصف الشاشة ومن ثم نتحرك 1.5 اخرى للذهاب الى الجزء الايمن من وبذلك يكون مجموع ماتحركناه 3 موجب .. والموجب لاننا نتحرك باتجاه الايمن للمحور X

CODE
glBegin(GL_QUADS);
glVertex3f(-1.0f, 1.0f, 0.0f);
glVertex3f( 1.0f, 1.0f, 0.0f);
glVertex3f( 1.0f,-1.0f, 0.0f);
glVertex3f(-1.0f,-1.0f, 0.0f);
glEnd();
return TRUE;
}

في الكود السابق نقوم بانشاء المربع باستخدام GL_QUADSنظرا لاحتواءه على 4 نقط
مثل طريقه توزيع نقاط المثلث نقوم بالتوزيع هنا
الكود الأول بعد GL_QUADS للنقطة العليا اليسرى
الكود الثاني للنقطة اليمنى العليا
الثالث للنقطة اليمنى السفلى والكود الرابع للنقطة السفلى اليسرى

CODE
if (keys[VK_F1])
{
keys[VK_F1]=FALSE;
KillGLWindow();
fullscreen=!fullscreen;
if (!CreateGLWindow(“NeHe’s First Polygon Tutorial”,640,480,16,fullscreen))
{
return 0;
}
}

الكود السابق موجود في الدرس الأول وتم تغيير الرسالة التي ستظهر في العنوان title فقط

إلى هنا انتهى الدرس الثاني .. قصير .. سهل .. بسيط ولكن يحتاج قليلا من التركيز
هذا الدرس مهم جدا ويجب( معرفته وفهمه) جيدا بعكس الدرس الاول والذي لاتحتاج الى التعمق فيه بل يكفيك معرفة مايدرو هناك فقط

الكود المصدري للدرس

http://nehe.gamedev.net/data/lessons/vc/lesson02.zip

بالاخير اود القول انه بامكانك التغيير في قيم نقاط المربع والمثلث ورؤية التغير الذي سيحصل في الاشكال .. جرب ولا تخف فان اخطأت لن تقوم بإطلاق قنبلة نووية تهدد أمن العالم .. كل ماسيحدث هو ظهور بعض الأخطاء وتذكر بأن التجربة والخطأ هي أول طريق التعلم

الكاتب: AlDeaj
نُشر في <a href="https://max4arab.com/category/%d8%af%d8%b1%d9%88%d8%b3-%d8%a8%d8%b1%d9%85%d8%ac%d8%a9-%d8%a7%d9%84%d8%a7%d9%84%d8%b9%d8%a7%d8%a8/" rel="category tag">دروس برمجة الالعاب</a>، <a href="https://max4arab.com/category/%d8%b9%d8%a7%d9%85/" rel="category tag">عام</a> الموسومة <a href="https://max4arab.com/tag/%d8%af%d8%b1%d9%88%d8%b3-%d8%a8%d8%b1%d9%85%d8%ac%d8%a9-%d8%a7%d9%84%d8%a7%d9%84%d8%b9%d8%a7%d8%a8/" rel="tag">دروس برمجة الالعاب</a>

لعبة استراتيجية مفتوحة المصدر

 

 لعبة استراتيجية مفتوحة المصدر

تحميل

نُشر في <a href="https://max4arab.com/category/%d8%af%d8%b1%d9%88%d8%b3-%d8%a8%d8%b1%d9%85%d8%ac%d8%a9-%d8%a7%d9%84%d8%a7%d9%84%d8%b9%d8%a7%d8%a8/" rel="category tag">دروس برمجة الالعاب</a>، <a href="https://max4arab.com/category/%d8%b9%d8%a7%d9%85/" rel="category tag">عام</a> الموسومة <a href="https://max4arab.com/tag/%d8%af%d8%b1%d9%88%d8%b3-%d8%a8%d8%b1%d9%85%d8%ac%d8%a9-%d8%a7%d9%84%d8%a7%d9%84%d8%b9%d8%a7%d8%a8/" rel="tag">دروس برمجة الالعاب</a>

كيف نكرر جسماً ما على مسار في الـ XSI

يعرض هذا الدرس طريقة سريعة وفعالة لنسخ أي جسم عدد من المرات على مسار معين بطريقة سهلة وفعالة ضمن بيئة الـ Softimage|XSI. سيتم الاعتماد في عرض هذه الطريقة على مبدأ الـ tutorials التي تعتمد على توضيح الفكرة من خلال سلسلة من الخطوات المختصرة والتركيز على الصور التوضيحية للمراحل.

  • نبدأ برسم المسار المطلوب وذلك من القائمة Curve ثم Draw Cubic by CVs.
  • نختار الجسم المراد تكراره (الأسطوانة في المثال الموضح).

  • نفعل خيار الـ Ghosting من القائمة Display Type Menu.

  • نختار الجسم المراد تكراره ومن القائمة Create->Path->Set Path ،نفعل كل من الخيارات Linear و Tangent.
  • نقوم بالاستجابة للأمر Set Path من خلال انتقاء المنحني المطلوب.

  • من قائمة Display Type Menu نختار Display Options ثم نفتح تبويب الـ Ghosting.
  • نجعل قيمة الـ Frames After مساوياً لزمن الـ Time Line الخاص بالمشهد.
  • نقوم باختبار العدد والمسافة بين الأجسام المراد نسخها من خلال وضع قيمة مناسبة في الخاصية Frame Step (في مثالنا قيمتها تساوي 5).

  • نحدد الجسم ثم من قائمة Edit نختار Duplicate\Instantiate->Duplicate\Instantiate From Animation.
  • في نافذة الخصائص نجعل قيمة كل من الـ End والـ Step مساوية للقيم التي تم تحديدها في تبويب الـ Ghosting.

  • نلغي تفعيل الـ Ghosting من قائمة Display Type Menu.

نُشر في <a href="https://max4arab.com/category/%d8%af%d8%b1%d9%88%d8%b3-%d8%a8%d8%b1%d9%85%d8%ac%d8%a9-%d8%a7%d9%84%d8%a7%d9%84%d8%b9%d8%a7%d8%a8/" rel="category tag">دروس برمجة الالعاب</a>، <a href="https://max4arab.com/category/%d8%b9%d8%a7%d9%85/" rel="category tag">عام</a> الموسومة <a href="https://max4arab.com/tag/%d8%af%d8%b1%d9%88%d8%b3-%d8%a8%d8%b1%d9%85%d8%ac%d8%a9-%d8%a7%d9%84%d8%a7%d9%84%d8%b9%d8%a7%d8%a8/" rel="tag">دروس برمجة الالعاب</a>

برمجة الألعاب في العالم العربي.. جهود وتحديات

يعود سوق الألعاب الالكترونيّة بأرباح تصل إلى عشرات المليارات من الدولارات سنويّا، حيث انّ مدخول هذا القطاع وصل في نهاية عام 2006 إلى 12.5 مليار دولار أميركيّ في الولايات المتحدة الأميركيّة فقط (يصل إجمالي المدخول في العالم كله إلى 40 مليار دولار أميركيّ سنويّا)، صعودا من 10 مليارات دولار أميركيّ في عام 2004 (مقارنة بمدخول ستوديوهات هوليوود في العام نفسه الذي وصل إلى 9.5 مليار دولار أميركيّ)، ويصل معدّل رواتب هذا القطاع إلى 73 ألف دولار أميركيّ في العام (حوالي 6 آلاف دولار أميركيّ في الشهر) لأفراد يتراوح معدّل أعمارهم بين 31 و35 عاما، لكنّ هذا القطاع لا يزال شبه مقفر في العالم العربيّ لأسباب مختلفة.
جهود وتحديات كبيرة
* ومن يظنّ بأنّ مبرمجي الألعاب يقضون أوقاتهم باللعب وهم يستمتعون بوقتهم، وقد يحسدهم البعض لأنّهم يظنون بأنّ المبرمجين يتقاضون رواتب ليلعبوا، فإنّه خاطئ، حيث انّ عوامل عديدة تجعل هذا المجال صعبا للغاية، مثل التواريخ الصعبة لطرح الألعاب في الأسواق التي قد لا تراعي عدم جاهزيّة اللعبة للطرح، أو عدم القدرة على إضافة جميع المزايا التي يريدها طاقم البرمجة، ويعود السبب في ذلك إلى رغبة الشركة المنتجة للعبة (التي غالبا ما تكون الشركة المموّلة) بطرح اللعبة في أسرع وقت ممكن، الأمر الذي يؤدي إلى طرح لعبة ناقصة أو مليئة بالأخطاء التقنية، وترغب شركات الإنتاج بطرح الألعاب في أوقات محدّدة من أجل تلافي التنافس مع لعبة أخرى ذات أهميّة كبيرة، وتُقدر نسبة الألعاب التي تجني أرباحا في كلّ عام بـ 10% فقط.
ومن التحديات الأخرى في هذا المجال التطوّر المستمرّ للتقنيات المستخدمة في البرمجة، حيث تتغيّر التقنيات كلّ بضعة أعوام، الأمر الذي يضطرّ افراد طاقم البرمجة إلى تطوير أنفسهم بشكل مستمرّ عن طريق قراءة آلاف الصفحات من الوثائق المرتبطة بلغات البرمجة ومحرّكات الألعاب Game Engine، ولا يستثني هذا الأمر أي أحد، حيث انّ أفراد طاقم البرمجة والرسّامين ومهندسي الصوتيّات مضطرّون إلى تعلم كلّ جديد في فترات قصيرة للحفاظ على وظائفهم، ويبذل الطاقم جهودا جبارة لمواكبة هذه التطويرات، ويقضون ساعات طويلة جدّا في البرمجة (يُطلق مصطلح «كرانش» Crunch على هذه الفترات)، لدرجة أنّهم يعملون لعامين متواصلين ولأكثر من 70 ساعة في الأسبوع ومن دون التمتع بعطلهم في نهاية الأسبوع، وتأجيل إجازاتهم ومواعيد زواجهم إلى بعد تاريخ طرح اللعبة، بالإضافة إلى مكالمات العمل في منتصف الليل والمواقف الأخرى، ولا يحق لهم في الكثير من الأحيان المطالبة بأجور الدوام الإضافيّ.
ولا يجب نسيان الضغط الكبير الذي يتعرّض له طاقم البرمجة عند طرح جهاز جديد يستخدم تقنيات حديثة ما تزال غير مجرّبة بالنسبة إليهم، هذا ويبقى طاقم البرمجة في حالة استنفار لأشهر طويلة بعد طرح الألعاب، وذلك لمراقبة المشاكل التقنية التي قد تحدث، وتطوير تحديثات تحلّ تلك المشكلة وإيصالها إلى المستخدمين في أسرع وقت ممكن قبل أن يستشيطوا غضبا، ومن الممكن اعتبار أنّ ألعاب الكومبيوتر، بشكل عام، هي عرضة لهذا النوع من المشاكل بسبب اختلاف مواصفات الأجهزة التي ستعمل عليها اللعبة، على خلاف أجهزة الألعاب التي تكون موحدة في جميع المواصفات التقنية اللازمة لعمل اللعبة.
منافسة محلية
* ويقول فادي عبد الهادي، المهندس الصناعيّ المهتمّ بتطوير ألعاب ذات مستويات متقدمة، بأنّه توجد لديه مخططات لتطوير سلسلتين من الألعاب، الأولى من نمط المغامرات والحركة، والثانية من نمط الرعب، وهو على وشك الانتهاء من كتابة القصّة والنصّ الشفهيّ للشخصيّات، ولكنّ أسماء هذه الألعاب لم تُقرّر بعد، نظرا لأهميّة الاسم في التسويق. ويتوقع فادي بانّه سيستخدم محرّك الألعاب «أنريل إنجن 3» Unreal Engine 3 و«إيه 7» A7 في مرحلة التطوير، لكنّ هذا القرار يعتمد على نوعيّة المتطلبات وحجم الاستثمار في اللعبة، وستستهدف الألعاب أجهزة «بلايستيشن 3» و«إكس بوكس 360» والكومبيوترات الشخصيّة.
ومن المتوقع أن يصل عدد أفراد الطاقم المطلوب لاتمام هذه الألعاب إلى 8، ومن الممكن تسليم بعض الأمور المتخصصّة لشركات أخرى لاتمامها، لكنّ عدد الأفراد يعتمد على مدى خبرتهم في مجالهم والوقت المتوفر لتطوير اللعبة. ويواجه فادي مشكلتين في تطوير هذه المشاريع، الأولى هي تجهيز طاقم مؤهل لمنافسة ألعاب عالميّة ذات جودة مرتفعة، الأمر الذي جعله يتعلم المسائل المطلوبة والتقنيات وطرق التطوير بنفسه، ومن ثمّ نقل المعلومات الأساسيّة إلى الطاقم عند البدء بالعمل. اما المشكلة الثانية فهي عدم توفر الاستثمارات بشكل كاف، الأمر الذي يبطئ من دورة التطوير والبرمجة، وذلك بسبب عدم إدراك قطاع الاستثمار بأنّ مجال الألعاب الإلكترونيّة مربح جدّا وبشكل ينافس قطاع الأفلام والمسلسلات التلفزيونيّة. ويؤكد فادي بأنّ قطاع برمجة الألعاب مبنيّ على الفنّ، حيث انّ تصميم الرسومات والموسيقى والقصّة والمراحل سيجذب أو ينفر اللاعب، ويمكن التدقيق في أخطاء الكثير من شركات تطوير الألعاب لمعرفة ذلك.
«كروسرودز» أردنية
* وتطوّر شركة «ستوديو ناسونز للترفيه» Nassons Entertainment Studios الأردنيّة لعبة «كروسرودز» Crossroads التي هي عبارة عن لعبة قتال استراتيجيّة في الفضاء وعلى سطح العديد من الكواكب، يقود فيها اللاعب مجموعة من السفن الفضائيّة بعد حرب عالميّة على الأرض استخدمت فيها أسلحة في غاية التقدّم، والدمار، لكنّ غارة جوّية خاطئة أصابت مركزا لتخزين الأسلحة المدمّرة، وحوّلت الأرض إلى خرابة بعد إبادة أكثر من نصف البشريّة، وترك النصف الآخر يصارع الموت، ولكنّ أملا جديدا يلوح في الأفق بعد 50 عاما على هذه الكارثة، حيث عُثر على كوكب بديل يمكن لما تبقى من البشريّة استيطانه، ولكنّ بعض الأمور غير المتوقعة تحدث وتضع هذه المهمّة على المحك، هل ستستطيع البشريّة العيش بأمان، وتبتعد عن الحروب إلى الأبد، أم هل سيصبح حلمها أملا لا يتحقق؟
وتجمع لعبة «كروسرودز» الكثير من العناصر الممتعة من مختلف الألعاب، حيث يمكن اللعب بشخصيّات ذات أهداف مختلفة، مثل شخصيّة «جيروي» Geroy الذي يريد التجوّل في الفضاء واستكشاف كوكب «آتلانتيكا» Atlantica وغزوه في فتوحات كبيرة والعودة إلى الأرض لإنقاذ الآخرين، وشخصيّة «ميريفا» Mireva التي تتحالف مع الآخرين وتبني جيشا ضخما للانتقام من الجهة التي أوصلتها هي وشعبها إلى الكارثة الحاليّة.
وتستهدف اللعبة اللاعبين المحترفين والمبتدئين الذين تبلغ أعمارهم 13 عاما أو أكثر، وهي ستكون متوفرة، في المستقبل القريب، على الكومبيوترات الشخصيّة وأجهزة «بلايستيشن 3» و«إكس بوكس 360» بفضل استخدام تقنيات البرمجيّات الوسطيّة Middleware التي تسهل عمليّة تحويل النصّ البرمجيّ للعبة إلى آخر تفهمه الأجهزة المختلفة، ويعمل 34 شخصا في تطوير هذه اللعبة، تتوزع أدوارهم بين المنتجين والمخرجين والمساعدين والرسامين والمبرمجين.
وواجه فريق العمل بعض العقبات خلال تطوير اللعبة، منها كيفيّة العثور على الخبرات اللازمة، حيث انّ هذه الخبرات غير متوفرة بشكل تجاريّ في الأردن، واضطرّ الطاقم الإداريّ إلى البحث في الجامعات عن الخبرات الشابّة ذات الطاقات الكامنة، التي يمكن توجيهها نحو أهداف المشروع، ومن العقبات الأخرى التوفيق بين إبداعات طاقم الرسومات مع النواحي التقنية التي من المفترض أن تستخدمها اللعبة، بالإضافة إلى تحديد بعض النواحي القانونيّة والتجاريّة للمشروع، وبالنسبة للمسائل الماليّة، فإنّ الشركة لم تواجه متاعب في ذلك، حيث انها كانت مموّلة ذاتيّا في بداية المشروع، ولكنّ «ناسونز» رأت بأنّه من الممكن إدخال مستثمرين في المشروع للسير بخطى ثابتة نحو الهدف الذي وضعته أمام نفسها، الأمر الذي توّج بالنجاح بعد العثور على الكثير من المستثمرين المهتمين والتعاقد مع الأنسب، حيث انضمت الشركة اخيراً الى مجموعة «آلفا» للتجارة الدولية.
ومن المتوقع أن تُباع اللعبة بالأسعار المعتادة وفق كل بلد وجهاز، حيث ستباع بسعر 40 دولارا أميركيّا في الولايات المتحدة الأميركيّة و40 يورو في الاتحاد الاوروبيّ لإصدار الكومبيوتر الشخصيّ، و60 دولارا أميركيّا في الولايات المتحدة الأميركيّة و60 يورو في الاتحاد الأوروبيّ لإصداريّ «بلايستيشن 3» و«إكس بوكس 360»، ومن المتوقع بيع اللعبة بسعر يتراوح بين 10 إلى 15 دولارا أميركيّا في روسيا والدول المجاورة لها، وذلك للتشجيع ضدّ قرصنة الألعاب في تلك المنطقة.
ويرى جورج الشوملي، المدير التنفيذيّ لشركة «ناسونز» في لقاء خاصّ بـ«الشرق الأوسط»، أنّ القرصنة في الدول العربيّة «تدمّر» الجهود العربيّة، ولذلك فإنّ لعبة «كروسرودز» تستهدف الأسواق الأميركيّة والأوروبيّة، وتجدر الإشارة إلى أنّ الشركة رأت بأنّه من الممكن لفت نظر الشركات العالميّة لبرمجة الألعاب، وذلك بحضور 5 معارض ومؤتمرات خاصّة بالألعاب، مثل «معرض ألعاب طوكيو» Tokyo Game Show «ومؤتمر مبرمجي الألعاب» Game Developers Conference في العديد من الدول، وكانت «ناسونز» هي شركة البرمجة الشرق أوسطيّة الوحيدة التي حضرت هذه المؤتمرات والمعارض، الأمر الذي يدلّ على عدم وجود اهتمام كاف للمستثمرين والمبرمجين في العالم العربي نحو قطاع يدرّ الكثير من الأرباح السنويّة، على الرغم من وجود الخبرات التقنيّة والفنيّة والإداريّة العربيّة اللازمة، ويأسف «الشوملي» من عدم عثوره أو مقابلته مبرمجين عرب خلال المؤتمرات والمعارض التي حضرها، ويقول لكلّ من يريد الدخول في هذا المجال الصعب، بأنّه على الرغم من الوقت الطويل والتحديات في بداية العمل وغيرها من العقبات الاجتماعيّة والجسديّة التي ستواجه طاقم العمل، إلا أنّ تطوير لعبة من نقطة الصفر هو خبرة مثيرة جدّا، ووسط جديد للتواصل مع العالم المحيط بعالمنا العربيّ وتبادل الخبرات والثقافات، بالإضافة إلى وجود أرباح مجزية من الممكن الوصول إليها بالتخطيط الصحيح.
«أبو حديد» المصري
* أمّا شركة «خيال للترفيه التفاعليّ»، Khayal Interactive Entertainment المصريّة، فقد رأت أن تصنع لعبة مغامرات فكاهيّة تستمد أفكارها من البيئة المصريّة المحليّة، حيث يأخذ اللاعب دور شخصيّة «أبو حديد» المستوحاة من الفيلم «بوحة» الذي مثله الفنان المصريّ محمد سعد، ويجب على اللاعب المرور في القرى والملاعب الرياضيّة والجبال المليئة برجال «المطاريد» (العصابات) للقضاء على عصابة «أولاد أبو دومة» التي يديرها مجرم شرير هو «أبو دومة»، وتتميّز اللعبة باستخدام مصطلحات لغويّة وثقافيّة متنوّعة، وهي لعبة تتحدث بالعامية المصرية، حيث يستخدم «أبو حديد» الـ«شومة» (عصا كبيرة تستخدم في المشاجرات في مصر) والـ«سنجة» (سيف مصريّ خاص)، بالإضافة إلى الـ«مقلاع» (سلاح من الجلد يستخدم لرمي الحصوات) والبندقية والرشاش الآلي وبعض المتفجرات والقذائف، ويساعد «أبو حديد» ويرشده مستشاره «حكيم الزمان»، تصوير أحداث اللعبة من المنظور الثالث 3rd Person Perspective، ويتعارك فيها اللاعب مع شخصيّات مختلفة ويجب عليه المرور عبر 10 مراحل مختلفة، هذا ويمكن اللعب مع الأصدقاء والغرباء بشكل جماعيّ عبر الشبكات المحليّة أو عبر الإنترنت.
وتعتمد التحديات والصعوبات التي يواجهها «أبو حديد» على مواقف مصريّة محليّة خالصة، مثل قيادته حافلة نقل عامّة وسباقه مع مجموعة من السائقين المجانين الذين يجوبون شوارع القاهرة المزدحمة، وفي مرحلة أخرى، يُطلب منه أن يعبر الترعة (اسم شائع يُطلق في مصر على الجدول النهريّ الصغير)، ولن يقتصر الأمر على المرور والغوص في الترعة فقط، بل يجب عليه علاج نفسه من مرض البلهارسيا بالبحث عن علاج في المستشفى المحليّ الذي يٌطلق عليه اسم «الوحدة الصحية» في مصر، بالإضافة إلى مقابلته لعمّال صيانة السيّارات والمزارعين، وغيرهم من شخصيّات الشارع المصريّ.
اللعبة متوفرة في الأسواق على الكومبيوترات الشخصيّة وتباع بـ 50 جنيها مصريا، هذا وطُوّرت اللعبة لتعمل وفق نظم التشغيل «ويندوز»، وهي تقدّم أداء مميزا عند استخدام معالجات «إنتلّ» ثنائيّة النواة Core 2 Duo (أسرع بحوالي 40% مقارنة بالسرعة على معالجات أخرى)، وذلك بسبب دعم شركة «إنتلّ» لجهود طاقم البرمجة وتسريع عمل اللعبة على معالجاتها، بالإضافة إلى تقديم نظم حماية متقدمة لمنع قرصنة اللعبة، واستخدام خطة دعائيّة في داخل اللعبة وعرض إعلانات في شوارعها، منها إعلانات لشركة «إنتلّ» نفسها، هذا وأظهرت شركة تزويد الإنترنت «تي إي داتا» TE Data المصريّة قدرا كبيرا من الاهتمام باللعبة، حيث تعاونت مع شركة «خيال» لتقديم بيئة ونظام للعب الجماعيّ عبر خدمة «إيه دي إس إل» التي تقدمها شركة «تي إي داتا».
وتجدر الإشارة إلى أنّ طاقما مكوّنا من 5 أفراد استطاع تطوير اللعبة (مع بعض المساعدة) خلال عامين، وواجه خلالها عقبات تقنيّة متعلقة بتطوير الرسومات المجسّمة ثلاثيّة الأبعاد، بالإضافة إلى قرصنة اللعبة ونسخها بشكل غير قانونيّ في الأسواق، وطرق توزيع الأقراص الليزريّة للعبة، هذا وبيع أكثر من 2000 نسخة حتى الآن، بالإضافة إلى تحميل المرحلة التجريبيّة من اللعبة 10 آلاف مرّة.
ألعاب الهواتف الجوّالة تزداد انتشارا
* يرى بشار دحابرة، المؤسس والمدير التنفيذي لشركة «إنفوتوسيل» Info2Cell المتخصّصة بتطوير الألعاب الإلكترونيّة على الأجهزة الجوّالة في المنطقة العربيّة والخبير التقنيّ في مجال تقنية المعلومات والاتصالات في منطقة الشرق الأوسط، في لقاء خاصّ بـ«الشرق الأوسط»، بأنّ الألعاب الإلكترونيّة على الأجهزة الجوّالة هي من أهمّ وسائل الترفيه التي تحظى بإقبال كبير على مستوى العالم العربيّ، خصوصا من جيل الشباب، ويشهد هذا القطاع حاليّا معدلات نموّ متزايدة من عام لآخر نتيجة لتطور الفكر ووسائل التصميم المعتمدة في تنفيذ الألعاب الإلكترونيّة. وعُقدت اخيرا مؤتمرات وفعاليّات متعلقة بدعم وتفعيل هذا القطاع، نذكر منها «مؤتمر الألعاب الإلكترونيّة في مسقط» الذي حضره العديد من الشركات العالميّة الرائدة في هذا المجال، بالإضافة إلى «بطولة العالم للألعاب الإلكترونيّة» التي استضافتها مصر خلال عام 2006، وتؤكد هذه المعطيات الانتشار الذي يحظى به هذا النوع من الألعاب، ولكنّ هذا الأمر لا ينفي الحاجة إلى بذل المزيد من الجهود، خاصة في ضوء غياب كُتّاب سيناريو الألعاب الإلكترونيّة على مستوى العالم العربيّ.
ويصل إجمالي عدد الألعاب التي توفرها الشركة على الأجهزة الجوّالة في الوقت الحالي حوالي ألف لعبة، تتنوّع مواضيعها لتلبي رغبات اللاعبين المختلفة، مثل ألعاب الحركة والمغامرات والألعاب الرياضيّة والمسابقات والألغاز وألعاب الـ«آركيد» السريعة والممتعة، وتحظى هذه الألعاب باهتمام جيل الشباب الذين تتراوح أعمارهم ما بين 13 و45 سنة، حيث تختلف الألعاب وفق المراحل العمريّة المختلفة من حيث درجة الصعوبة وسهولة الاستخدام والتعامل، ويمكن للاعبين الاستمتاع بهذه الألعاب باستخدام مجموعة واسعة من الهواتف الجوّالة الموجودة في الأسواق بما فيها «نوكيا»، «سامسونغ»، «سوني إيريكسون»، «موتورولا» و«الهواتف الذكية»، وتُعتبر لعبة «بالوت» واحدة من أكثر الألعاب الشعبيّة انتشارا في المملكة العربيّة السعوديّة، وهي عبارة عن لعبة أوراق تطوّرت لتصبح رقميّة على الهواتف الجوّالة، وتجدر الإشارة إلى أنّ محطة التلفزيون العربيّة «إم بي سي» MBC ساهمت في نشر هذه اللعبة عن طريق إطلاق حملة تسويقيّة ناجحة للتعريف بالشكل الجديد لهذه اللعبة، وكان لشركة «إنفوتوسيل» دور كبير في نشرها.
* مواقع مهمّة ـ http://www.nassons.com ـ http://www.abo7adeed.com ـ http://www.info2cell.com ـ http://www.underash.net ـ http://www.w3dtek.com ـ http://www.gamedev.net
الشرق الاوسط

الكاتب: صحيفة الشرق الاوسط جدة: خلدون غسان

نُشر في <a href="https://max4arab.com/category/%d8%af%d8%b1%d9%88%d8%b3-%d8%a8%d8%b1%d9%85%d8%ac%d8%a9-%d8%a7%d9%84%d8%a7%d9%84%d8%b9%d8%a7%d8%a8/" rel="category tag">دروس برمجة الالعاب</a>، <a href="https://max4arab.com/category/%d8%b9%d8%a7%d9%85/" rel="category tag">عام</a> الموسومة <a href="https://max4arab.com/tag/%d8%af%d8%b1%d9%88%d8%b3-%d8%a8%d8%b1%d9%85%d8%ac%d8%a9-%d8%a7%d9%84%d8%a7%d9%84%d8%b9%d8%a7%d8%a8/" rel="tag">دروس برمجة الالعاب</a>

OpenGL .. الدرس رقم صفر

أولا وقبل كل شيء أعتذر عن التأخر في طرح الدرس ، فالدرس كان يجب ان يكون منتهي قبل 3 اسابيع ولكن لظروف صحية لم استطع انهاءه فعذرا على التأخير

مقدمة مملة ..

OpenGL .. لا أعلم لما أعشق تلك المكتبة وافضلها على Directx . أولا وكما الحال مع اي شاب طموح ( او حالم) كنت ارغب في تعلم برمجة الألعاب فكنت ابحث عن لغة برمجة (سهلة) وتلبي رغباتي في بناء حلم طفولتي بإنتاج لعبة ذات مستوى عالي ( فاينل فانتسي مثلا )  .. اتجهت إلى الفيجوال بيسيك visual basic
ولكن رأيتها لغة هشة .. بسيطة .. لاتصلح للمشاريع الكبيرة فاتجهت الى c++ .. بحثت عن دروسها كثيرا ولكن دائما ماكنت اصاب باحباط عند البرنامج الأزلي لكل لغة برمجة Hello world .. لا أعلم لماذا يراودني احساس بان هذا البرنامج بالذات هو مصدر كل احباط لكل مبرمج برغب في تعلم لغة معينة

رأيت بأن لغة كال C++ اذا احتجت لاتقانها لصنع لعبة ما قد يستغرق سنوات عديدة يشيب بها رأسي ويذهب قبلها حماسي فتركتها و انا اجر اذيال الخيبة .. في تلك الفترة سمعت كثيرا عن Directx وكيف ان الكثير من الألعاب وبرامج المالتي ميديا قد صنعت بها او بمساعدتها فتوجهت الى DirectX .. قمت بتنزيل الكثير من الكتب لتلك المكتبة كما قمت بشراء كتاب باللغة العربية يشرح DirectX .. لا أعرف لماذا لم اهضم تلك المكتبة ( ربما لان شرح الكتاب لم يكن جيدا) فلم أفهم منها شيئا .. بعد ان رأيت انني لا انفع للعلم فكرت جديا بترك البرمجة والاتجاه لاي مجال آخر .. تركت البحث لمدة سنة تقريبا وفي الفترة الاخيرة انتقلت الى نظام التشغيل لينكس linux ومن هناك تعرفت على OpenGL وعند البحث والتقصي وجدت لها عدة تطبيقات مذهلة ( ومنها ماسأقوم بشرحه بالدروس القادمة ) ولكن ما أحزنني هو عدم وجود دروس عربية لتلك المكتبة أو ربما يوجد ولكني لم أستطع الوصول اليها ، فقلت لنفسي لم لا أقوم بوضع دروس وترجمة دروس إلى اللغة العربية بما انها تفتقر الى تلك الدروس .. فتلك المكتبة سهلة الفهم وبسيطة في اوامرها عظيمة في عملها كما انني وللمرة الاولى استطعت فهم شيئا عن البرمجة .. نخيلوا ؟

عند رؤيتي للدروس العربية بأي مجال كان ، تواجهني مشكلة في بعض المفردات المعربة .. فغالبا كنت لا افهم مايدور بسبب الترجمة الحرفية لمفردات معينة والتي تشتت الذهن وتضيع المعنى .. وكنت ارجع مضطرا الى البحث عن المعنى الانجليزي لتلك الكلمة لفهم الفكرة او الجملة .. لذا أثناء الدروس التي سأقوم بكتابتها او ترجمتها سوف اقوم بكتابة المفردات او الكلمات باللغة الانجليزية مع كتابة شرحها او عملها باللغة العربية .. إلى هنا تنتهي تلك المقدمة المملة .

درس طويل ..

هنا نبدأ بأول خطوة لنا مع OpenGL وهي أطول خطوة لنا في سلسلة دروسنا .. قد يكون الدرس طويل قليلا فسوف نقووم بكتابة كود ( طويل عريض ) من أجل انشاء نافذة فارغة .. أرى البعض قد بدأ يتذمر ..
قد يتسائل البعض ولما النافذة الفارغة ؟ نريد الدخول في برمجة الألعاب .. حسنا دعوني أشرح قليلا ..
ماسنقوم بإنشاءه الان هو الركيزة الاساسية لكل برنامج OpenGL ، فكل الدروس التالية بل كل برامج العالم المبرمجة عن طريق OpenGL تحتوي على هذا الكود فهو السطح الذي ستضع عليه كل ماستبرمجه .. عموما هذا هو اطول وأصعب درس .. ان استطعت فهمه ( وليس حفظه) فلن تواجه اية مشاكل مستقبلا ان شاء الله .. كفانا كلاما .. لنبدأ

أولا يجب عليك إنشاء مشروع فارغ project بواسطة Visual C++ 6.0 ويجب اختيار Win32 Application )وليس ) console application .

ثانيا يجب ربط المكتبات OpenGL libraries
بداخل Visual C++ 6.0 قم بالذهاب إلى Project ثم Settings ثم اضغط على Link الموجودة بالقائمة
تحت “Object/Library Modules” سوف تجد مجموعة من المكتبات قمت باضافة المكتبات الثلاثة التالية لهم سواء في البداية او النهاية وتأكد بوجود مسافة بين كل مكتبة واخرى
OpenGL32.lib GLu32.lib GLaux.lib
مع العلم بان تلك المكتبات تأتي مع نظام التشغيل وندوز تلقائيا

السطور الأربع الاولى من البرنامج تحتوي على الملفات الرأسية Header Files للمكتبات التي قمنا باضافتها

CODE #include <windows.h> // الملف الرأسي لويندوز Header File For Windows
#include <gl\gl.h> // الملف الرأسي للمكتبة OpenGL32
#include <gl\glu.h> // الملف الرأسي للمكتبة GLu32
#include <gl\glaux.h> // الملف الرأسي للمكتبة GLaux

الآن نريد وضع جميع المتغيرات variables التي سوف نستخدمها في البرنامج .. بما اننا بصدد انشاء نافذة فارغة فقط ( لا اريد احباط )  فلن نستخدم الكثير من المتغيرات الآن
بالسطر الاول نقوم باعداد مايسمى بال Rendering Context ( لا اعرف ترجمته )  .. كل برنامج تقوم ببرمجته عن طريق OpenGL يحتاج Rendering Context .وهو يقوم بربط OpenGL ب Device Context الذي يقوم بعرض النافذة .. دون ان ندخل بالتفاصيل هذا مانحتاج معرفته حتى الآن .. نحتاج الى اعداد Device Context الذي يجب ربطه مع OpenGL عن طريق Rendering Context .
ال Rendering Context يعرف اختصارا hRC اي اننا اثناء البرمجة نستخدم هذا الاختصار فقط وقد قمنا بتعريفه بالسطر الأول
السطر الثاني نقوم باعداد وتهيئة Device Context وهو مايسمى اختصارا hDC

CODE
HGLRC hRC=NULL;
HDC hDC=NULL;
HWND hWnd=NULL;
HINSTANCE hInstance

السطر الأول من الكود التالي يقوم باعداد لوحة المفاتيح Keyboard والاستجابة لاي رد فعل منه
في السطر الثاني المتغير active يستخدم لاخبار برنامجنا ان كانت النافذة قد وضعت في الخلفية بعد ان كانت بحجم كامل الشاشة او حتى بنص الشاشة .. اي اننا قمنا باخفاء النافذة minimized او انزالها حتى نقوم بتشغيل او رؤية برنامج آخر .
في السطر الثالث المتغير Full Screen واضح ولا يحتاج الى شرح ولكن سوف اقوم بشرحه في حال كان برنامجنا يستخدم كامل الشاشة (full screen) فان المتغير سووف يكن true واذا كان غير ذلك اي ليس بكامل الشاشة سوف يكون false
يجب وضع هذا المتغير حتى يعلم البرنامج اذا ماكنا في وضع الشاشة الكاملة ام لاوحتى يعرف كل اجراء ان كان سيطبق في وضع الشاشة الكامل ام لا

CODE
bool keys[256]; // لتسجيل حركة لوحة المفاتيح
bool active=TRUE; // هذا المتغير يجب ان يكون true
fullscreen=TRUE; // متغير كامل الشاشة

يجب علينا الآن تعريف WndProc() السبب في ذلك لان CreateGLWindow() يرتبط في WndProc() ولكنه يأتي بعد CreateGLWindow() .
في لغة C اذا اردنا كتابة اجراء معين او قسم معين من الكود يكون بعد الكود الذي نعمل عليه حاليا يجب علينا ان نعلن عن الاجراء اولا قبل كتابة الكود ( اقرأ هذه النقطة مرة اخرى ) 
لذا في السطر القادم سوف نقوم بتعريف WndProc() لنستطيع استخدام CreateGLWindow() .. اتفقنا ؟ سواء اتفقنا ام لا يجب علينا كتابة هذا السطر :)

CODE
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

يقوم الكود التالي باعادة حجم النافذة بعد تصغيرها ( بافتراض انك لاتعمل على كامل الشاشة full screen )

CODE
GLvoid ReSizeGLScene(GLsizei width, GLsizei height)
{
if (height==0)
{
height=1;
}

glViewport(0, 0, width, height);

في السطور التالية يتم اضافة القليل من الواقعية لمشهدنا ( على افتراض اننا نضع كائنات معينة في الشاشة)
فرؤية المشهد تتم من زاوية مقدارها 45 درجة كما هو مبين بالكود مستندة على الارتفاع والعرض للنافذة
النقاط 0.1f, 100.0f تعبر عن نقطه بداية ونقطه نهاية لمدى العمق الذي نضع به الكائنات ( سوف اشرح هذا الموضوع بتفصيل اكبر في دروس قادمة )

glMatrixMode(GL_PROJECTION) يشير الى ان السطرين التاليين من الكود سوف يؤثران على مايسمى بمصفوفة التقدير
glLoadIdentity() يقوم بنفس عمل الامر reset تقريبا فهو يعيد المصفوفة المختارة الى حالتها الاولى

كل مانريد معرفته الآن ان اضافة هذا الكود تقوم بتحسين عملنا ( وسوف نفصل في هذا الموضوع في دروس قادمة)

CODE
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

هنا نقوم بتنصيب OpenGL فيجب كتابة هذا السطر حتى نقوم باختيار الالوان ونمكن التظليل الناعم smooth shading .. الخ .

CODE
int InitGL(GLvoid)
{

بالسطر التالي نقوم بتمكين التظليل الناعم smooth shading

CODE
glShadeModel(GL_SMOOTH );

الآن نقوم بوضع الألوان .. سوف اقوم بشرح الألوان بشكل مبسط على ان نتعمق فيها لاحقا .. مدى الألوان يكون بين 0.0f و1.0f حيث ان 0.0f يكون لون داكن و 1.0f يكون لون فاتح و 0.5f يكون لون متوسط بين الداكن والفاتح .
البارامتر الأول في الكود بعد glClearColor يعبر عن اللون الأحمر والبارامتر الثاني يعبر عن اللون الأخضر والبارامتر الثالث يعبر عن اللون الأزرق والبارامتر الرابع لقيمة الفا Alpha .. لانحتاج الآن الى معرفة عمل البارامتر الفا ونكتفي بوضع قيمته صفر في الوقت الحالي .
قد يتسائل البعض لدينا 3 ألوان فقط .. الأحمر ، الأخضر والأزرق أين بقية الألوان ؟ الاجابة هي : عن طريق مزج تلك الألوان نقوم بإظهار الوان جديدة وسوف نفصل في هذا الأمر لاحقا ( يوجد الكثير من الدروس قادمة فلاتخافوا سوف نشرح كل شيء )
الان اذا كان لدينا glClearColor(0.0f,0.0f,1.0f,0.0f) سوف نرى ان قيمة كل من اللون الأحمر والاخضر تساوي صفر بينما قيمة اللون الأزرق تساوي واحد .. اذا سوف نحصل على اللون الازرق على الشاشة .. واذا كان لدينا glClearColor(0.5f,0.0f,0.0f,0.0f) فاننا سوف نحصل على على لون أحمر متوسط وليس احمر فاتح او احمر داكن .. وهكذا .
في الكود التالي سوف نقوم بوضع جميع القيم صفر اي اننا سوف نحصل على اللون الأسود للخلفية

CODE
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

الأسطر الثلاثة التالية لتحديد العمق في الشاشة .. مثلا لدينا كائنين على الشاشة ونريد ان نظهرهما بمظهر ثلاثي الأبعاد او ان نظهر احداهما خلف الاخر فاذا افترضنا بانه لدينا مربع ودائرة نريد عرضهما على الشاشة بحيث يكونا في بعدين مختلفين اي ان المربع بعيد والدائرة قريبه من الشاشة فمن االطبيعي ان الدائرة سوف تغطي على المربع او اجزاء منه اذا تقاطعا على خط واحد .
ومهمة الكود التالي هي توزيع الكائنات في فضاء الشاشة .. بما اننا الان نقوم بعمل شاشة فارغة فقط فاننا لانحتاج الو وضع قيم لاي كائنات ونكتفي الان بتعريفه فقط

CODE
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);

في السطر التالي نخبر OpenGL بتصحيح المنظور ليخرج لنا اداء افضل للمشهد ولو قليلا

CODE
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
return TRUE;
}

القسم القادم من الكود يستدعى عندما تريد الخروج من البرنامج .. KillGLWindow() يقوم بتحرير release
كل من Rendering Context و Device Context

CODE

GLvoid KillGLWindow(GLvoid)
{

من خلال الكود التالي يجب علينا رؤية ما اذا كنا في طور الشاشة الكاملة full screen ام لا .. لماذا علينا فعل ذلك ؟ .. هل صادفت مرة اثناء خروجك من احد البرامج اختفاء بعض الايقونات من سطح المكتب وتحتاج الى عمل تحديث refresh لسطح المكتب لاستعادتها ؟ حسنا هذا السطر يقوم برؤية ما اذا كان هذا البرنامج في طور الشاشة الكاملة ام لا فاذا كان كذلك يقوم بالخروج من الشاشة الكاملة قبل اغلاق البرنامج وان كان غير ذلك ف(خير وبركة)

CODE
if (fullscreen)
{

نقوم الآن باستخدامChangeDisplaySettings(NULL,0) حتى نقوم بالرجوع الى الوضع الطبيعي لسطح المكتب desktop .. اي نقوم باسترجاع القيم المخزنة في ملفات الرجستري لنظام الوندوز مثل دقة الشاشة وعمق الالوان وغيرها .. كما يقوم
ShowCursor بإظهار مؤشر الفأرةMouse Pointer

CODE

ChangeDisplaySettings(NULL,0);
ShowCursor(TRUE);
}

السطر التالي يقوم برؤية ان كان لدينا Rendering Context .. اذا كان غير موجودا فالبرنامج سف يقفز الى الكود الذي يقوم بالبحث عن Device Context

CODE
if (hRC)
{

اذا كان ال Rendering Context موجودا فسوف نرى امكانية ان نقوم بتحريره release it اي نقوم بفصله عن
Device Context

CODE
if (!wglMakeCurrent(NULL,NULL))
{

اذا لم يستطلع البرنامج تحرير hRC سوف يقوم باظهار رسالة تخبرنا بذلك

CODE
MessageBox(NULL,”Release Of DC And RC Failed.”,”SHUTDOWN ERROR”,MB_OK | MB_ICONINFORMATION);
}

نقوم الآن بمحاولة حذف delete hRC

CODE
if (!wglDeleteContext(hRC))

اذا فشلت العملية سوف تظهر رسالة تخبرنا بذلك

CODE

MessageBox(NULL,”Release Rendering Context Failed.”,”SHUTDOWN ERROR”,MB_OK | MB_ICONINFORMATION);
}
hRC=NULL;

}

الآن نقوم بفحص مااذا كان لدينا Device Context ام لا وامكانية تحريره وفي حالة لم نستطع تحريره سوف تظهرر سالة تخبرنا بذلك

CODE
if (hDC && !ReleaseDC(hWnd,hDC))
{
MessageBox(NULL,”Release Device Context Failed.”,”SHUTDOWN ERROR”,MB_OK | MB_ICONINFORMATION);
hDC=NULL;
}

ونفس الامر السابق نستخدمه مع Window Handle ونرى امكانية عمل تحطيم destroy لها كما هو واضح من
DestroyWindow(hWnd) الموجود في الكود واذا فشلنا سوف تظهر رسالة تخبرنا بذلك

CODE
if (hWnd && !DestroyWindow(hWnd))
{
MessageBox(NULL,”Could Not Release hWnd.”,”SHUTDOWN ERROR”,MB_OK | MB_ICONINFORMATION);
hWnd=NULL;
}

الشئ الاخير الذي نقوم به هو عمل unregister لصنف النوافذ Windows Class حتى لاتردنا اي رسالة خطأ اثناء تشغيل البرنامج مرة اخرى واذا فشلنا تظهر لنا رسالة تخبرنا بذلك

CODE
if (!UnregisterClass(“OpenGL”,hInstance))
{
MessageBox(NULL,”Could Not Unregister Class.”,”SHUTDOWN ERROR”,MB_OK | MB_ICONINFORMATION);
hInstance=NULL;
}
}

الآن نقوم بإنشاء نافذة OpenGL كما هو ظاهر من CreateGLWindow .. في الجزء التالي من الكود لدينا 5 بارامترات title العنوان width العرض height الطول bits البت و fullscreenflag اذا كان true يعني الشاشة كاملة وfalse يعني العكس

CODE
BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag)
{

عندما نريد ايجاد صيغة البكسل pixel الذي يتوافق مع عملنا سوف تقوم النافذة بتحديدها وجعلها في المتغير PixelFormat

CODE
GLuint PixelFormat;

الآن يجب علينا عمل رجستر register لصنف النافذة window class .. يقوم صنف النافذة بتخزين معلومات النافذة التي سوف نقوم بعملها

CODE
WNDCLASS wc;
DWORD dwExStyle;
DWORD dwStyle;

الاسطر الخمس التالية نقوم بتحديد موقع النافذة وسوف نفصل فيه لاحقا

CODE
RECT WindowRect;
WindowRect.left=(long)0;
WindowRect.right=(long)width;
WindowRect.top=(long)0;
WindowRect.bottom=(long)height;

الآن يجب علينا جعل المتغيران fullscreen=fullscreenflag لم افهم هذه النقطه جيدا ولماذا يجب علينا فعل ذلك ولكن يبدو اننا ان لم نفعل ذلك سوف تحدث بعض المشاكل ويكفي معرفة ذلك حتى الآن على ان نقوم بالبحث في الموضوع لاحقا

CODE
fullscreen=fullscreenflag;

الآن نقوم بتعريف define لل window class
CS_HREDRAW و CS_VREDRAW يقوم باعادة عرض النافذة عند تكبيرها او تصغيرها
CS_OWNDC يقوم بانشاء DC لنافذ تنا
WndProc هو الاجراء الذي يقوم بمراقبه الرسائل التي تظهر في البرنامج
LoadIcon يقوم بتحميل الايقونة icon
LoadCursor يقوم بتحميل مؤشر الفأرة
لم نقم باستخدام خلفية لذلك نضع wc.hbrBackground تساوي NULL
وكذلك لانريد قائمة menu فنقوم بوضع wc.lpszMenuName تساوي NULL
السطر الاخير يعبر عن اسم الصنف class name وقمنا بوضعه هنا OpenGL

CODE
hInstance = GetModuleHandle(NULL); wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
wc.lpfnWndProc = (WNDPROC) WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_WINLOGO);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = NULL;
wc.lpszMenuName = NULL;
wc.lpszClassName = “OpenGL”;

الآن نقوم بعمل رجستر register للصنف واذا حدث اي خطأ سوف تظهر رسالة

CODE
if (!RegisterClass(&wc))
{
MessageBox(NULL,”Failed To Register The Window Class.”,”ERROR”,MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}

الآن نسأل البرنامج ما أذا كنا بكامل الشاشة ام لا

CODE
if (fullscreen)
{

هذا القسم هو الخاص بالتغيير الى وضح الشاشة الكاملة .. يجب ان يكون الطول والعرض في حالة الشاشة الكاملة مثل الطول والعرض التي تنوي استدخدامها لبرنامجك ويجب ايضا ان تقوم بوضع متغيرات الشاشة الكاملة قبل انشاء نافذة البرنامج .. الآن ليس علينا الاهتمام بالطول والعرض وقيمتهما فهي سوف تحدد تلقائيا من خلال هذا الكود

CODE
DEVMODE dmScreenSettings;
memset(&dmScreenSettings,0,sizeof(dmScreenSettings));
dmScreenSettings.dmSize=sizeof(dmScreenSettings);
dmScreenSettings.dmPelsWidth = width;
dmScreenSettings.dmPelsHeight = height;
dmScreenSettings.dmBitsPerPel = bits;
dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;

في الكود التالي سوف نقوم بوضع العرض والارتفاع التي نريد الانتقال اليها والتي نقوم باستيرادها من
dmScreenSettings
ChangeDisplaySettings تقوم بتغيير حجم الشاشة الى المعطيات ( الطول والعرض ) الموجودة في dmScreenSettings

CODE

if (ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL)
{

اذا لم تتم العمليه ولم تظهر الشاشاة كاملة full screen فسوف تظهر لنا رسالة بخيارين .. اغلاق الشاشة والخروج من البرنامج او الاستمرار بدون شاشة كاملة

CODE
if (MessageBox(NULL,”The Requested Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode Instead?”,”NeHe GL”,MB_YESNO|MB_ICONEXCLAMATION)==IDYES)

اذا اخترنا الاستمرار سوف تصبح قيمة المتغير fullscreen = false
ويستمر البرنامج في عمله

CODE
fullscreen=FALSE;
}
else
{

واذا اخترنا الخروج فسوف تظهر رسالة تخبرنا بان البرنامج سوف يغلق
القيمة false تخبر البرنامج بانه يوجد خلل في العمليه ويجب علينا الخروج

CODE
MessageBox(NULL,”Program Will Now Close.”,”ERROR”,MB_OK|MB_ICONSTOP);
return FALSE;
}
}
}

نقوم الآن بالتأكد مره اخرى ما اذا كان وضع الشاشة الكاملة يعمل ام لا

CODE
if (fullscreen)
{

اخفاء مؤشر الفأرة في وضعية fullscreen وان اردت اظهارها اجعل قيمتها true

CODE
dwExStyle=WS_EX_APPWINDOW;
dwStyle=WS_POPUP;
ShowCursor(FALSE);
}
else
{

dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;
dwStyle=WS_OVERLAPPEDWINDOW;
}

الآن نقوم بتعديل نافذة البرنامج حتى تناسب ابعاد النافذة المختارة سواء fullscreen او window type

CODE
AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle);

نقوم بانشاء نافذتنا الآن حيث نقوم بالتمرير الى CreateWindowEx() جميع البارامترات التي يحتاجها

CODE
if (!(hWnd=CreateWindowEx( dwExStyle,
“OpenGL”,
title,
WS_CLIPSIBLINGS |
WS_CLIPCHILDREN |
dwStyle,
0, 0,
WindowRect.right-WindowRect.left,
WindowRect.bottom-WindowRect.top,
NULL,
NULL,
hInstance,
NULL)))

في الكود التالي سوف نقوم باختيار الالوان والبت (16 – 24 – 32 ) وغيرها من الامور التي تحتاج دروس اخرى لتفصيلها فلا تستجعلوا معرفتها الآن

CODE
static PIXELFORMATDESCRIPTOR pfd=
{
sizeof(PIXELFORMATDESCRIPTOR),
1,
PFD_DRAW_TO_WINDOW |
PFD_SUPPORT_OPENGL |
PFD_DOUBLEBUFFER,
PFD_TYPE_RGBA,
bits,
0, 0, 0, 0, 0, 0,
0,
0,
0,
0, 0, 0, 0,
16,
0,
0,
PFD_MAIN_PLANE,
0,
0, 0, 0
};

والآن مجموعة من رسائل الاخطاء -لاتحتاج الى تفصيل- والتي ستظهر لنا في حالة فشل اي عملية مع بيان سبب الخطأ

CODE
if (!(hDC=GetDC(hWnd)))
{
KillGLWindow();
MessageBox(NULL,”Can’t Create A GL Device Context.”,”ERROR”,MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd)))
{
KillGLWindow();
MessageBox(NULL,”Can’t Find A Suitable PixelFormat.”,”ERROR”,MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
if(!SetPixelFormat(hDC,PixelFormat,&pfd))
{
KillGLWindow();
MessageBox(NULL,”Can’t Set The PixelFormat.”,”ERROR”,MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
if (!(hRC=wglCreateContext(hDC)))
{
KillGLWindow();
MessageBox(NULL,”Can’t Activate The GL Rendering Context.”,”ERROR”,MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}

اذا لم يحدث اي اخطاء سوف يت الانتقال الى الكود التالي والذي يعطي اولوية لظهور النافذة على الشاشة اي انه عند بدء التشغيل تكون في المقدمة حتى تراها

CODE
ShowWindow(hWnd,SW_SHOW);
SetForegroundWindow(hWnd);
SetFocus(hWnd);
ReSizeGLScene(width, height);

InitGL() يقوم بمساعدتنا لوضع الاضاءة ، اضافة الأنسجة وغيرها

CODE
if (!InitGL())
{
KillGLWindow();
MessageBox(NULL,”Initialization Failed.”,”ERROR”,MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
return TRUE;
}

هنا يتم التعامل مع جميع الرسائل التي تظهر فعندما يتم عمل register لصنف النافذة window class تقفز مباشرة الى هذا الكود اي كيف سيتعامل البرنامج عند حدوث امور معينة

CODE
LRESULT CALLBACK WndProc( HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{

الآن اذا كانت قيمة uMsg هي WM_ACTIVE سوف نقوم بفحص ما اذا كانت نافذتنا في الواجهة .. ان لم تكن كذلك فالمتغير active سوف يكون false وان كانت في الواجهة فسوف يكون المتغير true

CODE
switch (uMsg)
{

case WM_ACTIVATE:
{
if (!HIWORD(wParam))
{
active=TRUE
}
else
{
active=FALSE;
}
return 0;
}

واذا كانت WM_SYSCOMMAND فيوجد احتمالين .. اذا كانت wParam قيمتها SC_SCREENSAVE او SC_MONITORPOWER فان حافظة الشاشة screen saver تحاول البدء او ان الشاشة سوف تدخل في طور المحافظة على الطاقة اي اعندما تغلق الشاشة بعد فترة من عدم لمس الكمبيوتر

CODE
case WM_SYSCOMMAND:
{
switch (wParam)
{
case SC_SCREENSAVE:
case SC_MONITORPOWER:
return 0;
}
break;
}

اما اذا كانت WM_CLOSE فسوف يغلق البرنامج

CODE
case WM_CLOSE:
{
PostQuitMessage(0);
return 0;
}
case WM_KEYDOWN:
{
keys[wParam] = TRUE;
return 0;
}
case WM_KEYUP:
{
keys[wParam] = FALSE;
return 0;
}
case WM_SIZE:
{
ReSizeGLScene(LOWORD(lParam),HIWORD(lParam));
return 0;
}
}
return DefWindowProc(hWnd,uMsg,wParam,lParam);
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
BOOL done=FALSE

القسم التالي من الكود يخبرك عند تشغيل البرنامج اذا ماكنت تريد تشغيله بكامل الشاشة ام لا

CODE
if (MessageBox(NULL,”Would You Like To Run In Fullscreen Mode?”, “Start FullScreen?”,MB_YESNO|MB_ICONQUESTION)==IDNO)
{
fullscreen=FALSE;
}

الكود التالي لانشاء نافذة OpenGL مع الكتابة في أعلى البرنامج title وهنا مكتوب NeHe’s OpenGL Framework وتستطيع كتابة اي جملة اخرى مكانها

CODE
if (!CreateGLWindow(“NeHe’s OpenGL Framework”,640,480,16,fullscreen))
{
return 0;
}
while(!done)

{

والان نقوم بالتأكد اذا ماكانت هناك رسائل ترد الى البرنامج لتطبيقها وجعل البرنامج يتعامل معها

CODE
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
if (msg.message==WM_QUIT)
{
done=TRUE;
}
else
{
TranslateMessage(&msg);

DispatchMessage(&msg);
}
}
else
{

وان لم تكن هناك اي رسائل خطأ سوف تعرض شاشتنا
في السطر الاول نرى ان كانت نافذتنا في الواجهة ام لا
وفي السطر الثاني نخبر البرنامج انه عند الضغط على الزر Esc يجب عليه الخروج من البرنامج

CODE
if (active)

{
if (keys[VK_ESCAPE])
{
done=TRUE;
}
else
{

DrawGLScene();
SwapBuffers(hDC);
}
}

السطر التالي يجعلنا قادرين على الخروج من طور الشاشة الكاملة والعودة الى الوضع التالي عن طريق الضغط على الزر f1

CODE
if (keys[VK_F1])
{
keys[VK_F1]=FALSE;
KillGLWindow();
fullscreen=!fullscreen;
if (!CreateGLWindow(“NeHe’s OpenGL Framework”,640,480,16,fullscreen))
{
return 0;
}
}
}
}

نهاية سعيدة ..

الكاتب: AlDeaj
نُشر في <a href="https://max4arab.com/category/%d8%af%d8%b1%d9%88%d8%b3-%d8%a8%d8%b1%d9%85%d8%ac%d8%a9-%d8%a7%d9%84%d8%a7%d9%84%d8%b9%d8%a7%d8%a8/" rel="category tag">دروس برمجة الالعاب</a>، <a href="https://max4arab.com/category/%d8%b9%d8%a7%d9%85/" rel="category tag">عام</a> الموسومة <a href="https://max4arab.com/tag/%d8%a7%d8%b9%d8%af%d8%a7%d8%af%d8%a7%d8%aa-%d9%84%d9%8a%d9%86%d9%83%d8%b3/" rel="tag">اعدادات لينكس</a>، <a href="https://max4arab.com/tag/%d8%a8%d8%b1%d8%a7%d9%85%d8%ac-%d9%84%d9%8a%d9%86%d9%83%d8%b3/" rel="tag">برامج لينكس</a>، <a href="https://max4arab.com/tag/%d8%aa%d8%b9%d9%84%d9%8a%d9%85-%d9%84%d9%8a%d9%86%d9%83%d8%b3/" rel="tag">تعليم لينكس</a>، <a href="https://max4arab.com/tag/%d8%aa%d9%84%d9%85%d9%8a%d8%ad%d8%a7%d8%aa-%d9%84%d9%8a%d9%86%d9%83%d8%b3/" rel="tag">تلميحات لينكس</a>، <a href="https://max4arab.com/tag/%d8%af%d8%b1%d9%88%d8%b3-%d8%a8%d8%b1%d9%85%d8%ac%d8%a9-%d8%a7%d9%84%d8%a7%d9%84%d8%b9%d8%a7%d8%a8/" rel="tag">دروس برمجة الالعاب</a>، <a href="https://max4arab.com/tag/%d8%af%d8%b1%d9%88%d8%b3-%d9%84%d9%8a%d9%86%d9%83%d8%b3/" rel="tag">دروس لينكس</a>، <a href="https://max4arab.com/tag/%d8%b4%d8%a8%d9%83%d8%a7%d8%aa-%d9%84%d9%8a%d9%86%d9%83%d8%b3/" rel="tag">شبكات لينكس</a>، <a href="https://max4arab.com/tag/%d9%84%d9%8a%d9%86%d9%83%d8%b3-%d9%84%d9%84%d9%85%d8%a8%d8%aa%d8%af%d8%a6%d9%8a%d9%86/" rel="tag">لينكس للمبتدئين</a>، <a href="https://max4arab.com/tag/%d9%84%d9%8a%d9%88%d9%86%d9%83%d8%b3/" rel="tag">ليونكس</a>

الموسوعة: مكتبات ومراجع مهمة لبرمجة الالعاب


السلام عليكم :

هذا موضوع سأجمع فيه ما اعرفه من مكتبات تساعد على برمجة الالعاب .. المكتبات مفيدة جدا .. ولا تمنع او تعيق التفكير كما يعتقد البعض ..
سأجزئ الموضوع عدة اجزاء .. لاني ما اكملته الى الان ..

الموضوع سيكون مفيدا لاهل الدايركت اكس وopengl ان شاء الله .. لو ان opengl له مكانة خاصة ..

رح ندخل بالفيزياء

< physics >




اولا مكتبة : tokamak

http://www.tokamakphysics.com/


التعليق :
مكتبة جيدة … تمكنك من عمل تطبيقات فيزيائية .. سواء ثنائية او ثلاثية ..

المميزات : مجانية .
ليست كبيرة جدا .. وبالتالي يسهل تعلمها ..
تستطيع استخدامها في مكتبة الدايركت اكس و OPENGL

العيوب : قلة الامثلة والدروس ..

التحميل:/
http://www.tokamakphysics.com/demos.htmوهو رابط المكتبة الرئيسي

2- ,وفيه المكتبة الرئيسية SDK مع الامثلة .. وبعض الامثلة تتطلب وجود مكتبة GLUT التابعة لـOPENGL


3- هنا دروس حول المكتبة وربطها بالدايركت اكس من احد المواقع

http://www.codesampler.com/source/dx9_tokamak_stack.zip

http://www.codesampler.com/source/dx9_tokamak_geometry.zip

http://www.codesampler.com/source/dx9_tokamak_chain.zip

4- هنا دروس حول المكتبة وربطها بـopengl من احد المواقع :

http://www.codesampler.com/source/ogl_tokamak_chain.zip

http://www.codesampler.com/source/ogl_tokamak_stack.zip



ثانيا : مكتبة NovodeX
http://www.ageia.com/novodex.html
التعليق: افضل مكتبة فيزيائية موجودة للكثير من الاسباب .. اضف الى توافقها مع الدايركت اكس وopengl ….

المميزات :1- مجانية(( ولكن بحدود ))
2- كثرة الامثلة والدروس والتي تصل لاكثر من خمسين مثال ..
3- ملفات مساعدة مميزة ومنظمة .. ملفات وورد كدروس .. ملف pdf كموجه لك في البداية ..
4- بامكانك استغلال مميزاتها من خلال 3d max .. ( اعتقد كمقبس )
5- متطورة وتحدث باستمرار .

العيوب : لا اعتقد تحتوي على عيوب … ترفع الضغط : )

التحميل :لابد ان تسجل عندهم لتحملها .. لكن انا سجلت وارسلوا لي الرابط ..
فاذا تعطلت الروابط رح لموقعهم وسجل ..

رابط المكتبة :

ftp://ageiadevbinwin:a78yuB*2@ftp.ageia.c…deX_SDK_2.2.exe

حجمها 29 ميقا وتوها طالعة من الفرن حارة حارة ..
لكن لايهمك حجمها … فيها كل ما تريد ..

تحتوي على دروس وملفات ومساعدة اضافة لعدة التطوير .. ومقبس للماكس .

وهنا :

ftp://ageiadevbinwin:a78yuB*2@ftp.ageia.c…ingPrograms.exe

توجد دروس اخرى رااااااااااائعة …وحجم الملف 7,5 ميقا لكن يستاهل التحميل
لو هو 3 قيقا ..

تنبيه كبيــــــــــــــــــــــــــــــــــــر :
الامثلة مكتوبة بopengl يعني يا محبين الدايركت اكس وي ار سوري
وهذا لصالحنا : ) ياجماعة الاوبنجل

لكن لايهمك .. كل ماتحتاجه سهل وواضح … حتى opengl لم يستخدمها الا في امور بسيطة ..
والنافذة بناها باستخدام المكتبة glut ..

امثلة اخرى :1-
وهو مثال حول هذه المكتبة بالدايركت اكس .
http://www.codesampler.com/source/dx9_novodex_simple.zip

2- وهو مثال حول هذه المكتبة بopengl ..
http://www.codesampler.com/source/ogl_novodex_simple.zip

تعليق ختامي : اللي ما يحمل المكتبة هذه خسران ….



ثالثا: مكتبة نيوتن الفيزيائية ..

التعليق :
من اسمها .. نيوتن .. يعني مكتبة احترافية
لكن فيها كم عيب على كم مشكلة . لكن تستحق وبلا ادنى اشك التحميل

المميزات :
وجود دروس وامثلة كافية .
تتطور باستمرار .
مجانية .,
اسمها سهل الحفظ

العيوب :
لا ترتقي للطموحات >>> تكفى يا طموح …


التحميل : من هنا :

http://www.newtondynamics.com/downloads/SetupSDK05.zip
وستجد بهذه الصفحة امثلة كثيرة .
لكن حمل الخاص بالويندوز فقط .. انتبه .
http://www.newtondynamics.com/downloads.html




رابعا :OPAL
/http://opal.sourceforge.net/index.html

مكتبة OPENGL الفيزيائية حلم وصار حقيقة … وجاءت بعد ولادة متعسرة

هنا الصفحة وهي واضحة … وبالتالي التحميل سهل ..
http://opal.sourceforge.net/index.html


المميزات /
شبيهة بصيغة OpenGL …وهذا يعني السهولة ..
يتوقع ان يكون لها مستقبل اذا كبرت …. يعني بعد سنين ..

العيوب/
لازالت في طور الحضانة : ) وتحتاج وقت حتى تصبح مكتبة يعتمد عليها لكن مع ذلك تستطيع تجربتها والحكم عليها .



خامسا / Physical_Asteroids
http://www.aidspan.org/alec/physical/index.htm

لا اعرف اسميها مكتبة او لا ..

المميزات :
تعطيك ما تحتاجه من فيزياء لعمل 2d game … ثنائية .. ولا يمكن استغلالها في العاب ثلاثية .. لان هذا صعب .
تحتوي على ادة ممتازة تقوم بتحديد بعض النقاط في مجسمك . ثم تتحكم بهذه النقاط لتقطيع المجسم (الصورة) اربا اربا ..

العيوب :
قلنا 2d game
ومالها ذيك السمعة ..
وتبقى محدودة ..

التحميل /
http://www.aidspan.org/alec/physical/downloads.htm
هذا الموقع ,.. وهو واضح .. اختر download وحمل..
ويوجد ايضا امثلة حليوة ..

تنبيه :
الامثلة تم عملها باستخدام
WIN32 API
OpenGL
Allergo وهي مكتبة العاب ثنائية .. اظنكم سمعتوا عنها ..



سادسا .. مكتبة : ODE

حتى الان المعلومات عنها مجهولة … نظرا للتكتم الاعلامي حول هذه المكتبة .. 👿
لكن بعد تحريات دامت لعدة دقائق تبين لنا انها مكتبة لها سمعة لاباس بها لو انها ما دخلت مزاج اخيكم في الله ..


وهذا الموقع دور فيه ..
http://www.ode.org/
لاني يوم شاهدت تصميم الموقع .. غسلت يدي … وطلعت على طول ..


نكمل في جلسات قادمة منعا للملل : ) ولاني لسا ما خلصت …
واللي عنده اضافات يضعها حتى نستفيد :
ونصيحة صغيرونة .. لايهم كثرة التحميل من غير فائدة .. ركز على احد المكتبات .. حتى تكون الفائدة اكبر .


اذا ا لاخ عروة يقول ممتازة .. فاكيد انها ممتازة ,,
انا ماجربتها … كثير .. عدد من الساعات فقط . ..
===


مكتبة DevIL …. للصور

هذه المكتبة كانت تسمى openil
فائدتها تحميل الصور وتغيير انساقها وحفظها الخ ..
مثلا .. اردت تحميل صورة من نوع TGA ..فانه يلزمك كتابة اكثر من 20 سطر حتى تحملها .. اما هذه المكتبة فتختصر لك الطريق .
قد يقول البعض .. انا لا استخدم مكتبات جاهزة ..
لاي اخي هذه المكتبة مفيدة للغاية ويستعملها حتى المحترفون .. فما بالك بمبتدئ .. وهي تختصر عليك الوقت والامور الروتينية المملة ,,, فانت في النهاية ستبني مكتبة مشابهة .. فلماذا لاتستخدمها من البداية ,

المميزات / 1- سهلة جد وشبيهة بمكتبة OPENGL ..

2- تدعم الكثير من انساق الصور .
فهي تستطيع تحميل :
.bmp, .cut, .dds, .doom, .gif, .ico, .jpg, .lbm, .mdl, .mng, .pal, .pbm, .pcd, .pcx, .pgm, .pic, .png, .ppm, .psd, .psp, .raw, .sgi, .tga and .tif files.
وتستطيع حفظ
.bmp, .dds, .h, .jpg, .pal, .pbm, .pcx, .pgm,.png, .ppm, .raw, .sgi, .tga and .tif.

وكما ترى … هذه المكتبة كنز … وكنز ثمين ايضا .

3- تتستطيع استخدامها مع .
OpenGL,
Windows GDI,
SDL,
DirectX
Allegro.
وضع ثلاث وثلاثين خط .. تحت OPENGL ,DIRECTX وALLEGRO

4- تستطيع استخدام هذه المكتبة مع عدد من اللغات والمترجمات ..
Djgpp, MSVC++, Linux gcc, Delphi, Visual Basic, Power Basic and Dev-C++.

5- تستطيع تحميل الصور .. حفظها في صيغ اخرى .. اضافة تأثيرات الى الصور .. والتحكم بالصورة وخصائصها ,, >>> على كلامهم ..

العيوب :1- قلة الامثلة . .. دورت وما لقيت مثال واحد .. كلها نص امثلة ..
2- اسمها ما عجبني >>>


الموقع : http://openil.sourceforge.net/download.php
هذا الموقع .. دور فيه على كيفك .. لكن ستصل بالنهاية لما تريد .. بعد شوية عرق وتعب : )


هذا ما اعرف عن مكتبات الصور ..


http://sourceforge.net/projects/mathgl-pp/
مكتبة رياضية جيدة ,, ميزتها :
صيغتها مشابهة لصيغة opengl يعني syntax ….الا انها ليست بتلك الضخامة التي قدد تتخيلها ..

ولكن بكل تأكيد انها ستكفيك ..



http://gltext.sourceforge.net/home.php
مكتبة جيدة جدا للopengl لتصيير الخطوط ..
تعلم ان Opengl لايحتوي على دوال للخطوط .. وبالتالي اكثر من مكتبة سارعت بتقديم هذه الدوال على طبق من ذهب ومنها هذه المكتبة .

جربتها .. و هي سهلة .. لكن تحتاج الى سعة صدر .


==
Blitz++ http://www.oonumerics.org/blitz/

المكتبة الرياضية المعروفة … Blitz++ .. اقل شيء اقدر اقوله عنها انها ضخمة .. لكن ما جربتها ..
ممكن تستفيد منها وتسخرها لالعابك ..اذا احتجت شيء ..

ميزتها .. وجود ملف مساعدة ضخم .. ودعم .. وامثلة .

——
مكتبة ..GLEW
http://glew.sourceforge.net

مكتبة ..GLEW .. الممتازة .. الان تستطيع تطوير تطبيقات متطورة .. وجرافكس عالي الجودة .
حيث ان GLEW . هو ملف يحتوي على امتدادات كثيرة لOPENGL .. وبعضها لقوته لن يكون مدعوما ..

واذا نقصك امتداد معين ولم تجده .. فحمل المفات اللموجودة بالمرفقات … فهي ايضا ممتازة .



مكتبة GLUT : مكتبة رائعة تساعدك هلى تطوير العابك . من حيث تقديم دوال جاهزة لانشاء النوافذ والتعامل معها وفيها مكتبة ادخال ممتازة .. ودوال للخطوط .. ودوال اخرى ممتازة .

ومن اهم ميزاتها انها تشتغل على اكثر من نظام .. الويندوز واللينكس .. بدون تغيير حرف واحد .

من هنا حملها .. وستجد ثلاث ملفات ملف الدل .. و المكتبة والهيدر .

http://www.xmission.com/~nate/glut/glut-3.7.6-bin.zip

ومن هنا حمل هذه المرجع .

http://www.opengl.org/resources/libraries/…glut-3.spec.pdf

والامثلة كثيرة حوال هذه المكتبة .


وهنا رابط لمكتبة يقول صاحبها انه طورها.

http://freeglut.sourceforge.net/



الملفات المرفقة
ext.zip ( 55.4k ) عدد مرات التحميل: 18


الان سندخل في اعماق opengl ونذكر بعض المصادر والمراجع المهمة ..

هنا دليل لدوال مكتبة gl

http://pyopengl.sourceforge.net/documentat…ference-GL.html

http://msdn.microsoft.com/library/default….func03_2kag.asp

وهنا دليل لدوال مكتبة glu التابعة لopengl

http://pyopengl.sourceforge.net/documentat…erence-GLU.html

او هنا

http://msdn.microsoft.com/library/default….func03_2kag.asp

وهنا دليل .. شامل لدوال مكتبة glut الرائعة ..

http://pyopengl.sourceforge.net/documentat…rence-GLUT.html

وهنا كتاب opengl الرائع (لو انه النسخة القديمة )

http://fly.cc.fer.hr/~unreal/theredbook/theredbook.zip

الكتابred book هو المرجع الاساسي ..
طبعا مجاني ..


وهنا فيه شرح لمعظم دوال opengl

http://www.cevis.uni-bremen.de/~uwe/opengl/oglhtml.tar.gz


وهنا شرح لجميع دوال opengl وذلك من كتاب reference manual ..

http://rush3d.com/reference/opengl-bluebook-1.0/ch05.html

http://rush3d.com/reference/opengl-bluebook-1.0/ch06.html

http://rush3d.com/reference/opengl-bluebook-1.0/ch07.html

وهنا شرح لبعض المتغيرات والثوابت ..

http://msdn.microsoft.com/library/default….func03_2kag.asp

وهنا من موقع msdn شرح لبعض الامتدادات الخاصة بالويندوز والتي
برمجت خصيصا لopengl

http://msdn.microsoft.com/library/default….func03_2kag.asp

وهنا ايضا

http://msdn.microsoft.com/library/default….func03_2kag.asp

واخيرا اختم بهذا الكتاب المجاني
http://www.larswolter.de/OpenGL-Extensions.chm

وهو عن امتدادات opengl وهو للفاهمين بالامتدادت .. وطريقة التعامل معها .



تنبيه :
بعض المراجع والكتب يكون نسخة من المواقع الاخرى … لذا قد لاتجد اختلافات كبيرة.


=-=-=-=-=-=-=-
للمزيد انقر هنا
http://www.arabteam2000-forum.com/index.php?showtopic=70979
الكاتب: الشمري
نُشر في <a href="https://max4arab.com/category/%d8%af%d8%b1%d9%88%d8%b3-%d8%a8%d8%b1%d9%85%d8%ac%d8%a9-%d8%a7%d9%84%d8%a7%d9%84%d8%b9%d8%a7%d8%a8/" rel="category tag">دروس برمجة الالعاب</a>، <a href="https://max4arab.com/category/%d8%b9%d8%a7%d9%85/" rel="category tag">عام</a> الموسومة <a href="https://max4arab.com/tag/%d8%a7%d8%b9%d8%af%d8%a7%d8%af%d8%a7%d8%aa-%d9%84%d9%8a%d9%86%d9%83%d8%b3/" rel="tag">اعدادات لينكس</a>، <a href="https://max4arab.com/tag/%d8%a8%d8%b1%d8%a7%d9%85%d8%ac-%d9%84%d9%8a%d9%86%d9%83%d8%b3/" rel="tag">برامج لينكس</a>، <a href="https://max4arab.com/tag/%d8%aa%d8%b9%d9%84%d9%8a%d9%85-%d9%84%d9%8a%d9%86%d9%83%d8%b3/" rel="tag">تعليم لينكس</a>، <a href="https://max4arab.com/tag/%d8%aa%d9%84%d9%85%d9%8a%d8%ad%d8%a7%d8%aa-%d9%84%d9%8a%d9%86%d9%83%d8%b3/" rel="tag">تلميحات لينكس</a>، <a href="https://max4arab.com/tag/%d8%af%d8%b1%d9%88%d8%b3-%d8%a8%d8%b1%d9%85%d8%ac%d8%a9-%d8%a7%d9%84%d8%a7%d9%84%d8%b9%d8%a7%d8%a8/" rel="tag">دروس برمجة الالعاب</a>، <a href="https://max4arab.com/tag/%d8%af%d8%b1%d9%88%d8%b3-%d9%84%d9%8a%d9%86%d9%83%d8%b3/" rel="tag">دروس لينكس</a>، <a href="https://max4arab.com/tag/%d8%b4%d8%a8%d9%83%d8%a7%d8%aa-%d9%84%d9%8a%d9%86%d9%83%d8%b3/" rel="tag">شبكات لينكس</a>، <a href="https://max4arab.com/tag/%d9%84%d9%8a%d9%86%d9%83%d8%b3-%d9%84%d9%84%d9%85%d8%a8%d8%aa%d8%af%d8%a6%d9%8a%d9%86/" rel="tag">لينكس للمبتدئين</a>، <a href="https://max4arab.com/tag/%d9%84%d9%8a%d9%88%d9%86%d9%83%d8%b3/" rel="tag">ليونكس</a>

الطريق الى برمجة الالعاب الاحترافية

السلام عليكم:

أود ان اضيف هذا الموضوع هنا بعد ان اضفته لاحد المنتديات ولكن … لعدم التفاعل تركت ذلك المنتدى
لذا اتمنى ان تقبلوني عضوا لديكم في هذا الصرح الشامخ….
بعد مرور سنتين على دخولي هذا المجال كان شغلي الشاغل البحث عن الامثلة والاكواد والدروس حتى جمعت مصادر جيدة .
ولكن رأيت ان كل من كان جديدا على هذا العالم ((((عالم برمجة الالعاب )))
لديه سؤال واحد كيف ابرمج لعبة مثل فاينال فانتسي ……اففففففففف متأثر…
فهو كالشمعة يولع ثم يطفي بعد شهرين.
لذلك احببت ان اجمع هذه المواقع في موضوع واحد لعله يفيد
فمن وجد فيه الفائدة فالحمدلله .
ومن رآه تافها فالشكوى الى الله.
ومن رآه مكررا فما باليد حيلة.

اولا اقرأ النصايح المتواضعة واعذرونا ان كان فيها اخطاء (مقدما)
1- اول اجعل نيتك في برمجة الالعاب خالصة لله من حيث نصرة الاسلام والرد على الالعاب المغرضة اليهودية والنصرانية وغيرها.
2- الطريق صعب ولكن ليس مستحيل (ماتحتاجه بعد الاستعانة بالله ) (الوقت+ الصبروالمواصلة على التعلم) هذه بعض درر يزيد الدليقان (((والله انه صدق)))
3- الطريق لبرمجة الالعاب الاحترافية طريقين لا ثالث لهما:
directx xxxxx opengl
والطريقان يوصلانك الى نهاية متشابهه تقريبا.

كيف اتعلمهما…

اولا لازم تكون مبرمج سي بلس بلس محترف (ممكن بالبيسك ولكن انا اتحدث عن الاحتراف) ,وتعلم السي سهل بإذن الله
ولكن لابد من ان يكون لديك مصادر جيدة للتعلم وياليت تبحث عن كتاب عربي مميز (ركز على مميز)يعني ليس اي كتاب وان لم تجد فمن الدروس المنتشرة والمواقع الكثيرة وليس المجال لذكرها هنا ….
ولكن لغة السي بلس تحتوي على مفاهيم جديدة على البعض مثل مؤشرات او الفئات وغيرها
ولكن اتمنى ان لاتصدم ولاتيأس بسبب بعض الصعوبات التي تواجهك عند البداية يعني لاتقعد تمنى وتمنى وانت ماتعمل شي اجتهد وتعلم واحذر من بعض الدروس والاكواد البرمجية التي تجلب اليأس
وتعلم السي بلس (من تجربة ) يحتاج اقل 5 مدة اشهر وافرض انك جلست على السي بلس سنة كاملة يعني وش يبي يصير !!!!!!
وامر اخر هو غير اساسي ولكن مهم
وهو تعلم برمجة تطبيقات ويندوز من خلال دوال API
حيث ستواجه في اول درس عمل نافذة من خلال دوال API ا
هناك كتاب مجاني مترجم للعربية
http://winprog.org/tutorial/files/f…rial-arabic.zip
وهنا الامثلة
http://www.winprog.org/tutorial/files/source.zip
وابحث في منتدى السي بلس ستجد دروس متفرقة
WWW.ARABTEAM2000.COM
ودوال api سهلة جدا ولكنها طويلة فقط.

============
ثانيا:
تقرر ماهو مصير التعب اللي تعبته بتعلم السي هل سيذهب هباء منثورا والا تسخره في شيٍ ممتع واحترافي كبرمجة الالعاب.
اكيد انك تريد برمجة الالعاب (الاحترافية),,, طيب كيف؟
عن طريق برنامج rpg maker او gamestudio !!!! مع احترامي الكامل والكبير لمحبي هالبرامج ولكن ليست لمن يريد الاحتراف. اما من يريد الاحتراف فالطريق ليس صعب
لا اريد كثرة الكلام ..
====
لتبرمج لعبة امامك طريقين سوف نبدأ بالدايركت اكس
مميزاته
1- متطور ويتطور عند كل اصدار من اصدارات الويندوز
2- فيه شركة تدعمه وهي مكروسفت
3- وجود dx sdk فيه ملف تعليمات ضخم طبعا شرح لجميع دوال الدايركت جرافييكس صوت فيديو شبكات اللي تبي
4- دعم رهيب ل الاصوات والفيديو والشبكات فيستفيد منها حتى غير مبرمجي الالعاب
البداية
طبعا لازم يكون بجهازك دايركت اكس 9 تقدر تنزله من اي موقع للبرامج عربي او انجليزي حجمه حوالي 13 ميقا
ثانيا
نزل directx 9 sdk
اهم شي فيه انه يوفر ملفات راسية للغة السي تمكنك من تطوير العابك من خلاله.
وفيه ملف تعليمات واكثرمن 30 مثال للجرافيكس هذا عدا الاصوات والفيديو والشبكات
http://www.microsoft.com/downloads/…&displaylang=en

حجمه 99 ميقا ..صحيح كبير ولكن تتعب يوم في حياتك وتنسى واذا ماحملته لاتعب نفسك وتحاول تعلم الدايركت
لانكلو ماحملته ستفقد الملفات الرأسية+ملف التعليمات الضخم+الامثلة الدسمة+……خلاص

===
ثالثا:اذهب لها الوصلة وراح تعلم الانطلاقة
http://www.arabteam2000-forum.com/index.php?showtopic=37155

====
الامثلة:
الامثلة كثيرة ولكن المميز قليل
من المواقع الرائعة جدا جدا جدا جدا جدا جدا ……
http://www.codesampler.com/dx9src.htm
فيه مايزيد على 45 مثال من الصفر حتى الاحتراف طبعا بدون شرح ولكن عندك ملف التعليمات اذا مافهمت دالة معينة ابحث عنها
—–
http://www.ultimategameprogramming….=DirectX&page=1
فيه امثلة جيدة حوالي 38 مثال من الصفر حتى تتعمق قليلا .. وانتبه فيه عدة صفحات في الموقع
————-
http://www.gametutorials.com/
للاسف الموقع كان مجاني الى وقت قريب تقريبا قبل شهر ولكن الحين صار الملف الواحد ب 5 دولار….
والحمدلله حملت بعض الامثلة يوم كان مجاني ولكن من اراد ان يشتري فليذهب اليه وفيه امثلة على السي+السي بلس+opengl+api
——-
http://www.drunkenhyena.com/
ابحث في الموقع ستجد حوالي 10 امثلة تمشي الحال
وتلك اهم الامثلة,,,,
ولكن هناك عدد من الدروس والمواقع العامة سوف اذكرها في نهاية الموضوع.
-كتب الدايركت اكس:
كنت من عشاق جمع كتب الدايركت اكس فقد جمعت حوالي 8 كتب ……
ولكن لم استفد من كتاب واحد (((لماذا )))
لأن اسلوب الكتب يرفع الضغط فيشرح دالة معينة صفحة كاملة….حتى يجيك النوم ….من غير فائدة…

الخلاصة :
لاتعقد الأمل كثيرا على الكتب فكل ماهو بالكتب هو نسخة مما هو على النت….اعني الدايركت اكس فقط.
وبما اننا ذكرنا مميزات الدايركت اكس سأذكر بعض عيوبها:
1-تحتاج لمحترف في السي بلس فهي كائنات ودوال وثوابت طويلة صعبة الحفظ (وجهة نظري)
2-مخصصة لبيئة ويندوز فقط.
3-قلة الامثلة واختلافها من اصدار لآخر .
——————————————————————————————————–
الطريق الآخر
OPENGL
وهي المكتبة التي اخترتها حديثا وفضلتها على الدايركت اكس لعدة امور اهمها
1- انها صدرت قبل الدايركت اكس فهي اقوى فكل اصدارات الدايركت اكس هي محاولة للوصول لمستوى OPENGL .
2-مكتبة متنقلة تعمل على مختلف الانظمة
3- كثرت الامثلة والتي تعد بالمئات لدرجة ان بعض الكتب التي تختص بالفيزياء والرياضيات تضع امثلة مكتوبة بOPENGL
4-اهم ميزة على الاطلاق::::: اسهل وبمراحل من الدايركت اكس فهي عبارة عن دوال+ثوابت+متغيرات
تفهم فائدتها وخلاص.

الامثلة :
1-الموقع المشهور جددددددا
http://nehe.gamedev.net/
وحتى اختصر عليكم الوقت
حمل من هنا الكتاب حيث يحتوي على الدروس+شرحها((اكثر من 45 مثال))
http://nehe.gamedev.net/counter.asp…_opengl_chm.zip
والامثلة ستجدها في صفحة الدروس كل درس ينتهي بمثال
حمل المثال الخاص بالسي بلس بالعادة اول رابط

وابحث في الموقع السابق عن بعض الدروس الاخرى المتنوعة وبعض الروابط.

2- موقع رائع فيه اكثر من 40 مثال
http://www.codesampler.com/oglsrc.htm

3-موقع فيه عدد ضخم من الامثلة:
http://www.ultimategameprogramming….y=OpenGL&page=1

4-موقع كان مجاني لكن صار بفلوس ستجد قسم –FREE– فيه حوالي5 امثلة حملها.
http://www.gametutorials.com/gtstor…-tutorials.aspx

http://www.gametutorials.com/gtstore/c-1-test-cat.aspx

5-رابط فيه صفحة كاملة لامثلة:
http://www.opengl.org/resources/code/index.html

6-موقع رئيسي للOPENGL
WWW.OPENGL.ORG
فيه كتيبات وامثلة ودروس وملفات الرأسية و..و…..
7-موقع فيه امثلة لالعاب صغيرة وامثلة متنوعة (للمحترفين)
http://www.xdev.ru/dxgp/rgd_article…t=ogl_0000_list

8- وثيقة
http://www.eecs.tulane.edu/www/Terr…troduction.html

9-GOOGLE
موقع للبحث اكتشفته حديثا ……..
دور فيه عن اي درس مثلا
OPENGL TERRAIN
اللي تبي….

عيوب opengl
1- تحس انها مشتتة وليست بتنظيم الدايركت اكس.(((اتفلسف)))
2- لم اجد ملف مساعد يشرح جميع الدوال بتنظيم ودقة كما في الدايركت اكس.
3-دعمها للشبكات ضعيف (هذا ان وجد) ولكن تستخدم directx play
ومع ذلك تلك العيوب بسيطة ولاتذكر امام مميزاتها.

الفيزياء:
هالكلمة تسوي زحمة
وتخوف…..وتكره بالبرمجة
===
هنا محرك فيزيائي مجاني:
http://www.tokamakphysics.com/
ويوجد في الموقع http://www.codesampler.com ثلاث امثلة على المحرك سواء للدايركت اكس او OPENGL
وفي موقع http://www.tokamakphysics.com امثلة على المحرك .
والمحرك مميز تستفيد منه فيه اصطدام وقفز وغيرها .
وتوجد امثلة هنا لاحد كتب الفيزياء المختصة في برمجة الالعاب
http://examples.oreilly.com/physicsgame/
وهنا مثالين باستخدام دوال api رائعين جدا
http://www.gametutorials.com/gtstor…amics_Win32.zip

http://www.gametutorials.com/gtstor…amics_Win32.zip

والفيزياء لاتخاف منها ولايتقنها الا العمالقة لانك لو اتقنتها 100% فان شركة SONY ستخطفك…..
ولكن تحذير :::::::
اذا لم تدرس في المدرسة المتجهات+قوانين نيوتن +المقذوفات الأسية والمنحنية وغيرها من المواضيع الاساسية فاني اشك انك ستتعلم الفيزياء من خلال المواقع فانتظر حتى تكبر و تدرسها
اما الرياضيات اهم شي تعرف الجمع والطرح والمصفوفات والدوال المثلثية (جتا وجا وطقتها) —- سهلة بالسعودية ناخذها بثاني ثانوي—-

::::مواقع عامة مفيدة::::
WWW.GAMEDEV.NET
WWW.FLIPCODE.COM
WWW.CODEPROJECT.COM
http://www.planet-source-code.com/v…lt.asp?lngWId=3
ويوجد عدد من الدروس المتناثرة هنا وهناك لذلك ابحث واسأل.
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
طبعا هناك تقنيات متقدمة تبرمجها بالدايركت اكس او opengl على سبيل المثال cg arb shaders وهي متقدمة وتتطلب كرت جرافكس قوي
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
هذا ماوددت قوله ,,,,
واذكرك ان لاتستخدم برمجة الالعاب الا بالخير …الا هل بلغت اللهم فاشهد….

والسلام عليكم ورحمة الله وبركاته

 

 

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
لمناقشة الموضوع في المنتدى
 

http://www.arabteam2000-forum.com/index.php?showtopic=58172
 

نُشر في <a href="https://max4arab.com/category/%d8%af%d8%b1%d9%88%d8%b3-%d8%a8%d8%b1%d9%85%d8%ac%d8%a9-%d8%a7%d9%84%d8%a7%d9%84%d8%b9%d8%a7%d8%a8/" rel="category tag">دروس برمجة الالعاب</a>، <a href="https://max4arab.com/category/%d8%b9%d8%a7%d9%85/" rel="category tag">عام</a> الموسومة <a href="https://max4arab.com/tag/%d8%af%d8%b1%d9%88%d8%b3-%d8%a8%d8%b1%d9%85%d8%ac%d8%a9-%d8%a7%d9%84%d8%a7%d9%84%d8%b9%d8%a7%d8%a8/" rel="tag">دروس برمجة الالعاب</a>