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

شرح امثلة الدايركت اكس من البدايه

بدأه DirectProg في 5 مايو 2005 · 35 رد · 8,399 مشاهدة · في DirectX
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم جميعا.....

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

سابدا بشرح امثلة SDK السته واحد تلو الاخر مع نقاش واضح وممتاز ان شاء الله.................

هذا سيكون نقطة البدايه لكل مبرمج سي++

ساضع ان شاء الله اول كود يوم السبت او الاحد على خير ان شاء الله

ارجو من الاعضاء ان يتفاعلو

وشكرا ................

#2

وعليكم السلام

الله يوفقك .. وبانتظارك ..

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#3

للأسف لا اتوقع ان يكون هنا تفاعل كبير, بس انت توكل على الله و ابدأ.

#4
hasan_aljudy كتب:
للأسف لا اتوقع ان يكون هنا تفاعل كبير, بس انت توكل على الله و ابدأ.

ما لا تتوقع............

#5

اليوم هو البدايه

وان شاء الله اجد التفاعل ........

اليوم ساضع ابسط كود دايركت اكس هو بناء نافذه ( ليس بدوال وين 32 بل بالدايركت اكس)

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

المهم .....

ساضع الكود اليوم وان شاء الله ساضع الشرح غدا ...

اما بالنسبه للشرح فسيكون شرح عن الدايركت اكس فقط ولن اشرح اي شيء عن دوال api

الكود وهو

#include <d3d9.h>

LPDIRECT3D9             g_pD3D       = NULL; // Used to create the D3DDevice
LPDIRECT3DDEVICE9       g_pd3dDevice = NULL; // Our rendering device


HRESULT InitD3D( HWND hWnd )
{
    
    if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
        return E_FAIL;

    D3DPRESENT_PARAMETERS d3dpp; 
    ZeroMemory( &d3dpp, sizeof(d3dpp) );
    d3dpp.Windowed = TRUE;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;


    if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                      &d3dpp, &g_pd3dDevice ) ) )
    {
        return E_FAIL;
    }

    // Device state would normally be set here

    return S_OK;
}




VOID Cleanup()
{
    if( g_pd3dDevice != NULL) 
        g_pd3dDevice->Release();

    if( g_pD3D != NULL)
        g_pD3D->Release();
}





VOID Render()
{
    if( NULL == g_pd3dDevice )
        return;

    // Clear the backbuffer to a blue color
    g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_ARGB(255,45,0,25), 1.0f, 0 );
     // Begin the scene
    if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
    {
        
	// Rendering of scene objects can happen here
    
        // End the scene
        g_pd3dDevice->EndScene();
    }

   
    // Present the backbuffer contents to the display
    g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}




LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    switch( msg )
    {
        case WM_DESTROY:
            Cleanup();
            PostQuitMessage( 0 );
            return 0;

        case WM_PAINT:
            Render();
            
            return 0;
    }

    return DefWindowProc( hWnd, msg, wParam, lParam );
}





INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
{
    
    WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L, 
                      GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
                      "D3D Tutorial", NULL };
    RegisterClassEx( &wc );

  
    HWND hWnd = CreateWindow( "D3D Tutorial", "D3D Tutorial 01: CreateDevice", 
                              WS_OVERLAPPEDWINDOW, 100, 100, 300, 300,
                              GetDesktopWindow(), NULL, wc.hInstance, NULL );

    
    if( SUCCEEDED( InitD3D( hWnd ) ) )
    { 
       
        ShowWindow( hWnd, SW_SHOWDEFAULT );
        UpdateWindow( hWnd );

        
        MSG msg; 
        while( GetMessage( &msg, NULL, 0, 0 ) )
        {
            TranslateMessage( &msg );
            DispatchMessage( &msg );
        }
    }

    UnregisterClass( "D3D Tutorial", wc.hInstance );
    return 0;
}

ابدا الشرح بعد قليل ان شاء الله..................

