منتديات اليسير للمكتبات وتقنية المعلومات » منتديات اليسير العامة » منتدى الــكــمــبــيــو نـــ NET ــت » شرح مفصل لبرمجة ال direct x وتصميم الالعاب باستخدام الفيجوال بيسك 6

منتدى الــكــمــبــيــو نـــ NET ــت هذا المنتدى مُخصص للبرمجيات والأجهزة والإنترنت.

إضافة رد
أدوات الموضوع تقييم الموضوع انواع عرض الموضوع
 
قديم Apr-09-2008, 11:53 AM   المشاركة1
المعلومات

بنت النيل
مكتبي فعّال

بنت النيل غير متواجد حالياً
البيانات
 
العضوية: 36516
تاريخ التسجيل: Nov 2007
الدولة: مصـــر
المشاركات: 188
بمعدل : 0.03 يومياً


ممتاز شرح مفصل لبرمجة ال direct x وتصميم الالعاب باستخدام الفيجوال بيسك 6

دايركت اكس

دايركت إكس :
من منا لا يعرف دايركت إكس ؟؟؟ من منا لا يملك على جهازه دايركت إكس ؟؟؟ على الرغم من أن كلنا تقريبا نمتلك دايركت إكس على جهازنا ... وأننا نحرص على امتلاك أحدث اصداراتها إلا أننا - أو معظمنا - لا نعرف ما هي دايركت إكس ... وذلك أننا بدون البرمجة لا نحتاج لأن نعرف ما هي دايركت إكس مادامت تشغل لنا الألعاب وبرامج MultiMedia فلا حاجة بنا لأن نعرف ما هي دايركت إكس ...
ولكن مادمنا اتخذنا برمجة الألعاب دربا لنا فنحن لا مفر لنا من تعلم دايركت إكس ... ودايركت إكس هي مجموعة من (التعريفات والثوابت والمتغيرات والدوال والوظائف والتركيبات والعناصر) التي تجتمع جميعا مكونة ما يسمى (مكتبة) ... وهذه المكتبة وظيفتها استقبال أوامرنا التي نكتبها على هيئة كود وتحويلها إلى صورة رسومية تظهر لنا ... وليس هذا كل شيء فهي كذلك تقوم بالتحكم بذاكرة كارت الفيديو Video Card Memory وتتحكم في ظهور البرامج الأخرى ... وهي من صفاتها المهمة .. فاللعبة التي تعمل الآن بدايركت إكس لا يمكن أن يعمل برنامج آخر ويظهر بجوارها ... بل تظل عي فقط الظاهرة على الشاشة ...
الآن نحن نعرف الكثير عن دايركت إكس 7 وبقى أن نعرف كيف نستخدمها في البرمجة ...
ولتعريف مكتبات دايركت إكس إلى برنامجك نفتح Project > References ستظهر لنا قائمة نختار منها DirectX7 Type Library for VisualBasic 6.0 ... وبدون تعريف هذه المكتبات لا نستطيع التعامل مع دايركت إكس ...
لنعرف أن كائن دايركت إكس ذاته لن نستخدمه في الكود إلا لتعريف الكائنات الأخرى فقط ... ولن نستخدمه في الكود إلاعلى مستوى صغير ... ولذا فأول ما سنتعلمه هنا هو كيف نعلن عن كائن دايركت إكس جديد



وذلك يكون كالتالي
كود:
Sub CreatDxObject()Dim Dx As DirectX7Set Dx = New DirectX7End Sub
وذلك لأن كائن دايركت إكس كالكثير من الكائنات المقبلة لا يكفي مجرد الإعلان عنه فقط ولكن ينبغي استخدام التعريفة New لنخبر البرنامج بأننا سنصنع كائنا جديدا لنستخدمه في برنامجنا... هذا كل استخدامنا للكائن دايركت إكس في الوقت الحالي وحان وقت البدء في دروس كائن دايركت درو ... وهو كائن (كما يقول اسمه) كائن مختص بالرسوميات .

كائن Direct Input


يستخدم كائن دايركت انبت في معرفة حالة أحد أجهزة الإدخال ... مثل الكيبورد أو الماوس ... وكما كنا نستخدم KeyDown أو KeyPress بالنسبة للكيبورد فسنستخدم Direct Input كما استخدمناهما ... بل قد نجده أكثر سهولة :
وكائن دايركت إنبت كغيره من كائنات دايركت إكس يحتاج للتعريف و الإنشاء ...
يستخدم كائن دايركت إنبت كائنين أو عنصرين في آداؤه وهما:
DirectInputDevice: وهو الكائن الموكل بتعريف نوع جهاز الإدخال من ماوس أو كيبورد..
DiKeyBoardState: وهو كائن يتعرف على الزر المضغوط الآن وهو من اسمه نعرف أنه يعمل من الكيبورد ...

تعال الآن نعلن عن الكائنات السابقة :


كود:
im Dx As DirectX7Dim Di As DirectInputDim Didev As DirectInputDeviceDim DiKey As DIKEYBOARDSTATE
والآن سنقوم بتعريف الكائنات السابقة لنستطيع التعامل مع الكيبورد :


Set Dx = New DirectX7
Set Di = Dx.DirectInputCreate()
Set Didev = Di.CreateDevice("guid_syskeyboard")
Didev.SetCommonDataFormat DIFORMAT_KEYBOARD
Didev.SetCooperativeLevel Me.hWnd, _ DISCL_NONEXCLUSIVE Or DISCL_BACKGROUND
Didev.Acquire


الفأرة

