السلام عليكم انا عضو جديد عمري 14 سنة ارجو ان تقبلوني و ه>ه اولى دروسي
تهيئة DirectX للعمل في البعد الثالث
ارجو ان يكون الشرح بعيد عن الغرابة فانا غير جيد في الشرح
في هذا المثال سنقوم بانشاء نافذة فارغة و هو الأساس في جميع الألعاب الثلاثية المصمة بواسطة Directx9
سم بالله و من ثم و قم بتشغيلMicrosoft Visual C++ 6.0 و من ثم انشىء مشروع جديد Win32 application
و من ثم قم بربط المكتبات
بداخل Visual C++ 6.0 قم بالذهاب إلى Project ثم Settings ثم اضغط على Link الموجودة بالقائمة
تحت "Object/Library Modules" سوف تجد مجموعة من المكتبات قمت باضافة المكتبات الثلاثة
التالية لهم سواء في البداية او النهاية وتأكد بوجود مسافة بين كل مكتبة واخرى
d3d9.lib d3dx9.lib winmm.lib
ثم قم بانشاء C/C++ Header File و سمه d3dUtility
و قم بوضع ما يلي :
كود:
#ifndef __d3dUtilityH__ #define __d3dUtilityH__ #include <d3dx9.h> #include <string>
نهاية الكود
يقوم الكود السابق بتعريف الملفات الرأسية
قم بوضع الكود التالي
كود:
namespace d3d
{
bool InitD3D(
HINSTANCE hInstance,
int width, int height,
bool windowed,
D3DDEVTYPE deviceType,
IDirect3DDevice9** device);نهاية الكود
يقوم بتهيئة نافذة التطبيق وتعيد مؤشرا الى IDirect3DDevice9
كود:
int EnterMsgLoop( bool (*ptr_display)(float timeDelta));
نهاية الكود
الكود السابق يغلف حلقة رسائل التطبيق حيث يأخذ مؤشرا الى امر الإظهار
كود
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
template<class T> void Release(T t)
{
if( t )
{
t->Release();
t = 0;
}
}يقم بانشاء الكائن و حجز مساحة له
كود
template<class T> void Delete(T t)
{
if( t )
{
delete t;
t = 0;
}
}
}
#endif // __d3dUtilityH__نهاية الكود
يقوم بحذف الكائن و تحرير المساحة
لقد تم انهاء الملف الأول و هذا هو الكود مرتب
الكود كامل:
////////////////////////////////////////////////////////////////////////////////
//
// اسم الملف: d3dUtility.h
//
////////////////////////////////////////////////////////////////////////////////
#ifndef __d3dUtilityH__
#define __d3dUtilityH__
#include <d3dx9.h>
#include <string>
namespace d3d
{
bool InitD3D(
HINSTANCE hInstance,
int width, int height,
bool windowed,
D3DDEVTYPE deviceType,
IDirect3DDevice9** device);
int EnterMsgLoop(
bool (*ptr_display)(float timeDelta));
LRESULT CALLBACK WndProc(
HWND hwnd,
UINT msg,
WPARAM wParam,
LPARAM lParam);
template<class T> void Release(T t)
{
if( t )
{
t->Release();
t = 0;
}
}
template<class T> void Delete(T t)
{
if( t )
{
delete t;
t = 0;
}
}
}
#endifالشرح التفصيلي:
InitD3D : يقوم هذا الأمر بتهيئة نافذة التطبيق الرئيسية من خلال
HINSTANCE hInstance, int width, int height, bool windowed
و تنفيذ كود تهيئة Direct3D الذي سوف اشرحه لاحقا , و تعيد مؤشرا الى واجهة IDirect3DDevice9 من خلال
IDirect3DDevice9** device
EnterMsgLoop : يغلف هذا التابع حلقة رسائل التطبيق حيث ياخذ مؤشرا الى تابع الإظهار من خلال
(*ptr_display)(float timeDelta));
Release : هذا التابع موجود من اجل التوافقية مع وظيفة التحرير(release)
Delete : هذا التابع موجود من اجل التوافقية مع وظيفة حذف الكائن و تحرير الذاكرة المخصصة له
بعد أن انتهينا من إنشاء الملف الراسي للبرنامج سوف ننتقل إلى إنشاء الملف التالي
قم بإنشاء C++ Source File و سمه d3dUtility وقم بوضع الكود التالي
#include "d3dUtility.h"
bool d3d::InitD3D(
HINSTANCE hInstance,
int width, int height,
bool windowed,
D3DDEVTYPE deviceType,
IDirect3DDevice9** device)
{لقد تم شرح الكود سابقا
قم بوضع الكود التالي
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)d3d::WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(0, IDI_APPLICATION);
wc.hCursor = LoadCursor(0, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = 0;
wc.lpszClassName = "Direct3D9App";
if( !RegisterClass(&wc) )
{
::MessageBox(0, "RegisterClass() - FAILED", 0, 0);
return false;
}
HWND hwnd = 0;
hwnd = ::CreateWindow("Direct3D9App", "Direct3D9App",
WS_EX_TOPMOST,
0, 0, width, height,
0 /*parent hwnd*/, 0 /* menu */, hInstance, 0 /*extra*/);
if( !hwnd )
{
::MessageBox(0, "CreateWindow() - FAILED", 0, 0);
return false;
}
::ShowWindow(hwnd, SW_SHOW);
::UpdateWindow(hwnd);يقوم الكود السابق بإنشاء نافذة التطبيق الرئيسية
الشرح التفصيلي للكود السابق:
style : يحدد أسلوب عرض النافذة لق اخترت CS_HREDRAW مع CS_VREDRAW اللذان يقومان بإعادة رسم النافذة كلما تغير حجمها
lpfnWndProc : مؤشر الى تابع اجراء النافذة
cbClsExtra , cbWndExtra : عبارة عن أماكن ذاكرة إضافية يمكنك استخدامها لأغراضك الخاصة
hInstance : يحوي مقبض التطبيق
hIcon : يحدد أيقونة التطبيق
سوف اكمل الشرح لأنني اضطررت الى قطع الإتصال