تم تعديل هذه المشاركة بواسطة DirectProg في 6 مايو 2005 في 17:28

#6

السلام عيكم

...................................

نبدا الشرح من بداية الكود بالملف المساعد

#include <d3d9.h>

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

ننتقل الى السطور التاليه

LPDIRECT3D9             g_pD3D       = NULL; // Used to create the D3DDevice
LPDIRECT3DDEVICE9       g_pd3dDevice = NULL; // Our rendering device

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

دعكم منه الان فسوف تفهمونه في المثال الثاني او الثالث ...

وستعرفون اننا لا نستطيع الاستغاناء عنه ...

ملاحظه:- لا يوجد برانامج دايركت اكس بدون Device

الان ....

 LPDIRECT3DDEVICE9       g_pd3dDevice = NULL; // Our rendering device

هذا التعبير ( متغير ثابت) نقوم بمساعدته بتعريف اسم Device ونحن هنا اطلقنا عليه اسم g_pd3dDevice واعطناه القيمه NULL ققيمه افتراضيه

القيمه هذه ليست مهم فنستخدما اذا اردنا ان نفحص اذا كان Device مازال سليم

سنتترك لذلك بعد قليل

الان....

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

LPDIRECT3D9             g_pD3D       = NULL; // Used to create the D3DDevice

هذا الكائن نستخدمه لبعض الاشياء ولكن ما يهمنا الان هو اننا نستخدمه لكي نقوم بصنع كائن الدايركت اكس الذي بواسطته نصنع Device

بعض الملاحظات حتى الان ....

1- كما رايتم في هذان السطران

LPDIRECT3D9             g_pD3D       = NULL; 
LPDIRECT3DDEVICE9       g_pd3dDevice = NULL;

انا المتغيرات تبدأ بحروف كبيره وهذا الزامي اما اسم المتغيرات فلا يهم ابدا فتستطيع ان تكتبهن بحروف كبيره اوصغيره او الاثنان معا

2- يوجد الكثير من هذه الثوابت وهذه البعض منها

.............................................................................

ننتقل الان الى الداله

 HRESULT InitD3D( HWND hWnd )

انها مجرد داله نقوم بداخلها ببعض الامور مما سنراه الان فهي داله عاديه نستطيع تسميتها ما نشاء ... ليست ثابته

ننتقل الى ما داخل هذه الداله

 if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
       return E_FAIL;

   D3DPRESENT_PARAMETERS d3dpp; 
   ZeroMemory( &d3dpp, sizeof(d3dpp) );
   d3dpp.Windowed = TRUE;
   d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
   d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;


   if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                                     D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                     &d3dpp, &g_pd3dDevice ) ) )
   {
       return E_FAIL;
   }

   // Device state would normally be set here

   return S_OK;

وهنا ننهي بعض من قصة Device ونقوم بفهم قسم منه

اولا نبدا بعبارة if وما بداخلها

 if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
       return E_FAIL;

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

داخل هذه الداله يوجد برامتر واحد وثابت دائما وهو D3D_SDK_VERSION

ساشرحه لاحقا ان شاء الله .

العباره if عباره عن فحص اذا تم صنع الكائن ...

فاذا تم صنعه فسنكمل اما لا فلن يعمل البرنامج وذلك بسبب العباره التاليه return E_FAIL;

وهي تعيد الخطا

.........................

الان لنتقدم قليلا ولنشرح عن

 D3DPRESENT_PARAMETERS d3dpp; 
   ZeroMemory( &d3dpp, sizeof(d3dpp) );
   d3dpp.Windowed = TRUE;
   d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
   d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;

هذه هي احدى صفات Device الكثيره فهذه البعض منها

نبدا بال D3DPRESENT_PARAMETERS d3dpp;

هنا هذا الثابت مجرد struct سمي ب d3dpp

اما الداله

ZeroMemory( &d3dpp ,sizeof(d3dpp) );