للتعامل مع الماوس هناك أربعة أشياء يجب معرفتها ...
1- موقع المؤشر على المحور X
2- موقع المؤشر على المحور Y
3- موقع المؤشر على المحور Z
4- معرفة الزر المضغوط هل هو الأيمرن أم الأيسر ...
وكل ذلك يتيحه لك دايركت إنبت بسهولة ورفق ... تعال نبدأ فورا في تعريف وانشاء الكائنات الرئيسية :
كود:
:'التعريفDim Dx As DirectX7Dim Di As DirectInputDim Didev As DirectInputDeviceDim DiMouse As DIMOUSESTATEPrivate Sub Form_Load()'الإنشاءSet Dx = New DirectX7Set Di = Dx.DirectInputCreate()Set Didev = Di.CreateDevice("guid_sysMouse")Didev.SetCommonDat aFormat DIFORMAT_MOUSEDidev.SetCooperativeLevel Me.hWnd, DISCL_NONEXCLUSIVE Or DISCL_BACKGROUNDDidev.AcquireMe.Show'الحلقة التكراريةDoDoEventsGetMouseStateLoopEnd Sub Sub GetMouseState()'معرفة حالة الماوسDidev.GetDeviceStateMouse DiMouseIf DiMouse.buttons(0) Then _Me.Caption = " Left Button"If DiMouse.buttons(1) Then _Me.Caption = " Right Button"End Sub



لوحة المفاتيح

في هذا الفصل سنتعلم كيف نستخدم كائن دايركت انبت مع KeyBoard ... وفي هذا سنستخدم كائنين وهما :
Didev و DiKey ...
سنقوم الآن بعمل مثالا كالتالي :
1- عند الضغط على الزر الأيمن تتحرك الفورمة جهة اليمين..
2- عند الضغط على الزر الأيسر تتحرك الفورمة جهة اليسار..
3- عند الضغط على الزر الأعلى تتحرك الفورمة لأعلى..
4- عند الضغط على الزر الأسفل تتحرك الفورمة لأسفل..
5- عند الضغط على زر Ctrl اللأيسر تتم زيادة قيمة Height للفورمة..
6- عند الضغط على زر Ctrl الأيمن يتم تقليل قيمة Height للفورمة..
7- عند الضغط على Escape ينتهي البرنامج ...







أولا في الإجراء علينا انشاء مقطع برمجي Sub يقوم بالتعامل مع أزرار الكيبورد ... وهذا المقطع يكون شكله كالتالي :
كود:
Sub GetKeyState()Didev.GetDeviceStateKeyboard DiKey'التعامل مع حالات الأزرارIf DiKey.Key(DIK_ESCAPE) Then EndIf DiKey.Key(DIK_LEFT) Then Me.Left = Me.Left - 20If DiKey.Key(DIK_RIGHT) Then Me.Left = Me.Left + 20If DiKey.Key(DIK_UP) Then Me.Top = Me.Top - 20If DiKey.Key(DIK_DOWN) Then Me.Top = Me.Top + 20If DiKey.Key(DIK_LCONTROL) Then Me.Height = Me.Height + 1If DiKey.Key(DIK_RCONTROL) Then Me.Height = Me.Height - 1End Sub

ثم نذهب للإجراء Form_Load ونكتب في التالي
Private Sub Form_Load()
Set Dx = New DirectX7
Set Di = Dx.DirectInputCreate()
Set Didev = Di.CreateDevice("guid_syskeyboard")
Didev.SetCommonDataFormat DIFORMAT_KEYBOARD
Didev.SetCooperativeLevel Me.hWnd, DISCL_NONEXCLUSIVE Or DISCL_BACKGROUND
Didev.Acquire
Me.Show
Do
DoEvents
GetKeyState
Loop
End Sub



