ضيفنا الكريم زائر منتدى تسالة
---------------------------------------------------------
حللت أهلاً .. ووطئت سهلاً ..
أهلاً بك بين اخوانك واخواتك
آملين أن تلقى المتعة والفائدة معنا
.:: حيـاك الله ::.

يسعدنا انضمامك لاسرتنا للتسجيل أنقر هنا

برمجة الألعاب والجرافكس باستخدام مكتبة OpenGL .

اذهب الى الأسفل

برمجة الألعاب والجرافكس باستخدام مكتبة OpenGL .

مُساهمة من طرف tessala في الإثنين مايو 25, 2009 7:11 pm

مقدمة مملة ..
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 للمكتبات التي قمنا باضافتها
كود
الكود:
#include  // الملف الرأسي لويندوز  Header File For Windows
#include  // الملف الرأسي للمكتبة  OpenGL32
#include  // الملف الرأسي للمكتبة  GLu32
#include  //  الملف الرأسي للمكتبة  GLaux


عدل سابقا من قبل tessala في الإثنين مايو 25, 2009 7:19 pm عدل 1 مرات

_________________
avatar
tessala
المدير العام
المدير العام

آخرمكافآت العضو :
الجنس : ذكر
عدد الرسائل : 1551
العمر : 51
العمل/الترفيه : صاحب الببيت
المزاج : مشغول
تعاليق الادارة : مرفوع من الخدمة
نقاط الشهرة : 5892
السٌّمعَة : 22
تاريخ التسجيل : 03/12/2008

http://tessala.up-with.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: برمجة الألعاب والجرافكس باستخدام مكتبة OpenGL .

مُساهمة من طرف tessala في الإثنين مايو 25, 2009 7:12 pm

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

كود
الكود:
HGLRC          hRC=NULL;
HDC            hDC=NULL; 
HWND            hWnd=NULL;
HINSTANCE      hInstance

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

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

كود
الكود:
LRESULT    CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);


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

كود
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 تقريبا فهو يعيد المصفوفة المختارة الى حالتها الاولى

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

كود
الكود:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW);   
glLoadIdentity();
}

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

كود
الكود:
int InitGL(GLvoid)
{

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

كود
الكود:
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) فاننا سوف نحصل على على لون أحمر متوسط
وليس احمر فاتح او احمر داكن .. وهكذا .
في الكود التالي سوف نقوم بوضع جميع القيم صفر اي اننا سوف نحصل على اللون الأسود للخلفية

كود
الكود:
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

الأسطر
الثلاثة التالية لتحديد العمق في الشاشة .. مثلا لدينا كائنين على الشاشة
ونريد ان نظهرهما بمظهر ثلاثي الأبعاد او ان نظهر احداهما خلف الاخر فاذا
افترضنا بانه لدينا مربع ودائرة نريد عرضهما على الشاشة بحيث يكونا في
بعدين مختلفين اي ان المربع بعيد والدائرة قريبه من الشاشة فمن االطبيعي
ان الدائرة سوف تغطي على المربع او اجزاء منه اذا تقاطعا على خط واحد .
ومهمة الكود التالي هي توزيع الكائنات في فضاء الشاشة .. بما اننا الان
نقوم بعمل شاشة فارغة فقط فاننا لانحتاج الو وضع قيم لاي كائنات ونكتفي
الان بتعريفه فقط
كود
الكود:
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);

في السطر التالي نخبر OpenGL بتصحيح المنظور ليخرج لنا اداء افضل للمشهد ولو قليلا
كود
الكود:
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);   
return TRUE;
}

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

كود
الكود:
GLvoid KillGLWindow(GLvoid)
{

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

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

كود
الكود:
ChangeDisplaySettings(NULL,0); 
ShowCursor(TRUE);
    }

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

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

كود
الكود:
if (!wglMakeCurrent(NULL,NULL))
  {
اذا لم يستطلع البرنامج تحرير hRC سوف يقوم باظهار رسالة تخبرنا بذلك
كود
الكود:
MessageBox(NULL,"Release Of DC And RC Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
  }
نقوم الآن بمحاولة حذف delete hRC

كود
الكود:
if (!wglDeleteContext(hRC))


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

كود
الكود:
MessageBox(NULL,"Release Rendering Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
  }
hRC=NULL;
 
    }

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