فهي تقول للذاكره ان تفرغ من اجل d3dpp ولكن ليست كل الذاكره بل مجرد كميه بسيطه وهنا عرفت هذه القيمه ب sizeof(d3dpp

فتقول هذه الداله بان تقوم بحجز مكان في الذاكره لل d3dpp وهذا ظهر من التعبير &d3dpp

الان لننتقل الى صفات Device وهي كالتالي

d3dpp.Windowed = TRUE;
   d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
   d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;

الصفه الاولى وهي

d3dpp.Windowed = TRUE;

فاذا كان TRUE فيعني وضع النافذه بحجم افتراضي اما اذا كانت FALSE فتعني ان يكون الحجم على ملء الشاشه ولكن ليس فقط ان وضعنا FALSE بل ونحتاج بعض الزيادات

الصفه الثانيه

d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;

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

الصفه الثالثه

d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;

وهذه تعني FORMAT اي حجم بايتات الشاشه ممكن ان تكون ذو 16Bit او 32Bit هكذا .... اما هنا فوضع القيمه الافتراضيه

فاذا اردنا وضعها على 16 فنكتب التالي

D3DFMT_D16

بدل من

D3DFMT_UNKNOWN

......

الان ناتي الى صنع Device فبعد ان قمنا بوضع بعض الصفات له وهيئنا له الكائن الذي سيقوم بصنعه نستطيع ان نصنعه

if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                                     D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                     &d3dpp, &g_pd3dDevice ) ) )
   {
       return E_FAIL;
   }

هنا استخدما المتغير g_pD3D لصنع Device بالداله CreateDevice وهي تعني صنع Device ولها ستة برامترات

ولكن قبل البدا بشرح البرامترات ساشرح التالي

في البدايه ذكرت ان g_pD3D تساعد في صنع Device وهنا ظهر ذلك الشيء بدون g_pD3D لا نستطيع صنع Device ولهذا قمنا في بداية الداله بصنع الكائن كي يعطي معلومات لل g_pD3D والتي تساعد في قدرته على صنع Device

الان ننتقل الى برامترات Device

الاول وهو D3DADAPTER_DEFAULT

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

ولكن نستطيع وضع قيمه عدديه مثل 600/800

وهكذا

الثاني وهو D3DDEVTYPE_HAL

وهو نوع كرت الشاشه الذي سنضعه لل Device يوجد على ما اظن كمان نوعين او اكثر ولكني لا اذكرهن

ولكن ساحاول تذكرهن او سايحث عنهن

الثالث وهو hWnd

وهو مقبض النافذه ... هذا البرامتر معروف لدى كل مبرمج لديه ولو معلومه صغيره عن دوال api

الرابع وهو D3DCREATE_SOFTWARE_VERTEXPROCESSING

بصراحه لا يوجد لدي اي معلومه عن هذا البرمترا ولكن يوجد احفظوه هكذا حتى املك بعض المعلومات عنه

الخامس وهو d3dpp

هذا البرامتر وقبل كل شيء هو مؤشر ويجب وضعه دائما مع & ( دلاله على المؤشر- هذا ليس درس مؤشرات) اما بالنسبه لهذا البرامتر فمن اسمه نستطيع معرفته فهو اسم struct الذي يحمل صفات Device مثل ملىء الشاشه وغيرها ووضع مؤشر لان البرامتر يؤشر الى صفات ال Device

السادس وهو g_pd3dDevice

وهو مؤشر ايضا مثله مثل الخامس ولكن هذا عباره عن اسم Device فهو كما وضعناه في بداية البرنامج اما الان فقمنا بالتأشير عليه وقلنا للداله التي تصنع ال Device ان تقوم بوضع كل هذه المعلومات ( السابقه - من صفات وحجم الشاشه .. وغيرها) وكل هذه المعلومات داخل ال g_pd3dDevice

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

الان ....

ننتقل الى نهاية هذه الداله وهي عبارة الرجوع