ولم يبق سور معرفة أسماء الأزرار بصيغة Dik_KeyName .. و هي في هذا الجدول :
كود:
: Note Constant DIK_ESCAPE On main keyboard DIK_1 On main keyboard DIK_2 On main keyboard DIK_3 On main keyboard DIK_4 On main keyboard DIK_5 On main keyboard DIK_6 On main keyboard DIK_7 On main keyboard DIK_8 On main keyboard DIK_9 On main keyboard DIK_0 On main keyboard DIK_MINUS On main keyboard DIK_EQUALS BACKSPACE DIK_BACK DIK_TAB DIK_Q DIK_W DIK_E DIK_R DIK_T DIK_Y DIK_U DIK_I DIK_O DIK_P [ DIK_LBRACKET ] DIK_RBRACKET ENTER on main keyboard DIK_RETURN Left CTRL DIK_LCONTROL DIK_A DIK_S DIK_D DIK_F DIK_G DIK_H DIK_J DIK_K DIK_L DIK_SEMICOLON DIK_APOSTROPHE Grave accent (`) DIK_GRAVE Left SHIFT DIK_LSHIFT DIK_BACKSLASH DIK_Z DIK_X DIK_C DIK_V DIK_B DIK_N DIK_M DIK_COMMA On main keyboard DIK_PERIOD Forward slash (/)on main keyboard DIK_SLASH Right SHIFT DIK_RSHIFT Asterisk on numeric keypad DIK_MULTIPLY Left ALT DIK_LMENU Spacebar DIK_SPACE CAPS LOCK DIK_CAPITAL DIK_F1 DIK_F2 DIK_F3 DIK_F4 DIK_F5 DIK_F6 DIK_F7 DIK_F8 DIK_F9 DIK_F10 DIK_NUMLOCK SCROLL LOCK DIK_SCROLL DIK_NUMPAD7 DIK_NUMPAD8 DIK_NUMPAD9 Hyphen (minus sign) on numeric keypad DIK_SUBTRACT DIK_NUMPAD4 DIK_NUMPAD5 DIK_NUMPAD6 Plus sign on numeric keypad DIK_ADD DIK_NUMPAD1 DIK_NUMPAD2 DIK_NUMPAD3 DIK_NUMPAD0 Period (decimal point) on numeric keypad DIK_DECIMAL DIK_F11 DIK_F12 DIK_F13 DIK_F14 DIK_F15On Japanese keyboard DIK_KANAOn Japanese keyboard DIK_CONVERTOn Japanese keyboard DIK_NOCONVERTOn Japanese keyboard DIK_YENOn numeric keypad (NEC PC98) DIK_NUMPADEQUALSOn Japanese keyboard DIK_CIRCUMFLEXOn Japanese keyboard DIK_ATOn Japanese keyboard DIK_COLONOn Japanese keyboard DIK_UNDERLINEOn Japanese keyboard DIK_KANJIOn Japanese keyboard DIK_STOPOn Japanese keyboard DIK_AXOn Japanese keyboard DIK_UNLABELED DIK_NUMPADENTER Right CTRL key DIK_RCONTROL Comma on NEC PC98 numeric keypad DIK_NUMPADCOMMAForward slash (/)on numeric keypad DIK_DIVIDE DIK_SYSRQ Right ALT DIK_RMENU DIK_HOME Up arrow DIK_UP PAGE UP DIK_PRIOR Left arrow DIK_LEFT Right arrow DIK_RIGHT DIK_END Down arrow DIK_DOWN PAGE DOWN DIK_NEXT DIK_INSERT DIK_DELETE Left Windows key DIK_LWIN Right Windows key DIK_RWIN Application key DIK_APPS DIK_PAUSE
ما هو دايركت درو


ما هو دايركت درو


دايركت درو هو ما يتحكم في كل ما تراه أمامك على الشاشة ... من اضاءة وألوان ورسومات ...الخ
ومن المعروف أنك يمكنك أن تتحكم في كل ماسبق ذكره بدون دايركت درو وباستخدام بعض دوال Api ... ولكن دايركت درو يسهل هذه العملية كثيرا ... ويجعل دوال Api مجموعة من السطور الطويلة غير المفهومة المملة ... ولذا وجب التحويل لدايركت درو ...
دايركت درو عبارة عن مجموعة من الدوال التي تدخل مباشرة على برامج التحكم في أجهزة العرض ... محولات العرض Display Hardware مع دعم كامل للتعامل مع واجهات الرسوميات Graphic device Interface أو GDI..
دايركت درو هو الواجهة المثالية لبرمجة برامج الـ Graphics ولبرمجة الألعاب ... وهو يدعم التحكم في طريقة وعمق العرض ... كذلك في مساحة النافذة هل هي Full-Screen-Mode أم Windowed-Mode ...
دايركت درو يقوم بتجريد طبقة جهاز العرض HAL لتتمكن من التعامل بدعم كامل من جهاز العرض .
دايركت درو يسمح لك ببرمجة تطبيقات ثلاثية الأبعاد..












التوقيع
لو علمت الشعوب عظمة الرحمن لكان شهيقها الذكر وزفيرها قراءة القرآن
لا إله إلا أنت سبحانك إني كنت من الظالمين
سبحان الله وبحمده ، سبحان الله العظيم

كل من الفائزين والخاسرين يسقطون على الارض ولكن.... الخاسرين فقط هم الذين يفقدون القدرة على النهـــــــوض.....
  رد مع اقتباس
قديم Apr-09-2008, 11:56 AM   المشاركة2
المعلومات

بنت النيل
مكتبي فعّال

بنت النيل غير متواجد حالياً
البيانات
 
العضوية: 36516
تاريخ التسجيل: Nov 2007
الدولة: مصـــر
المشاركات: 188
بمعدل : 0.03 يومياً


افتراضي

الرسم على السطح الخفي

تعلمنا في الفيجول بيسك كيف نرسم دائرة أو خط أو مربع ... وذلك عن طريق الدوال Line و Circle ... وسنتعلم الآن كيف ننشئ رسوما مثلها على السطح الخفي Back_Buffer
خطوات إظهار الكائنات على الشاشة
وهي تتألف من خطوتين فقط ... الأولى هي رسم الكائن على السطح الخفي ... والثانية هي أمر السطح الرئيسي بقلب السطح الخفي Flip ليظهر على الشاشة..

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

لذا فأول شيء سنتعلمه هو رسم الصندوق وذلك ليغطي الشاشة بالكامل ... سنتعلم كيف نرسم الصندوق ... وكيف نغير لون خلفيته ... ولون إطاره أيضا ... أنظر الكود التالي :
:
Back_Buffer.SetFillColor vbBlack
Back_Buffer.SetFillStyle 0
Back_Buffer.SetForeColor vbCyan
Back_Buffer.setDrawWidth 2
Do
On Local Error Resume Next
DoEvents
Back_Buffer.DrawBox 0, 0, 800, 600
Loop

الآن قم بتنفيذ الكود السابق ولاحظ ماذا سيحدث ؟؟؟
1- يستم تكبير الفورم لتكون بحجم الشاشة
2- لم تظهر أي صناديق ... على الرغم من كود الرسم الذي استخدمناه
والسبب في عدم ظهور صناديق هو أننا قمنا بالرسم على السطح الخفي فقط Back_Buffer ولم نقم بقلب هذا السطح على الشاشة
ملاحظة : يجب عند استخدام دايركت إكس مراعاة الترتيب في انشاء الكائنات ... فعليك أولا أن تقوم بإنشاء كائن دايركت إكس ... ثم دايركت درو ... ثم السطح الرئيسي ... ثم السطح الخفي ... ثم الكود المكتوب أعلاه..
الآن سنغير الكود السابق بإضافة سطر واحد وهو أمر قلب السطح الخفي ليظهر على الشاشة :
Back_Buffer.SetFillColor vbBlack
Back_Buffer.SetFillStyle 0
Back_Buffer.SetForeColor vbCyan
Back_Buffer.setDrawWidth 2
Do
On Local Error Resume Next
DoEvents
Back_Buffer.DrawBox 0, 0, 800, 600
Primary.Flip Nothing, DDFLIP_WAIT
Loop
ولكن قبل تشغيل البرنامج لاحظ أنك لن تستطيع الخروج منه ... فأنت تعلم أننا لم نفعل الأزرار Alt+Ctrl+Delete ولكن الحل هو أن تستخدم الإجراء KeyCode للفورم وأن تكتب فيه الأمر End أي انهاء

والآن شكل الكود ككل سيكون كالتالي :
كود:
Private Sub Form_KeyDown(KeyCode As Integer, _ Shift As Integer)EndEnd SubPrivate Sub Form_Load()Dim Dx As DirectX7Dim Dd As DirectDraw7Set Dx = New DirectX7Set Dd = Dx.DirectDrawCreate("")Dd.SetCooperativeLevel Form1.hWnd, _DDSCL_ALLOWMODEX Or DDSCL_EXCLUSIVE Or _DDSCL_FULLSCREENDd.SetDisplayMode 800, 600, 16, 0, DDSDM_DEFAULTDim Primary As DirectDrawSurface7Dim Ddsd_Primary As DDSURFACEDESC2Ddsd_Primary.lFlags = DDSD_CAPS Or DDSD_BACKBUFFERCOUNTDdsd_Primary.ddsCaps.lCaps _ =DDSCAPS_PRIMARYSURFACE _Or DDSCAPS_FLIP Or DDSCAPS_COMPLEX _Ddsd_Primary.lBackBufferCount = 1Set Primary = Dd.CreateSurface(Ddsd_Primary)Dim Ddsd_Back_Buffer As DDSURFACEDESC2Dim Back_Buffer As DirectDrawSurface7Ddsd_Back_Buffer.ddsCaps.lCaps = DDSCAPS_BACKBUFFERSet Back_Buffer = Primary.GetAttachedSurface(Ddsd_Back_Buffer.ddsCap s)Back_Buffer.GetSurfaceDesc Ddsd_Back_Buffer'Drawing BoxDoOn Local Error Resume NextDoEventsBack_Buffer.SetFillColor vbBlackBack_Buffer.SetFillStyle 0Back_Buffer.SetForeColor vbCyanBack_Buffer.setDrawWidth 2Back_Buffer.DrawBox 0, 0, 800, 600Primary.Flip Nothing, DDFLIP_WAITLoopEnd Sub
Private Sub Form_KeyDown(KeyCode As Integer, _ Shift As Integer)
End
End Sub
Private Sub Form_Load()
Dim Dx As DirectX7
Dim Dd As DirectDraw7
Set Dx = New DirectX7
Set Dd = Dx.DirectDrawCreate("")
Dd.SetCooperativeLevel Form1.hWnd, _
DDSCL_ALLOWMODEX Or DDSCL_EXCLUSIVE Or _
DDSCL_FULLSCREEN
Dd.SetDisplayMode 800, 600, 16, 0, DDSDM_DEFAULT
Dim Primary As DirectDrawSurface7
Dim Ddsd_Primary As DDSURFACEDESC2
Ddsd_Primary.lFlags = DDSD_CAPS Or DDSD_BACKBUFFERCOUNT
Ddsd_Primary.ddsCaps.lCaps _ =DDSCAPS_PRIMARYSURFACE _
Or DDSCAPS_FLIP Or DDSCAPS_COMPLEX _
Ddsd_Primary.lBackBufferCount = 1
Set Primary = Dd.CreateSurface(Ddsd_Primary)
Dim Ddsd_Back_Buffer As DDSURFACEDESC2
Dim Back_Buffer As DirectDrawSurface7
Ddsd_Back_Buffer.ddsCaps.lCaps = DDSCAPS_BACKBUFFER
Set Back_Buffer = Primary.GetAttachedSurface(Ddsd_Back_Buffer.ddsCap s)
Back_Buffer.GetSurfaceDesc Ddsd_Back_Buffer
'Drawing Box
Do
On Local Error Resume Next
DoEvents
Back_Buffer.SetFillColor vbBlack
Back_Buffer.SetFillStyle 0
Back_Buffer.SetForeColor vbCyan
Back_Buffer.setDrawWidth 2
Back_Buffer.DrawBox 0, 0, 800, 600
Primary.Flip Nothing, DDFLIP_WAIT
Loop
End Sub
أعتقد أن الكود السابق قد شرحناه بالكامل ولا يوجد قيه شيء لم نشرحه ... ولو واجهتك أي صعوبات في الكود السابق فأنت بالتأكيد لم تكن مركزا ومستحضرا ذهنك في الفصول السابقة
رسم دائرة...
الكود التالي يقوم برسم دائرة
كود:
Back_Buffer.DrawCircle 400, 300, 100


الآن يمكنك أن تجرب تغيير الخواص FillStyle و DrwWidth و DrawStyle للعنصر Back_Buffer لتتعلم كيف تتحكم في هذه القيم..

السطح الرئيسي والسطح الخفي

قبل أن نعرف ما هو Primary و ما هو Back_Buffer يجب أن نعرف ما هو السطح ..
السطح (Surace) أو (DirectDrawSurface) عبارة عن مساحة مسطحة من ذاكرة الفيديو ... وغالبا ما تستغل هذه المساحة من مساحة كارت الفيديو ذاته ... ولكنه كذلك يستطيع أن يأخذ من مساحة النظام إذا كانت لعبتك أكبر مما ينبغي أو كانت ذاكرة كارت الفيديو مشغولة لسبب ما ...
والسطوح ثلاثة أنواع ... نوعان يستخدمان في الرسم على الشاشة مباشرة وهما النوعان الذين سنشرحهما الآن ... ونوع ثالث لا يظهر على الشاشة مطلقا ولكنه يستخدم في الرسم على الشاشة ...

مكونات استخدام Surfaces
لكل سورفاس تنشئه عدد من المكونات التي يجب عليك انشائها ... وباختصار هناك كائنان يجب انشائهما لكل سورفاس وهما : Rect - DdSurfaceDesc2
فأما كائن Rect فقد شرحنا استخدامه مسبقا ولكننا لن نستخدمه مع Primary أو Back_Buffer ...وبالتالي فسنتجاوز عنه الآن .
وأما كائن DdSurfaceDesk فقد استخدمناه سابقا أيضا ولكننا هنا سنضع نبذه عن هذا الكائن ..





DdSurfaceDesc2
DdSurfaceDesc2 عبارة عن نوع Rect حيث بامكانه أن يخصص السطح حيثما تشاء ... ومن هذا النوع يمكننا أن نحدد نوع السطح ... هل هو سطح رئيسي Primary أم سطح رسم خفي Back_Buffer أم سطح رسومي غير ظاهر ..
وتكوين هذا النوع يكون كالتالي :
كود:
Type DDSURFACEDESC2 ddckCKDestBlt As DDCOLORKEY ddckCKDestOverlay As DDCOLORKEY ddckCKSrcBlt As DDCOLORKEY ddckCKSrcOverlay As DDCOLORKEY ddpfPixelFormat As DDPIXELFORMAT ddsCaps As DDSCAPS2 lAlphaBitDepth As Long lBackBufferCount As Long lFlags As CONST_DDSURFACEDESCFLAGS lHeight As Long lLinearSize As Long lMipMapCount As Long lPitch As Long lRefreshRate As Long lTextureStage As Long lWidth As Long lZBufferBitDepth As LongEnd Type
Type DDSURFACEDESC2
ddckCKDestBlt As DDCOLORKEY
ddckCKDestOverlay As DDCOLORKEY
ddckCKSrcBlt As DDCOLORKEY
ddckCKSrcOverlay As DDCOLORKEY
ddpfPixelFormat As DDPIXELFORMAT
ddsCaps As DDSCAPS2
lAlphaBitDepth As Long
lBackBufferCount As Long
lFlags As CONST_DDSURFACEDESCFLAGS
lHeight As Long
lLinearSize As Long
lMipMapCount As Long
lPitch As Long
lRefreshRate As Long
lTextureStage As Long
lWidth As Long
lZBufferBitDepth As Long
End Type
ومن خلال هذا النوع سننشئ كائن السطح الرئيسي والسطح الخفي ...





السطح الرئيسي Primary
كما قلنا مسبقا هناك ثلاثة أنواع من السطوح ولكل سطح صفات تختلف عن السطح الآخر ... ولكل سطح طريقة إنشاء وتعريف تختلف من سطح لآخر ... ولكل سطح عدد من الكائنات التي تساعد في تعريفه وانشاؤه ... وبالنسبة للسطح Primary فله كائن يستخدم في تعريفه وهو كائن DdSurfaceDesc2 الذي استخدمناه عدد من المرات حتى الآن ... ومن المعروف أن هذا الكائن يستخدم في تغيير وتعريف نوع السطح .
هذا هو كود تعريف Primary :
كود:
Dim Primary As DirectDrawSurface7Dim Ddsd_Primary As DDSURFACEDESC2Ddsd_Primary.lFlags = DDSD_CAPS Or _ DDSD_BACKBUFFERCOUNTDdsd_Primary.ddsCaps.lCaps = DDSCAPS_PRIMARYSURFACE _Or DDSCAPS_FLIP Or DDSCAPS_COMPLEX Ddsd_Primary.lBackBufferCount = 1Set Primary = Dd.CreateSurface(Ddsd_Primary)javascript:popup.Tex tPopup(poptxt919, popfont919,9,9,-1,-1)
[code]حتى الآن لا يوجد شيء لم نفهمه والحمد لله ... ربما بدت لك الأسماء التي توضع بعد lFlags للكائن Ddsd_Primary غير واضحة بعض الشيء ولكنها لا تعني أمرا معينا ... فكتابة العضو DDSD_CAPS تعني أن العضو DDSD_CAPS سيكون فعالا في هذا السطح ليس أكثر ...







السطح الخفي Back_Buffer
ويسمى أيضا السطح الرسومي أو شاشة الرسم الخفية ...
وكعادتنا سنستخدم العنصر DdSurfaceDesc2 لتعريف السطح الخفي ... أنظر الكود التالي :
كود:
Dim Ddsd_Back_Buffer As DDSURFACEDESC2Dim Back_Buffer As DirectDrawSurface7Ddsd_Back_Buffer.ddsCaps.lCaps = DDSCAPS_BACKBUFFERSet Back_Buffer = Primary.GetAttachedSurface _(Ddsd_Back_Buffer.ddsCaps) Back_Buffer.GetSurfaceDesc Ddsd_Back_Buffer
الآن والحمد لله استطعنا أن نقوم بتعريف السطح الرئيسي والسطح الخفي ... سنتعلم الآن كيف نستخدم السطح الخفي في إنشاء رسومات وكتابات جميلة

الكتابة على السطح الخفي

لا أحد يستطيع أ يصمم لعبة بدون نصوص توضيحية تكتب فيها كمثال Score مثلا أو عدد المحاولات أو غير ذلك من متطلبات الكتابة في الألعاب ...
ولوكانت دايركت إكس لا تدعم الكتابة لكان ذلك عيبا خطيرا فيها قد يتسبب في انصراف معظم أو كل المبرمجين عنها ... ولكن -الحمد لله - دايركت إكس تدعم الكتابة ...
متطلبات كتابة أي نص
لكي تستطيع كتابة نص فأنت بحاجة لعدد من الخيارات التي تخصصها تبعا للشكل الذي تريده فمثلا هناك :
Font أو الخط الذي سيكتب به النص
Size حجم الخط الذي سيكتب به النص
Bold هل الخط ثخين أم رفيع
Italic هل الخط مائل أم معتدل
Color
لون الخط ...
ودايركت إكس تدعم كتابة النصوص وتخصيص جميع الخصائص السابقة ...
الكائن stdFont
هو كائن عبارة عن نوع Type يحتوي على معظم صفات وخصائص الخط ... مثل الخاصية Name أو اسم الخط و Size أو حجم الخط وBold وغير ذلك ... ونحن سنستخدم كائنا من نوع stdFont للتعبير عن مواصفات الخط الذي سنكتبه ...












التوقيع
لو علمت الشعوب عظمة الرحمن لكان شهيقها الذكر وزفيرها قراءة القرآن
لا إله إلا أنت سبحانك إني كنت من الظالمين
سبحان الله وبحمده ، سبحان الله العظيم

كل من الفائزين والخاسرين يسقطون على الارض ولكن.... الخاسرين فقط هم الذين يفقدون القدرة على النهـــــــوض.....
  رد مع اقتباس
قديم Apr-09-2008, 11:57 AM   المشاركة3
المعلومات

بنت النيل
مكتبي فعّال

بنت النيل غير متواجد حالياً
البيانات
 
العضوية: 36516
تاريخ التسجيل: Nov 2007
الدولة: مصـــر
المشاركات: 188
بمعدل : 0.03 يومياً


افتراضي

أنظر الكود التالي :
'إنشاء الخط
Dim sFont As New StdFont
sFont.Name = "Arial"
sFont.Bold = True
sFont.Size = 18
sFont.Italic = True
'تعريف السطح الخفي على هذا الخط
Back_Buffer.SetFont sFont
'هكذا الخط جاهز للرسم .. ويتم تغيير لون
'الخط عن طريق الخاصية
'ForeColor
'لكائن السطح الخفي ... ولرسم نصا بهذا الخط نكتب

كود:
Back_Buffer.DrawText 230, 50, _"Www.GameDesigners.8M.Net", False
الآن تستطيع كتابة النصوص على الشاشة و تحريكها عن طريق تغيير قيمتي
x&y
المستطيل Rectangle

الصندوق Rect : هو عبارة عن مساحة مستطيلة أو مربعة الشكل ... يتم تحديدها بأربعة متغيرات ...
1 Top : نقطة البدء من الأعلى
2 Left : نقطة البدء من اليسار
3 Bottom : نقطة البدء من الأسفل
4 Right : نقطة البدء من اليمين
ووظيفة هذه المساحة هي تحديد جزء معين من الشاشة أو من سطح الرسم ليتم آداء بعض العمليات والمهام على هذا السطح ... وهذه المساحة يتم تحديدها عن طريق أربعة قيم ... هي القيم Top - Left - Right - Bottom .
والريكت في الفيجول بيسك هو نوع Type يمكنك انشاؤه بنفسك ... ولكن الفيجول بيسك تنشئه لك تلقائيا إذا أضفت مكتبات دايركت إكس في Referece ... فلو كنت تحب أن تلقي نظرة على هذا النوع فهو يشبه هذا :

كود:
Type Rect Top As LongLeft As LongRight As LongBottom As LongEnd Type


ما هي فائدة Rect ؟؟
للصندوق عدة فوائد ... منها أنك لا تستطيع أن ترسم أي شكل على الشاشة بواسطة دايركت درو بدون أن تصنع له Rect ... وذلك لعدة أسباب وهي :
1- قد تكون الصورة التي سترسمها جزء من سطح كبير وبالتالي فأنت تحتاج لتحديد Rect للمساحة التي سترسمها من السطح
2- قد تحتاج لعمل صورة متحركة Animation وذلك بوضع عدد من الأشكال المتجاورة الثابتة ثم عن طريق Rect يتم تحديد جزء يظهر من الصورة ويتغير باستمرار مكونا التحرك
3- حتى لو كنت سترسم السطح كاملا وليس مجرد جزء من السطح ولكن السطح بالكامل فأنت تحتاج لتحديد Rect بحجم السطح ... هذا اجباري.

انشاء كائن دايركت درو


كائن دايركت درو كالعديد من الكائنات الأخرى يحتاج للإنشاء ... وذلك بعد التعريف ... وبالتالي فعلينا أولا تعريف كائن دايركت درو ... ومن ثم إنشاؤه ... ومن المعروف أننا لا نستطيع استخدام وظائف وصفات كائن DirectDraw قبل انشاء هذا الكائن .
الآن سنقوم بتعريف كائن دايركت درو ... ثم نقوم بانشاؤه وذلك بالكود التالي في Genral :
Sub CreateDdObject()
Dim Dd As DirectDraw7
Set Dd = Dx.DirectDrawCreate("")
End Sub
الآن وقبل أن نبدأ في التعرف على الكائنات التي تعمل من داخل دايركت درو يجب أن نتعرف على وظيفتين يتيحهما دايركت درو وهما :
1- تحديد نظام التعامل مع البرامج الأخرى ( هل سيسمح بالتعامل مع البرامج الأخرى أم أن برنامجنا سيحتل كارت الفيديو بالكامل وبالتالي لن تظهر البرامج الأخرى بجوار برنامجنا)
2- تحديد نظام العرض DisplayMode
والآن نحن باعتبارنا نتعامل من خلال برمجة الألعاب فسيكون لبرنامجنا صفتان أساسيتان وهما :
1- يعمل برنامجنا بحجم الشاشة .
2- تختفي جميع البرامج الأخرى ولا يظهر سوى برنامجنا .



ويتم ذلك عن طريق تحديد SetCooperativeLevel method ويتم ذلك من خلال سطر واحد

كود:
Dd.SetCooperativeLevel Form1.hWnd, _DDSCL_ALLOWMODEX Or _DDSCL_EXCLUSIVE Or DDSCL_FULLSCREEN
ووظيفة SetCooperativeLevel تأخذ متغيرين :
المتغير الأول رقمي وهو يشير إلى الفورمة التي ستظهر على الشاشة عن طريق قيمة Hwnd لها ... والمتغير الثاني هو مجموعة من الثوابت التي تشير لكيفية التعامل والتعاون بين البرامج ... وهو مجموعة من الثوابت لكل ثابت منها معناه ... وتركيب الثوابت بالطريقة السابقة لن يتغير في كل ألعابك ... ولكن على الرغم من ذلك سأقوم بشرح هذه الثوابت بقدر ما يسمح به علمي :







كود:
يسمح هذا الثابت باستخدام نظام Mod_x وهونظام يتيح لك استخدام 256 كيلو بايت من حجم الذاكرة ويتيح التعامل مع كروت الفيديو ...ولا يمكن استخدام هذا الثابت إلا مع الثابتين DDSCL_EXCLUSIVE و DDSCL_FULLSCREEN DDSCL_ALLOWMODEXيسمح هذا باستخدام الأزرار Alt+Ctrl+Delete أثناء تشغيل اللعبة DDSCL_ALLOWREBOOTلا يمكن استخدامه إلا في Windows98 أو أحدث وهو يتيح إدارة كارت الفيديو الرئيسي DDSCL_CREATEDEVICEWINDOWلا يسمح للبرامج الأخرى بالظهور على الشاشة ... ولا يمكن استخدامه إلا مع DDSCL_FULLSCREEN DDSCL_EXCLUSIVEيعمل على جعل لعبتك تعمل بنظام Full-Screen-Mode وهذا الثابت لا يعمل إلا مع DDSCL_EXCLUSIVE DDSCL_FULLSCREENيسمح لك هذا الثابت بالعمل بعدة نظم وذلك في حالة لو كنت ستستخدم أجزاء ثلاثية الأبعاد في لعبتك DDSCL_MULTITHREADEDيجعل لعبتك تعمل كأي نافذة من نوافذ Windows ... ولا يمكنه العمل مع DSCL_ALLOWMODEXDDSCL_EXCLUSIVEDDSCL_FULLSCREEN DDSCL_NORMALلا يسمح لك باستخدام minimize أو Restore في نافذة لعبتك DDSCL_NOWINDOWCHANGES
رسم السطوح على السطح الخفي

عرفنا في الفصول السابقة أن هناك ثلاثة أنواع من السطوح ... السطح الرئيسي وهو الذي يقلب السطح الخفي إلى الشاشة ... والسطح الخفي وهو الذي يتم رسم الأشكال والسطوح عليه .. والسطح الرسومي وهو سطح يستخدم في تحميل صور من ملفات الصور النقطية BitMap Files ويضعها على السطح استعدادا لرسمها على السطح الخفي ... وهو كما قلنا من السطوح التي لا تظهر على الشاشة أو OffScreen ...
سنستخدم السطح الرسومي في تحميل ملف من خارج البرنامج يسمى Back.bmp وهو كما هو موضح من اسمه سيكون خلفية للبرنامج ...
أول شيء نعلن عن ثلاثة متغيرات :
Rect كما قلنا مسبقا هو كائن لا غنى عنه بالنسبة للسطح الرسومي
DdSurfaceDesc2 وهو الكائن الذي سيحمل صفات السطر الرسومي
DirectDrawSurface7 وهو السطح الذي سيحمل الصورة ...
لاحظ الكود التالي :

كود:
'الإعلان عن المتغيرات Dim MySurf As DirectDrawSurface7Dim My_Ddsd As DDSURFACEDESC2Dim MyRect As RECT'تخصيص الكائناتMy_Ddsd.lFlags = DDSD_CAPS Or DDSD_HEIGHT Or _ DDSD_WIDTHMy_Ddsd.ddsCaps.lCaps = DDSCAPS_OFFSCREENPLAINMy_Ddsd.lHeight = 600My_Ddsd.lWidth = 800 MyRect.Top = 0MyRect.Left = 0MyRect.Right = 800MyRect.Bottom = 600 'انشاء السطحSet MySurf = Dd.CreateSurfaceFromFile _ (App.Path & "\back.bmp", My_Ddsd)javascript:popup.TextPopup(poptxt761, popfont761,9,9,-1,-1) 'ولرسم السطح نكتبBack_Buffer.BltFast 0, 0, MySurf, _MyRect, DDBLTFAST_WAIT
ان رسم السطوح على السطح الخفي لهو من الأشياء السهلة والبسيطة ... ومع الوقت ستجد نفسك تكتبها بسهولة وتلقائية ..
DdColorKey
لنفترض أنك تريد أن تصنع لعبة ... والكائن الرئيسي في هذه اللعبة هو طائرة ... وأنك رسمت الطائرة ببرنامج كالفوتوشوب مثلا أو غير ذلك وحفظت الصورة على هيئة صورة نقطية فيسكون شكلها كالتالي مثلا :

ولكن هذا الشكل لايعجبك فأنت تريد صورة الطائرة فقط بدون الصندوق الأسود حولها ... وفي هذه الحالة أنت تحتاج لااستخدام DdColorKey واستخدامه كالتالي :



أولا أعلن عن كائن من نوع DdColorKey كالتالي :
Dim Key As DdColorKey
ثم قم بتخصيصه كالتالي :
Key.high = 0
key.low = 0
بعد أن تتم تحميل الصورة في Surface عن طريق Dd.CreateSurfaceFromFile
تكتب السطرالتالي :
MySurf.SetColorKey DDCKEY_SRCBLT, Key
وفي سطر الرسم على السطح الخفي Back_Buffer.BltFast ستغير العنصر الأخير DDBLTFAST_WAIT إلى DDBLTFAST_SRCCOLORKEY الآن سيكون شكل طائرتك كالتالي :



نظام العرض


تعلمنا حتى الآن انشاء كائن دايركت درو ... واخترنا طريقة تعامل وتعاون برنامجنا أو لعبتنا مع البرامج الأخرى في Windows ...
وبقى أن نحدد نظام العرض الذي ستعمل عليه لعبتنا .
لماذا أغير نظام العرض؟؟
لكي نعرف لماذا يتعين علينا تغيير نظام العرض يجب أن نعرف بعض التعريفات الآتية :
1- الشاشة : أي شاشة مهما كان حجمها هي عبارة عن شكل مستطيل أبعاده 2 : 3 ... وتنقسم الشاشة إلى عدد من النقاط الصغيرة المتلاصقة ... وبوضع هذه النقاط بجوار بعضها البعض يتكون المشهد
2- المشهد : هو مجموعة من النقاط الملونة المتناسقة التي تصنع في مجملها شكلا أو مشهدا وكل مشهد له عدد من الصفات وهو نقطة البداية ونقطة النهاية وعرض وارتفاع ... وكل ذلك يتم تحديده بواسطة وحدة القياس Pixel
3- Pexil : بيكسل هي وحدة قياس نستخدمها في دايركت إكس ونقوم بتحديد عدد Pixels في الشاشة لنتمكن من البرمجة بها ...
أعتقد الآن أننا نعرف لماذا يتعين علينا تغيير نظام العرض ... وذلك لأن عدد Pixels يختلف من مستخدم لآخر ... ولو أننا لم نغير نظام العرض تبعا للمقاييس التي نستخدمها في ألعابنا ووضعنا ألعابنا على جهاز يعمل بمقاييس أخرى غير مقاييسنا ستظهر اللعبة بشكل مشوه ... وقد لا تعمل على الإطلاق .
معرفة إعدادات الجهاز الذي أعمل عليه الآن
قد تحتاج لمعرفة إعدادات الجهاز الذي ستعمل عليه ... ويمكنك ذلك بكل سهولة من خلال دايركت درو ...
# أولا سنعلن عن كائن من نوع DdSurfaceDesc2 وهو كائن له العديد من الوظائف ... وسنستخدمه كثيرا في الدروس القادمة ...
# ثم نجعل دايركت درو يضع إعدادات الشاشة الرئيسية في هذا الكائن ...
# ثم نعرض اعدادات الشاشة من هذا الكائن على الفورم ...
مهذا يمكن عمله بالكود التالي :

كود:
Private Sub Form_Load()Dim Dx As DirectX7Dim Dd As DirectDraw7Set Dx = New DirectX7Set Dd = Dx.DirectDrawCreate("")Dim Ddsd As DDSURFACEDESC2Dd.SetCooperativeLevel Form1.hWnd, _DDSCL_ALLOWMODEX Or DDSCL_EXCLUSIVE Or _DDSCL_FULLSCREENDd.GetDisplayMode DdsdShowPrint "ارتفاع الشاشة " & Ddsd.lHeightPrint "عرض الشاشة " & Ddsd.lWidthPrint "سرعة التحديث" & Ddsd.lRefreshRateEnd Sub
باستخدام الكود السابق سيعرض لك على الفورمة ثلاثة سطور هي بالترتيب :
1- عدد النقط Pixels في بارتفاع الشاشة
2- عدد النقط Pixels بعرض الشاشة
3- سرعة التحديث RefreshRate وهي تعتمد على قدرة كارت الفيديو .






# في السطور السابقة تعرفنا على كيفية معرفة نظام العرض لدى المستخدم وبقى أن نعرف كيف نغير نظام العرض يكون متوافقا مع لعبتنا ... وذلك يكون بالكود التالي :

كود:
Dd.SetDisplayMode 800, 600, 16, 0, DDSDM_DEFAULT












التوقيع
لو علمت الشعوب عظمة الرحمن لكان شهيقها الذكر وزفيرها قراءة القرآن
لا إله إلا أنت سبحانك إني كنت من الظالمين
سبحان الله وبحمده ، سبحان الله العظيم

كل من الفائزين والخاسرين يسقطون على الارض ولكن.... الخاسرين فقط هم الذين يفقدون القدرة على النهـــــــوض.....
  رد مع اقتباس
إضافة رد

مواقع النشر (المفضلة)


الذين يشاهدون محتوى الموضوع الآن : 1 ( الأعضاء 0 والزوار 1)
 

تعليمات المشاركة
لا تستطيع إضافة مواضيع جديدة
لا تستطيع الرد على المواضيع
لا تستطيع إرفاق ملفات
لا تستطيع تعديل مشاركاتك

BB code is متاحة
كود [IMG] متاحة
كود HTML معطلة

الانتقال السريع

المواضيع المتشابهه
الموضوع كاتب الموضوع المنتدى مشاركات آخر مشاركة
قائمة كتب حديثه التكنولوجي النشط عروض الكتب والإصدارات المتخصصة في مجال المكتبات والمعلومات 37 Dec-31-2016 06:00 PM


الساعة الآن 04:40 AM.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. جميع الحقوق محفوظة لـ : منتديات اليسير للمكتبات وتقنية المعلومات
المشاركات والردود تُعبر فقط عن رأي كتّابها
توثيق المعلومة ونسبتها إلى مصدرها أمر ضروري لحفظ حقوق الآخرين