كود
الكود:
if (hDC && !ReleaseDC(hWnd,hDC))
{
  MessageBox(NULL,"Release Device Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
hDC=NULL;
}
ونفس الامر السابق نستخدمه مع Window Handle ونرى امكانية عمل تحطيم destroy لها كما هو واضح من
DestroyWindow(hWnd) الموجود في الكود واذا فشلنا سوف تظهر رسالة تخبرنا بذلك

كود
الكود:
if (hWnd && !DestroyWindow(hWnd))   
{
MessageBox(NULL,"Could Not Release hWnd.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
hWnd=NULL;
}

الشئ
الاخير الذي نقوم به هو عمل unregister لصنف النوافذ Windows Class حتى
لاتردنا اي رسالة خطأ اثناء تشغيل البرنامج مرة اخرى واذا فشلنا تظهر لنا
رسالة تخبرنا بذلك
كود
الكود:
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
يعني العكس
كود
الكود:
BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag)
 {
عندما نريد ايجاد صيغة البكسل pixel الذي يتوافق مع عملنا سوف تقوم النافذة بتحديدها وجعلها في المتغير PixelFormat

كود
الكود:
GLuint  PixelFormat;

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

كود
الكود:
WNDCLASS    wc;
DWORD    dwExStyle;
DWORD    dwStyle;
الاسطر الخمس التالية نقوم بتحديد موقع النافذة وسوف نفصل فيه لاحقا

كود
RECT WindowRect;
WindowRect.left=(long)0;
WindowRect.right=(long)width;
WindowRect.top=(long)0;
WindowRect.bottom=(long)height;


عدل سابقا من قبل tessala في الثلاثاء مايو 26, 2009 1:52 am عدل 1 مرات

_________________
avatar
tessala
المدير العام
المدير العام

آخرمكافآت العضو :
الجنس : ذكر
عدد الرسائل : 1551
العمر : 51
العمل/الترفيه : صاحب الببيت
المزاج : مشغول
تعاليق الادارة : مرفوع من الخدمة
نقاط الشهرة : 5892
السٌّمعَة : 22
تاريخ التسجيل : 03/12/2008

http://tessala.up-with.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: برمجة الألعاب والجرافكس باستخدام مكتبة OpenGL .

مُساهمة من طرف tessala في الإثنين مايو 25, 2009 7:13 pm

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

كود
الكود:
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
كود
الكود:
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 للصنف واذا حدث اي خطأ سوف تظهر رسالة

كود
الكود:
if (!RegisterClass(&wc))
{
  MessageBox(NULL,"Failed To Register The Window Class.","ERROR",MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}

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

كود
الكود:
if (fullscreen)   
{

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

كود
الكود:
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

كود
الكود:
if (ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL)
{


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

كود
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
ويستمر البرنامج في عمله

كود
الكود:
fullscreen=FALSE;
}
      else
      {
واذا اخترنا الخروج فسوف تظهر رسالة تخبرنا بان البرنامج سوف يغلق
القيمة false تخبر البرنامج بانه يوجد خلل في العمليه ويجب علينا الخروج

كود
الكود:
MessageBox(NULL,"Program Will Now Close.","ERROR",MB_OK|MB_ICONSTOP);
return FALSE;
      }
  }
    }
الكود:

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

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

كود
الكود:
dwExStyle=WS_EX_APPWINDOW;
dwStyle=WS_POPUP;
ShowCursor(FALSE);
    }
    else
    {

dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;     
  dwStyle=WS_OVERLAPPEDWINDOW;
    }


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

كود
الكود:
AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle);


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

كود
الكود:
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 ) وغيرها من
الامور التي تحتاج دروس اخرى لتفصيلها فلا تستجعلوا معرفتها الآن

كود
الكود:
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   
    };

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

كود
الكود:
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;
}
الكود:


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

كود
الكود:
ShowWindow(hWnd,SW_SHOW);
SetForegroundWindow(hWnd);
SetFocus(hWnd);   
ReSizeGLScene(width, height);

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

كود
الكود:
if (!InitGL())
{
KillGLWindow();
MessageBox(NULL,"Initialization Failed.","ERROR",MB_OK|MB_ICONEXCLAMATION);
  return FALSE;
    }
return TRUE;
  }

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

كود
الكود:
LRESULT CALLBACK WndProc(    HWND    hWnd,   
UINT    uMsg,   
WPARAM    wParam,   
LPARAM    lParam)   
{

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

كود
الكود:
switch (uMsg)
    {

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

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

كود
الكود:
case WM_SYSCOMMAND:
{
switch (wParam)
{
case SC_SCREENSAVE:   
case SC_MONITORPOWER:
return 0;   
}
break;
}


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

كود
الكود:
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


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

كود
الكود:
if (MessageBox(NULL,"Would You Like To Run In Fullscreen Mode?", "Start FullScreen?",MB_YESNO|MB_ICONQUESTION)==IDNO)
    {
fullscreen=FALSE;   
}


عدل سابقا من قبل tessala في الثلاثاء مايو 26, 2009 1:42 am عدل 1 مرات

_________________
avatar
tessala
المدير العام
المدير العام

آخرمكافآت العضو :
الجنس : ذكر
عدد الرسائل : 1551
العمر : 51
العمل/الترفيه : صاحب الببيت
المزاج : مشغول
تعاليق الادارة : مرفوع من الخدمة
نقاط الشهرة : 5892
السٌّمعَة : 22
تاريخ التسجيل : 03/12/2008

http://tessala.up-with.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: برمجة الألعاب والجرافكس باستخدام مكتبة OpenGL .

مُساهمة من طرف tessala في الإثنين مايو 25, 2009 7:13 pm

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

كود
الكود:
if (!CreateGLWindow("NeHe's OpenGL Framework",640,480,16,fullscreen))
{
return 0;   
    }
while(!done)

    {


والان نقوم بالتأكد اذا ماكانت هناك رسائل ترد الى البرنامج لتطبيقها وجعل البرنامج يتعامل معها
كود
الكود:
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
if (msg.message==WM_QUIT)
{
done=TRUE;
}
      else
{
TranslateMessage(&msg);
   
DispatchMessage(&msg);
}
  }
  else
  {


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

كود
الكود:
if (active)

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

DrawGLScene();   
SwapBuffers(hDC);
}
      }
الكود:

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

كود
الكود:
if (keys[VK_F1])
{
keys[VK_F1]=FALSE;
KillGLWindow();   
fullscreen=!fullscreen;
if (!CreateGLWindow("NeHe's OpenGL Framework",640,480,16,fullscreen))
{
return 0;
}
      }
  }
    }