return S_OK;

وهي عبارة الرجوع الخاصه بالنجاح ( على ما اظن )

..................................................................................................

الان ننتقل الى الداله التاليه والتي هي VOID Cleanup()

هنا وضعنا الداله بالقيمه VOID هذه القيمه هي نفسها نفس القيم void السي++

المهم .....

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

فاذا حصل اي خلل

تقوم هذه الداله بتدمير كل شيء بنيناه وحذفه ايضا وذلك يحدث حسب التالي

 if( g_pd3dDevice != NULL) 
       g_pd3dDevice->Release();

   if( g_pD3D != NULL)
       g_pD3D->Release();

هنا لدينا g_pd3dDevice و g_pD3D وهن المتغيران الوحيدان الذان عرفناهن فاذا قمنا بتعريف واحد ثالث فسيزيد داخل هذه الداله واحد يحمل نفس تركيبة الاثنين

الان...

لماذا يحذف كل شيء وكيف ؟؟؟

كل هذا بالداله Release() فهي تقوم بالحذف والنفي وهنا ربطناها بالمتغيران g_pd3dDevice و g_pD3D ولهذا فان كائن الدايركت اكس وال Device سيحذفان .... ولكن باي حق يحذفان؟؟

نحن قمنا في بدايه البرنامج بوضع قيمه افتراضيه وهي NULL فاذا كان هذا المتغير لا يساوي NULL فهذا يدعى ان حدث ما حصل

فلهذا قمنا بهذه العمليه

هذا كل شيء عن هذه الداله

..................................................................................

والان ننتقل الى اخر داله في برنامجنا

وهي VOID Render()

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

في بداية هذه الداله نرى وجود

if( NULL == g_pd3dDevice )
       return;

وهي لا تعني الا الاستمرار

والان ساشرح اول داله

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

وهي

Clear

ولديها 6 برامترات .. بصراحه انا شخصيا اشكو من هذه البرامترات لاني لا اعرف الى القليل فقط منها ولكن لا باس احفظوها كما هي الا ان اعرف الشرح اللازم

اول وثاني برامترات 0 فاذا كان الاول صفر فالثاني الازامي ان يكون 0

اما الثالث فهو نوع الخلفيه فهل نريد خلفيه للمثلث مثلا ام ماذا ؟؟

فنحن هنا نريد خلفيه للنافذه فنضع D3DCLEAR_TARGET تستطيعون ان تجدو الفرق عن طريق وضع D3DCLEAR_ZBUFFER بدل من D3DCLEAR_TARGET وسترو النتيجه

البرامتر الرابع فهو الموقع Z لا يريد شرح

البرامتر الخامس

لا املك اي معلومه عنه الا انني يجب وضعه 0 حاليها

الان ننتقل الى ..

 if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
   {
       
// Rendering of scene objects can happen here
   
       // End the scene
       g_pd3dDevice->EndScene();
   }

وهنا في وسط هذا الكود سيكون التجميع

فنحن في بداية هذا الكود وضعنا الداله BeginScene وتعني ان نفحص اذا كان Device د تم انشائه بنجاح حتى هذه النقطه فاذا تم انشائه بنجاح ينفذ ما بالداخل

اما الداله EndScene فتقول لنا ان كل شيء انتهى بالنسبه لما نريده رسمه او انتاجه

الان ننتقل الى الداله الاخيره في دالة Render()

وهي دالة العرض والتي تقوم بعرض كل المعلومات التي جمعنها

هذه الداله تضم 4 برامترات دائما NULL

هذه الداله هي

Present( NULL, NULL, NULL, NULL );

....................

هذا كل شيء لهذا الكود ...

الان ملاحظات عن المثال بشكل عام

1- لقد راينا ان تقريبا كل داله نحتاجها مثل Present و EndScene و Clear و BeginScene ووووو

تحتاج الى ربط التالي معها

[CODE]g_pd3dDevice->

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

ولماذا لا تاتي نافذه اخره صغيره ( اصغر ممن وضعنا صفاتها في Device) وتكون هي ذات اللون الازرق ... لما؟؟

هذا بسبب وضع هذا التعبير

g_pd3dDevice->

فهي تقول ان النافذه التي بنتها هذه ال Device ستكون خلفيتها زرقاءوهكذا ....

......................................................///

ما نقصنا في هذا الكود ...

لقد نقصنا بعض الاشياء الصغيره وهي كالتالي

1- برامترات الداله Clear

2- البرامتر الرابع من الداله CreateDevice وهو D3DCREATE_SOFTWARE_VERTEXPROCESSING

3- الصفه الثانيه من صفات Device وهي d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;

4- برامترات Present

ارجو من الاخوه الابداء برايهم وان بقومو بابلاغي باي خطا بدر مني

وشكرا .....

تم تعديل هذه المشاركة بواسطة DirectProg في 6 مايو 2005 في 17:27

#7

ماشاء الله جهد رائع وتنظيم ابداعي ,,,,, انا بهرت بالتنظيم ونسيت الشرح :) .. اول درس هو اطول درس .. الدروس الجاية اسهل ولها طعم خاص ... ولكن احب ان اقول ان من اراد شرح عن دوال api فهي موجودة وكثيرة من ضمنها احد المواضيع المثبتة ..

واحب ايضا ان اقول ان هذه الكائنات لاتحفظ لكن اكتبها مرة ومرتين حتى تستوعب اكثر .. واسف على كثرة الكلام ..بانتظارك يا اخي..

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#8

ان شاء الله

....

ساقوم بوضع المثال الثاني كمان 3 ايام ان شاء الله ....

وارجو ان ارى ردود باقي الاعضاء....

#9

محاوله جيده وانجاز رائع ولكن ارجو ان لا تقف في منتصف الطريق كما حدث مع البعض سابقا

وجزاك الله خيرا اخي

#10
DirectProg كتب:
ما لا تتوقع............

لم افهم قصدك .. اخشى ان تكون فهمتني خطأ :unsure:

لما قلت لك لا اتوقع ردود هذه لم تكن اهانة لك يا أخي ..

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

#11
hasan_aljudy كتب:
و لكن لأني اعرف ان المنتدى ليس نشط جدا, و قد حدث من قبل ان يبدأ شخص بكتابة دروس ثم يتوقف لقلة الردود, فحبيت اخبرك من الأول.

من قال انني اكتب كي ارى الردود

ربما لا يجود من يستفيد من هذا الموضوع الان ولكن سياتي اليوم الذي يستفيد منه الكثير ولهذا مستحيل ان اتوقف لمثل هذه الاسباب التافهه

بل ممكن ان اتاخر في وضع بعض الامثله بسبب الوقت ومعرفتي لبعض المعلومات ( اي يمكن ان لا افهم بعض الاشيءامن مثال رقم 2 فهذا يجعلني ان اؤوجل وضع الشرح ليومين او ثلاثه ( مجرد مثال) )

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

وشكرا لردودكم ..

#12

ارجو من الاخوه الابداء برايهم وان بقومو بابلاغي باي خطا بدر مني

وشكرا .....

LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; // Our rendering device

هذا التعبير ( متغير ثابت) نقوم بمساعدته بتعريف اسم Device ونحن هنا اطلقنا عليه اسم g_pd3dDevice واعطناه القيمه NULL ققيمه افتراضيه

القيمه هذه ليست مهم فنستخدما اذا اردنا ان نفحص اذا كان Device مازال سليم

سنتترك لذلك بعد قليل

هذا ليس متغير ثابت ، هو مؤشر من نوع long .

LONG POINTER ..

الا تلاحظ اننا اعطينا المؤشر NULL ???

ZeroMemory( &d3dpp ,sizeof(d3dpp) );

فهي تقول للذاكره ان تفرغ من اجل d3dpp ولكن ليست كل الذاكره بل مجرد كميه بسيطه وهنا عرفت هذه القيمه ب sizeof(d3dpp

فتقول هذه الداله بان تقوم بحجز مكان في الذاكره لل d3dpp وهذا ظهر من التعبير &d3dpp

" هنا معناها ضع جميع اعضاء الهيكل d3dpp بصفر " !

اما الثالث فهو نوع الخلفيه فهل نريد خلفيه للمثلث مثلا ام ماذا ؟؟

فنحن هنا نريد خلفيه للنافذه فنضع D3DCLEAR_TARGET تستطيعون ان تجدو الفرق عن طريق وضع D3DCLEAR_ZBUFFER بدل من D3DCLEAR_TARGET وسترو النتيجه

لا ،

هذه الدالة تقوم بسمح الشاشة مما كانت عليه من رسومات سابقة مثل سطح المكتب مثلاً ....

هناك خطأ كبير ،،

لقد استهللت مقدمة موضوعك " ارجو التفاعل "

و انت تعاتبني علي موضوعي " كورس برمجة الالعاب " .. !! :lol:

BEng , Electronics and communications.

Embedded systems engineer.

Graphics Programmer

عالم الكومبيوتر هو من لديه المعرفة في علوم الكومبيوتر ، الرياضيات ، هندسة الالكترونيات -احمد صالح

#13

اخ احمد اذا كانت هذه بدايتك

بالتعامل معي بقسوه

فلا باس

وسامحك الله

ولكن لا تنسى انني ساستمر ولن اتوقف مثلك

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

اما الباقي لمن يحملون الالقاب فعليهم ان لا يحتقرون الاخرين بل ان يكون عبره

احمد انت انسان اناني .. نعم اناني

انتم لا تعرفونه ولكن ستعرفونه قريبا ... كم موضوع كتب اخ احمد

1000000 ولكن لا يوجد اي موضوع اكملته

الله يسامحك

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

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

انا اعلن لكم انني اكتب هذا الرد بكل فرحتي وليس بغضب واهتدي بالله واسبحه والحمدلله واشكره

2- اما الاخطاء التي ذكرتها

فالاولى وهي

LONG POINTER ..

فاشكرك لان وضحت لي

اما الثانيه

" هنا معناها ضع جميع اعضاء الهيكل d3dpp بصفر " !

فاظن ان هذا ما رميت اليه واذا لم تفهم فهذه مشكلتك

اما الثالثه

هذه الدالة تقوم بسمح الشاشة مما كانت عليه من رسومات سابقة مثل سطح المكتب مثلاً ....

للاسف انا فاهم كويس ماذا تعني ولكني لم اعرف كيف اشرحها بطريقه اخرى

وشكرا ....

تم تعديل هذه المشاركة بواسطة DirectProg في 7 مايو 2005 في 19:37

#14

يا اخي هدي اعصابك ولا تصير حساس ..

لا تقلي انت هادي, انت مو هادي ..

انا كتبت لك كلمة صغير. قمت قلبت الدنية فوق راسي كأنني اهنتك!!

كما ان احمد لم يوجه اي اهانة لك (الا اذا قام بتعديل المشاركة) كل ما وجهه هو نقد بناء مع دعابة صغيرة. لا أدري اين الاهانة.

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

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

طبعا تستطيع توضيح المفاهيم من خلال شرح الأسطر, لكن انك مجرد تقول "هذه الدالة تعمل كذا" فسيدور الف سؤال في ذهن القاري, اولها و اهمها "و لماذا نحتاج عمل كذا؟؟!, و ما فائدته و ما دخله بالموضوع؟؟؟"

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

كذلك عندما تشرح شي مثل دايركت اكس, لازم تفترض في القاريء انه يعرف كيف يبرمج .. يعني لا داعي لشرح تفاصيل مثل:

اقتباس
LPDIRECT3DDEVICE9       g_pd3dDevice = NULL; // Our rendering device

هذا التعبير ( متغير ثابت) نقوم بمساعدته بتعريف اسم Device ونحن هنا اطلقنا عليه اسم g_pd3dDevice واعطناه القيمه NULL ققيمه افتراضيه

القيمه هذه ليست مهم فنستخدما اذا اردنا ان نفحص اذا كان Device مازال سليم

اي شخص مبتديء في السي بلص بلص لا بد ان يعرف ما معنى NULL بل و يستطيع استنتاج ان المتغير هو عبارة عن pointer, اما اذا كان القاريء لا يعرفل ذلك, فالأفضل له ان يتعلم البرمجة اولا قبل ان يدخل في معمعة الدايركت اكس.

#15

هذه املاحظه التي قلتها لي

لم تغضبني وعندما رددت على ردك ... كان مجرد سؤال وليس غضب

وانا اسف

-

#16

وشكرا لك على هذا التعليق....

#17

السلام عليكم

والله يا اخوتي لا اجد هناك داعي للغضب فكلنا يصيب ويخطيء

يعني يا اخي DirectProg تستطيع ان تنبه احمد صالح اذا اخطأ والعكس صحيح

وكل منا يستطيع ذلك وبهذا تعم الفائدة للجميع

ربما طريقة التنبيه او تبيان الخطأ فقط تحتاج الى مراعاة لمشاعر الاخرين .

"خيركم من تعلم العلم وعلمه". ..........استغفر الله. ........ اللهم صلي وسلم على سيدنا محمد

احمد عبد الحميد ابوغرارة

CodeGuru CodeProject CGTalk

#18
ahmed_3d كتب:
السلام عليكم

والله يا اخوتي لا اجد هناك داعي للغضب فكلنا يصيب ويخطيء

يعني يا اخي DirectProg تستطيع ان تنبه احمد صالح اذا اخطأ والعكس صحيح

وكل منا يستطيع ذلك وبهذا تعم الفائدة للجميع

ربما طريقة التنبيه او تبيان الخطأ فقط تحتاج الى مراعاة لمشاعر الاخرين .

نا لم امانع عدم ابلاغي بالاخطاء بل انا من طلب ذلك

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

وبسبب هذه الكلمات بدا باهانتي

لا باس

لا باس........................ :(

#19

الموضوع رائع و طريقة الشرح أيظا ... توجد بعض الأخطاء لكن لابأس ...

إن كنتم تريدون الشجار فأرجو فتح موضوع خاص به :) و طلب من الإدارة نقل الشجار إلى هناك لكي يبقى الموضوع نضيف

لأن بداية الموضوع رائع و نريد نهايته أن تكون رائعة

#20

لا اظن اني ساكمل

#21
اقتباس
ولكن لا تنسى انني ساستمر ولن اتوقف مثلك

على الأقل أكمل من أجل ما قلته :)

#22
GameDev4Arab كتب:
على الأقل أكمل من أجل ما قلته  :)

حسنا ... ساكمل ..ولن اتوقف ابدا

شكرا اخي بصراحه كلامتك هي من ايقظتني

شكرا للجميع .. كل من رد بالجيد والسيء وشكرا لك ايضا اخ احمد

#23
اقتباس
حسنا ... ساكمل ..ولن اتوقف ابدا

ننتظرك :)

#24

"لقد تم الغاء صلاحية الاخ

directprog

وذلك لما حصل من مشاكل مع احمد صالح

ملاحظه: حسب ما قاله الأخ فهو لم يقم إلا بالدفاع عن الاهانات التي اهانه اياه احمد صالح"

#25

و لكن انا مسامحه :( ...

BEng , Electronics and communications.

Embedded systems engineer.

Graphics Programmer

عالم الكومبيوتر هو من لديه المعرفة في علوم الكومبيوتر ، الرياضيات ، هندسة الالكترونيات -احمد صالح

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

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

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

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

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