الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

تهيئة Directx 9 للعمل في البعد الثالث

مغلق
بدأه rzoq في 17 أكتوبر 2005 · 3 رد · 2,628 مشاهدة · في DirectX
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم انا عضو جديد عمري 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 : يحدد أيقونة التطبيق

سوف اكمل الشرح لأنني اضطررت الى قطع الإتصال

تم تعديل هذه المشاركة بواسطة rzoq في 17 أكتوبر 2005 في 13:44

قريبا دروس ديريكت اكس 9 من تصميمي

#2

عندي سؤال .. لك الحق تجيب عنه او لا تجيب ....

هل كنت عضو في منتدى المنتدى .... لتصميم الالعاب .. ؟؟

ثانيا بداية جيدة .... وحماس كبير .. لكن لاحظ انه في فرق بين api و dx ... يعني حاول تركز في دروس على dx فقط .. حتى ما يروح جهدك في شيء ثانوي ..

الدرس القادم هو ................... ننتظر :)

د

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#3

السلام عليكم

أولا أشكرك أخي العزيز على هذه المحاولة الفعالة لكن هناك ملاحظة حول الدرس

حيث أعتقد انه قبل الشرع في كتابة الكود عليك أن تشرح المبادئ الأساسية التي يرتكز عليها الدرس فمثلا عندما يأتي أحد و يقرا سيجد في البداية deviceType

و سيقول ما هذا الشيئ أصلا و لماذا هو موجود هنا و عندها من المفترض أن يتم شرح كيفية ارتكاز directx على تقنية com

أولا حتى يفهم القارئ لماذا تريد الحصول على interface و هكذا .

#4

مشكور اخي بدايه جيدة

والشرح بصراح جيد

هذا الموضوع مغلق.

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…