الكود:



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

انتهى درسنا الأول ولله الحمد .. وهو طويل جدا كما ترون .. الدروس التالية سوف تكون قصيرة بإذن الله وجميلة وممتعة في نفس الوقت
الملف المصدري لهذا الدرس على هذا العنوان
http://nehe.gamedev.net/data/lessons/vc/lesson01.zip

الدرس الأصلي موجود في هذا الموقع لمن أراد الاطلاع عليه
http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=01

اخيرا
انتظر الاستفسارات او انتظر احد الاخوة الذي يقول لي بانه مستعد للدرس
الثاني ومستعد لبدء الدرس الثاني في اي وقت ولو من اجل شخص واحد

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

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

لكم تحياتي وتقديري
علي الدعيج

رابط الدرس التالي :


عدل سابقا من قبل tessala في الثلاثاء مايو 26, 2009 1:34 am عدل 1 مرات

_________________
avatar
tessala
المدير العام
المدير العام

آخرمكافآت العضو :
الجنس : ذكر
عدد الرسائل : 1551
العمر : 51
العمل/الترفيه : صاحب الببيت
المزاج : مشغول
تعاليق الادارة : مرفوع من الخدمة
نقاط الشهرة : 5892
السٌّمعَة : 22
تاريخ التسجيل : 03/12/2008

http://tessala.up-with.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: برمجة الألعاب والجرافكس باستخدام مكتبة OpenGL .

مُساهمة من طرف yasmine في الثلاثاء مايو 26, 2009 1:23 am

واااااااااااااااااااااااااااااااااو


king king king king king

_________________
avatar
yasmine
مشرف
مشرف

آخرمكافآت العضو :
الجنس : انثى
عدد الرسائل : 1458
العمر : 25
العمل/الترفيه : طالبة
المزاج : عالى جدا
تعاليق الادارة : مكافآت الاعضاء




نقاط الشهرة : 5184
السٌّمعَة : 138
تاريخ التسجيل : 21/03/2009

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: برمجة الألعاب والجرافكس باستخدام مكتبة OpenGL .

مُساهمة من طرف tessala في الثلاثاء مايو 26, 2009 2:00 am

الدرس طويل انا عارف
لاكن لامفر منه لانه الدرس 0
وكل المعلومات تعتبر من اسسيات البرمجة بالOpenGL
لانه دو هذا الدرس لن تفهم الدروس القادمة لانستطيع برمجة اي شيئ


_________________
avatar
tessala
المدير العام
المدير العام

آخرمكافآت العضو :
الجنس : ذكر
عدد الرسائل : 1551
العمر : 51
العمل/الترفيه : صاحب الببيت
المزاج : مشغول
تعاليق الادارة : مرفوع من الخدمة
نقاط الشهرة : 5892
السٌّمعَة : 22
تاريخ التسجيل : 03/12/2008

http://tessala.up-with.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: برمجة الألعاب والجرافكس باستخدام مكتبة OpenGL .

مُساهمة من طرف yasmine في الثلاثاء مايو 26, 2009 12:36 pm

على العموم مشكور
Rolling Eyes Rolling Eyes Rolling Eyes Rolling Eyes

_________________
avatar
yasmine
مشرف
مشرف

آخرمكافآت العضو :
الجنس : انثى
عدد الرسائل : 1458
العمر : 25
العمل/الترفيه : طالبة
المزاج : عالى جدا
تعاليق الادارة : مكافآت الاعضاء




نقاط الشهرة : 5184
السٌّمعَة : 138
تاريخ التسجيل : 21/03/2009

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: برمجة الألعاب والجرافكس باستخدام مكتبة OpenGL .

مُساهمة من طرف yasmine في الثلاثاء مايو 26, 2009 12:42 pm

بس لا تزعل.....OK

_________________
avatar
yasmine
مشرف
مشرف

آخرمكافآت العضو :
الجنس : انثى
عدد الرسائل : 1458
العمر : 25
العمل/الترفيه : طالبة
المزاج : عالى جدا
تعاليق الادارة : مكافآت الاعضاء




نقاط الشهرة : 5184
السٌّمعَة : 138
تاريخ التسجيل : 21/03/2009

الرجوع الى أعلى الصفحة اذهب الى الأسفل

الرجوع الى أعلى الصفحة


 
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى