Professional Documents
Culture Documents
اﻟﻔﻬﺮس:
اﻟﺪرس اﻷول- :
ﻋﻦ اﻟﺪورة
-ﻣﺘﻄﻠﺒﺎت اﻟﺪورة
-ﺗﻨﺰﻳﻞ اﻟـ)DirectX ٩٫٠ (SDK
-ﺗﻨﺰﻳﻞ اﻟـMicrosoft Visual Studio.Net ٢٠٠٠
اﻟﺪرس اﻟﺜﺎﻧﻲ:
-آﺮت اﻟﺸﺎﺷﺔ
-ﻣﻜﺘﺒﺎت اﻟـAPI
-ﺗﺎرﻳﺦ اﻟـDirectX
-ﻣﺼﻄﻠﺢ اﻟـHAL
-ﻣﻜﻮﻧﺎت اﻟـDirectX
اﻟﺪرس اﻟﺜﺎﻟﺚ:
-ﻃﺮﻳﻘﺔ اﻟﺘﺼﺮﻳﺢ ﻋﻦ اﻟـDirectX
-ﻣﻘﺪﻣﺔ ﻋﻦ اﻟـDirect٣D
-اﻟـPresentParameters
-اﻟـDevice
اﻟﺪرس اﻟﺮاﺑﻊ:
-اﻟﺪاﻟﺔOnpaint
-اﻟﺪاﻟﺔ اﻟﺮﺋﻴﺴﻴﺔ)(Main
اﻟﺪرس اﻟﺨﺎﻣﺲ:
-ﺗﺤﻤﻴﻞ ﻣﻠﻔﺎت اﻟـ DirectXﻓﻲ اﻟـ Microsoft Visual
Studio.Net
-اﻟﺒﺪاﻳﺔ ﻣﻊWindows Application
-اﻟﺒﺮﻧﺎﻣﺞ اﻷول ﻣﻊ اﻟـDirectX
:اﻟﺪرس اﻟﺴﺎدس
- Vertexe
- Position Vertexes
- Transformed Vertexes
:اﻟﺪرس اﻟﺴﺎﺑﻊ
Transformed ﻓﻲ اﻟـVertexes ﺗﺤﺪﻳﺪ اﻟـ-
TransformedColoredرﺳﻢ ﻣﺜﻠﺚ ﺑﻲ اﻟـ-
:اﻟﺪرس اﻟﺜﺎﻣﻦ
PositionColored ﻓﻲ اﻟـVertexes ﺗﺤﺪﻳﺪ اﻟـ-
Cameraاﻟـ-
:اﻟﺪرس اﻟﺘﺎﺳﻊ
Translation اﻟـ-
Rotation اﻟـ-
:اﻟﺪرس اﻟﻌﺎﺷﺮ
Scalingاﻟـ-
و اﻟـRotation و اﻟـTranslation ﻟﻠـMatrix ﺟﻤﻊ اﻟـ-
Scaling
:اﻟﺪرس اﻟﺤﺎدي ﻋﺸﺮ
Vertex Mathاﻟـ-
Vertex Bufferاﻟـ-
:اﻟﺪرس اﻟﺜﺎﻧﻲ ﻋﺸﺮ
Textureاﻟـ-
Vertexأﻧﻮاع اﻟـ-
:اﻟﺪرس اﻟﺜﺎﻟﺚ ﻋﺸﺮ
Lightingاﻟـ-
Meshاﻟـ-
اﻟﺪرس اﻟﺮاﺑﻊ ﻋﺸﺮ
ﺗﺤﺮﻳﻚ اﻷﺷﻜﺎل
Fontاﻟـ-
اﻟﺪرس اﻷول:
-ﻋﻦ اﻟﺪورة
-ﻣﺘﻄﻠﺒﺎت اﻟﺪورة
-ﺗﻨﺰﻳﻞ اﻟـ)DirectX ٩٫٠ (SDK
-ﺗﻨﺰﻳﻞ اﻟـMicrosoft Visual Studio.Net ٢٠٠٠
ﻋﻦ اﻟﺪورة:
راودﺗﻨﻲ ﻓﻜﺮة ﺗﻌﻠﻢ آﻴﻔﻴﺔ ﺗﺼﻤﻴﻢ اﻷﻟﻌﺎب ﻣﻨﺬ زﻣﻦ وﻷآﻨﻲ ﻟﻢ أﻋﺮف ﻣﻦ أﻳﻦ
أﺑﺪأ ﺑﻞ وآﻴﻒ أﺑﺪأ ,ﻓﻘﻠﺖ ﻓﻲ ﻧﻔﺴﻲ ﻋﻠﻴﻚ ﺑﻲ اﻟﻤﻜﺘﺒﺎت اﻟﻌﺎﻣﺔ وﻣﻮاﻗﻊ
اﻹﻧﺘﺮﻧﺖ ,ﻷﺟﺪ ﺑﺄن اﻟﻤﻌﻠﻮﻣﺎت اﻟﻤﺘﻮاﻓﺮة ﻓﻴﻬﺎ ﺷﺤﻴﺤﺔ ,وﺗﻌﺘﻤﺪ ﻋﻠﻰ ﻣﻌﺮﻓﺔ
ﻣﺴﺒﻘﺔ ﺑﻲ هﺬا اﻟﻤﺠﺎل وﺑﻘﻴﺖ هﻜﺬا ﺗﺎﺋﺔ أﺟﻤﻊ اﻟﻠﻘﻴﻤﺎت وأﺣﺎول ﺗﺮﺗﻴﺐ
اﻟﻜﻠﻤﺎت إﻟﻰ أن وﻓﻘﻨﻲ اﷲ إﻟﻰ ﻣﻌﺮﻓﺔ ﺑﺴﻴﻄﺔ ,ﻟﺬﻟﻚ أﺳﻤﻴﺖ هﺬﻩ اﻟﺪورة ﺑﻲ
)ﻣﺪﺧﻞ اﻟﻤﺒﺘﺪئ إﻟﻰ ﺑﺮﻣﺠﺔ اﻷﻟﻌﺎب( ﻓﻬﻮ ﻣﺪﺧﻞ ﻟﻠﺘﺎﺋﺔ اﻟﺬي ﻣﺎ زال ﻳﺒﺤﺚ ﻋﻦ
اﻟﺠﻮاب ﻟﻲ )أﻳﻦ وآﻴﻒ).
ﻣﺘﻄﻠﺒﺎت اﻟﺪورة
ﺣﺘﻰ وإن ﻟﻢ ﺗﻜﻦ اﻷﺳﺎﺳﻴﺎت ﺑﺎﻷﻋﻼ واﺿﺤﺔ ﻟﺪﻳﻚ ,ﻓﻼ ﺑﺄس ,ﻓﺎﻟﻨﻘﻄﺔ اﻟﺘﻲ ﻻ
ﺗﻜﻮن واﺿﺤﺔ ﻟﺪﻳﻚ أﺛﻨﺎء ﺳﻴﺮﻧﺎ ﻓﻲ ﺧﻂ اﻟﺪورة ,أﻋﻠﻤﻨﻲ ﺑﻬﺎ وإن ﺷﺎء اﷲ
ﺳﺄوﺿﺤﻬﺎ ﻟﻚ .
ﺳﻨﻌﺘﻤﺪ ﻓﻲ اﻟﺸﺮح ﻟﻬﺬﻩ اﻟﺪورة ﻋﻠﻰ ﻟﻐﺔ اﻟـ C#,ﻣﻊ اﻟﻌﻠﻢ ﺑﺄن ﺁﻟﻴﺔ اﻟﻌﻤﻞ
واﺣﺪة ﺑﻜﻞ اﻟﻠﻐﺎت.
ﺑﻤﻌﻨﻰ أﻧﻚ ﻟﻮ إﺳﺘﻮﻋﺒﺖ ﺁﻟﻴﺔ اﻟﻌﻤﻞ ﻓﺴﻮف ﺗﺴﺘﻄﻴﻊ وﺑﻜﻞ ﺳﻬﻮﻟﺔ ﺗﻄﺒﻴﻖ
هﺬﻩ اﻟﻤﻔﺎهﻴﻢ ﻋﻠﻰ أي ﻟﻐﺔ ﺗﻄﻘﻨﻬﺎ.
اﻟﺒﺮاﻣﺞ اﻟﻤﺴﺘﺨﺪﻣﻪ:
أﻋﺘﻘﺪ أﻧﻪ ﻻ ﻳﺤﺘﺎج إﻟﻰ ﺷﺮح ...ﻓﻤﺜﻞ أي ﺑﺮﻧﺎﻣﺞ ﺣﺎول ﻓﻘﻂ اﻟﺒﺤﺚ ﻋﻦ اﻟﺰر
)(Nextﻟﺘﺼﻞ إﻟﻰ اﻟﻨﻬﺎﻳﺔ.
اﻟﺪرس اﻟﺜﺎﻧﻲ:
-آﺮت اﻟﺸﺎﺷﺔ
-ﻣﻜﺘﺒﺎت اﻟـAPI
-ﺗﺎرﻳﺦ اﻟـDirectX
-ﻣﺼﻄﻠﺢ اﻟـHAL
-ﻣﻜﻮﻧﺎت اﻟـDirectX
----------------------------------------------
آﺮت اﻟﺸﺎﺷﺔ:
ﺑﻤﺎ أن اﻟﺮﺳﻮﻣﺎت ﺗﻌﺘﻤﺪ ﻋﻠﻴﻪ ﺑﺸﻜﻞ رﺋﻴﺴﻲ ﻓﻜﺎن هﻮ ﺑﺪاﻳﺔ ﺣﺪﻳﺜﻨﺎ ,وﺳﻨﺘﻜﻠﻢ
ﻋﻨﻪ ﺑﺈﺧﺘﺼﺎر ,آﺮت اﻟﺸﺎﺷﺔ وﻳﻄﻠﻘﻮن ﻋﻠﻴﻪ أﺳﻤﺎء آﺜﻴﺮة ﻣﺜﻞ اﻟـ (Graphics
Card, Video Card, Video Board, Video Display Board, Display Adapter,
Video Adapter, Graphics Adapter),وهﻲ ﻗﻄﻌﺔ )آﺮت( ﻣﺘﺼﻞ ﻣﻊ اﻟﻠﻮﺣﺔ
اﻷم ) (Mother Boardﺗﻌﻤﻞ ﻋﻠﻰ ﺗﺨﺰﻳﻦ وﻣﻌﺎﻟﺠﺔ اﻟﺼﻮر وﺗﺤﻮﻳﻠﻬﺎ إﻟﻰ إﺷﺎرات
ﻟﺘﺴﺘﻄﻴﻊ اﻟﺸﺎﺷﺔ إﻇﻬﺎرهﺎ ,أﺻﺒﺤﺖ آﺮوت اﻟﺸﺎﺷﺔ ﻋﻨﺼﺮ أﺳﺎﺳﻲ ﻓﻲ
اﻟﻜﻤﺒﻴﻮﺗﺮات ﻣﻨﺬ ﻋﺎم ,١٩٩٠وأﺧﺬ اﻟﻤﺼﻨﻌﻮن ﻳﺘﻔﻨﺎﻧﻮن ﺑﻲ آﻴﻔﻴﺔ ﺻﻨﺎﻋﺎﺗﻬﺎ
ﺣﺘﻰ ﺗﻮﺻﻠﻮا إﻟﻰ ﻋﻤﻞ ﻣﺠﺴﻤﺎت ﺛﻼﺛﻴﺔ اﻷﺑﻌﺎد ,أول ﺷﺮآﺔ إهﺘﻤﺖ ﺑﻤﻌﺎﻟﺠﺔ
اﻟﺮﺳﻮﻣﺎت ﺛﻼﺛﻴﺔ اﻷﺑﻌﺎد هﻲ dfx ٣واﻟﺘﻲ أﻃﻠﻘﺖ آﺮوت اﻟﺸﺎﺷﺔ اﻟﺨﺎﺻﺔ ﺑﻲ
اﻷﺟﺴﺎم ﺛﻼﺛﻴﺔ اﻷﺑﻌﺎد وآﺎﻧﺖ ﺗﺤﻞ اﻹﺳﻢ voodooوأﻳﻀﺎً هﻲ ﻣﻦ إﺑﺘﻜﺮ ﻗﻨﺎﻩ
ﺗﺴﻤﻰ ﺑﻲ ) Graphics Pressing Units (GPUsوهﻲ ﻣﻨﻄﻘﺔ ﻣﻮﺟﻮدة ﻓﻲ
آﺮت اﻟﺸﺎﺷﺔ ﺗﻘﻮم ﺑﻲ اﻟﻤﻌﺎﻟﺠﺎت اﻟﺮﻳﺎﺿﻴﺔ ﻟﻸﺷﻜﺎل ﺛﻼﺛﻴﺔ اﻷﺑﻌﺎد ,ﻣﻤﺎ ﻳﺮﻳﺢ
اﻟﻤﻌﺎﻟﺞ ) (Processorﻣﻦ هﺬا اﻟﻌﺒﺊ ,واﻟﺬي ﻳﺆدي ﺑﺪورة إﻟﻰ إﺳﺮاع ﻋﻤﻠﻴﺎت
اﻟﻤﻌﺎﻟﺠﺔ ﻟﻠﻌﺒﻪ ,وﻣﻦ اﻟﻤﻤﻜﻦ أن ﻳﺤﻮي آﺮت اﻟﺸﺎﺷﺔ أآﺜﺮ ﻣﻦ ﻗﻨﺎة GPU
ﻓﻜﻠﻤﺎ زادت اﻟﻘﻨﻮات إرﺗﻔﻌﺖ اﻟﺠﻮدة.
ﻣﻦ أﺷﻬﺮ اﻟﺸﺮآﺎت ﻓﻲ هﺬا اﻟﻤﺠﺎل هﻲ:
NVIDIA
Geforce
ATI
-------------------------
اﻟﺜﺎﻧﻲ : win٣٢ Bitﺣﻴﺚ آﺘﺒﺖ دواﻟﻬﺎ ﺑﺈﺳﺘﺨﺪام ﻟﻐﺔ اﻟﺴﻲ واﻟﺴﻲ ﺑﻼس
ﺑﻼس ,وﺟﺎﺋﺖ ﺑﺎﻟﻤﻜﺘﺎﺑﺎت)(User٣٢, Gdi٣٢.dll, Kernel٣٢
اﻟﺜﺎﻟﺚ : win٦٤ Bitﺣﻴﺚ أﻧﻬﺎ إﺣﺘﻮت ﻋﻠﻰ ﻧﻔﺲ اﻟـ win٣٢وﻷآﻦ ﺑﺸﻜﻞ أوﺳﻊ
ﻓﺘﺴﺘﻄﻴﻊ اﻟﺪوال اﻵن ﻣﻌﺎﻟﺠﺔ وﻋﻨﻮﻧﺔ أرﻗﺎم أآﺒﺮ ,وﺟﺎﺋﺖ هﺬﻩ اﻟﻤﻜﺎﺗﺐ ﻋﻠﻰ
ﻧﻈﺎﻣﻲ اﻟﺘﺸﻐﻴﻞ windows XPو Window Server ٢٠٠٣
------------------------------
ﺗﺎرﻳﺦ اﻟـDirectX
ﻋﻨﺪ اﻟﺘﻜﻠﻢ ﻋﻦ ﺑﺮﻣﺠﺔ اﻷﻟﻌﺎب ﻓﻨﺤﻦ ﺿﻤﻨﻴﺎً ﻧﺘﻜﻠﻢ ﻋﻦ ﻟﻐﺔ اﻟﺠﺮاﻓﻴﻜﺲ
(Graphics Language),وﻣﻦ أﻣﺜﻠﺔ هﺬﻩ اﻟﻠﻐﺎت اﻟـ DirectXواﻟـ OpenGlواﻟـ
GDIوﺗﺴﺘﺨﺪم هﺬﻩ اﻟﻠﻐﺎت ﻓﻲ ﻧﻈﺎم وﻳﻨﺪوز و ﻳﻮﻧﻜﺲ وأﻳﻀﺎً QuickDrow
اﻟﺘﻲ ﺗﺴﺘﺨﺪم ﻋﻠﻰ أﻧﻈﻤﺔ ﻣﺎآﻨﺘﻮش.
------------------------------
وهﺬا ﻳﻌﻨﻲ:
أن أي ﻟﻌﺒﺔ ﺳﺘﻌﻤﻞ ﻋﻠﻰ أي آﺮت ﺷﺎﺷﺔ
وأن أي آﺮت ﺷﺎﺷﺔ ﺳﻴﻌﻤﻞ ﻋﻠﻰ أي ﻟﻌﺒﺔ
(ﻧﻈﺮﻳﺎت أﻓﻼﻃﻮن )
----------------------------
ﻣﻜﻮﻧﺎت اﻟـDirectX
أو ﺗﺴﻤﻰ ﺑﻲ اﻟـ ) (Name Spaceﺳﻮف ﻧﻘﻮم ﺑﺄﺧﺬ ﻓﻜﺮة ﺳﺮﻳﻌﺔ ﻋﻦ هﺬﻩ
اﻟﻤﻜﻮﻧﺎت ,وﺳﻨﺘﻌﺮض إﻟﻴﻬﺎ ﺑﺸﺊ ﻣﻦ اﻟﺘﻔﺼﻴﻞ ﻷﺣﻘﺎً.
Direct٣D :وهﻮ ﻣﻦ أهﻢ اﻟﻌﻨﺎﺻﺮ واﻟﺬي ﻳﻤﺜﻞ اﻟﻘﺎﻟﺐ اﻟﺬي ﺗﺘﺸﻜﻞ ﻓﻴﻪ اﻟﻠﻌﺒﺔ
)اﻟﻔﻮرم( وإﻋﻄﺎء اﻷﺟﺴﺎم اﻟﺸﻜﻞ ﺛﻼﺛﻲ اﻷﺑﻌﺎد )D).٣
DirectDraw :وهﻮ ﻋﻨﺼﺮ ﻣﺸﺎﺑﻪ ﻟﻲ اﻟـ Direct٣Dوﻷآﻨﻪ ﻳﺪﻋﻢ ﻓﻘﻂ اﻷﺟﺴﺎم
ﺛﻨﺎﺋﻴﺔ اﻷﺑﻌﺎد )D).٢
DirectSound :وهﻮ اﻟﻌﻨﺼﺮ اﻟﻤﺴﺘﺨﺪم ﻣﻦ أﺟﻞ ﻋﻤﻠﻴﺔ اﻟﺘﺤﻜﻢ ﺑﺎﻷﺻﻮات.
DirectPlay :وهﻮ اﻟﻌﻨﺼﺮ اﻟﻤﺴﺘﺨﺪم ﻣﻦ أﺟﻞ ﺟﻌﻞ اﻟﻠﻌﺒﺔ ﺗﺪﻋﻢ أآﺜﺮ ﻣﻦ
ﻣﺴﺘﺨﺪم ﻋﻦ ﻃﺮﻳﻖ اﻟـ Network.ﺑﺈﺳﺘﺨﺪام(Client - Server).
DirectInput :وهﻮ اﻟﻌﻨﺼﺮ اﻟﺬي ﻳﺘﻴﺢ اﻟﺘﺤﻜﻢ ﺑﻲ ﻟﻮﺣﺔ اﻟﻤﻔﺎﺗﻴﺢ أو اﻟﻔﺄرة أو اﻟـ
Joystick.
AudioVideoPlayback :وهﻮ اﻟﻌﻨﺼﺮ اﻟﺬي ﻳﺘﻴﺢ إﺳﺘﺨﺪام اﻟـ Multimediaﻣﺜﻞ
إدﺧﺎل ﻣﻠﻒ ﻓﻴﺪﻳﻮ.
اﻟﺪرس اﻟﺜﺎﻟﺚ:
-ﻃﺮﻳﻘﺔ اﻟﺘﺼﺮﻳﺢ ﻋﻦ اﻟـDirectX
-ﻣﻘﺪﻣﺔ ﻋﻦ اﻟـDirect٣D
-اﻟـPresentParameters
-اﻟـDevice
----------------------------------------------------------------------------------
إﻧﻬﺎ ﺗﺸﺒﻪ ﻟﻌﺒﺔ اﻟﺼﻨﺪوق ﺑﺪاﺧﻞ ,ﻳﺠﺐ أن ﻳﺒﻘﻰ هﺬا اﻟﻤﺨﻄﻂ ﻓﻲ ذهﻨﻚ
اﻟﺘﺼﺮﻳﺢ ﺑﺈﺳﺘﺨﺪام ﺟﻤﻠﺔ ﺻﻨﺪوق ..وهﻜﺬا إﻟﻰ أن ﺗﺼﻞ إﻟﻰ اﻟﻬﺪﻳﺔ ,ﻳﺒﺪأ
ﻳﺤﻮي أﺣﺪ ﻣﻜﻮﻧﺎﺗﻪ وهﻮ اﻟـ واﻟﺬي DirectXوﺑﻌﺪهﺎ اﻟـ Microsoftوﺑﻌﺪهﺎ using
ﻓﺌﺔ( ( Classesﻳﺤﻮي ﻋﺪة اﻟﺦ واﻟﺬي ﺑﺪورة DirectSound ..أو اﻟـ Direct3D
).ﺧﺼﺎﺋﺺ( Propertiesواﻟﺘﻲ ﺑﺪورهﺎ ﺗﺤﻮي ﻋﺪة
Direct3Dاﻟﺒﺪاﻳﺔ ﻣﻊ اﻟـ
واﻟﺮﺳﻮم ﺛﻼﺛﻴﺔ اﻷﺑﻌﺎد ,ﺳﻨﻘﻮم DirectXوهﻮ أول وأهﻢ ﺧﻄﻮات اﻟﺘﻌﺎﻣﻞ ﻣﻊ اﻟـ
ﺑﻲ آﺘﺎﺑﺔ اﻟﺨﻄﻮات واﻟﻤﺼﻄﻼﺣﺎت اﻟﺘﻲ ﺳﻨﺴﺘﺨﺪﻣﻬﺎ ﻧﻈﺮﻳﺎً وﻣﻦ ﺛﻢ ﺳﻨﺼﻴﻐﻬﺎ
:ﺑﺮﻣﺠﻲ وﻓﻲ ﺁﺧﺮ اﻟﺸﺮح ﺳﻨﻜﺘﺐ اﻟﻜﻮد آﺎﻣﻼً ﺑﺸﻜﻞ
Direct3Dو اﻟـ DirectXاﻟﺨﻄﻮة اﻷوﻟﻰ :هﻲ اﻟﺘﺼﺮﻳﺢ ﻋﻦ اﻟـ
:آﻮد
;using Microsoft.DirectX.Direct3D
;using Microsoft.DirectX
وهﻲ اﻟﺨﺎﺻﻴﺔ اﻟﺘﻲ ﺗﺤﺪد آﻴﻔﻴﺔ إﻇﻬﺎر اﻟﺮﺳﻮﻣﺎت ﻋﻠﻰ SwapEffect :
:اﻟﺸﺎﺷﺔ ,ﺗﺴﺘﺨﺪم هﺬﻩ اﻟﺨﺎﺻﻴﺔ ﺛﻼﺛﺔ ﻣﺼﻄﻼﺣﺎت وهﻲ
ﻋﻨﺪ اﻟﺘﻜﻠﻢ ﻋﻦ هﺬا اﻟﻤﺼﻄﻠﺢ ﻓﻤﻌﻨﺎﻩ ﺑﺄن آﺮت اﻟﺸﺎﺷﺔ ﻳﺤﻮي ﻣﺴﺎﺣﺔ آﺎﻓﻴﺔ
ﻟﺘﺨﺰﻳﻦ ﻣﺸﻬﺪﻳﻦ ﻣﻌﺎً (Tow Screen).أو ﺛﻼﺛﺔ أو أآﺜﺮ ﺑﺤﺴﺐ ﻧﻮع آﺮت
اﻟﺸﺎﺷﺔ
أي إذا آﺎﻧﺖ اﻟﺒﻜﺴﻞ اﻟﺘﻲ ﻳﺪﻋﻤﻬﺎ آﺮت اﻟﺸﺎﺷﺔ ﻟﺪي هﻲ x ٢٠٠ ٣٢٠
(ﺳﺘﺼﺒﺢ اﻟﻤﺴﺎﺣﺔ اﻟﻜﻠﻴﺔ اﻟﻸزﻣﺔ هﻲ x ٣٢٠ x ٢٠٠ = ١٢٨٠٠٠ ) ٢
ﺣﻴﺚ ﺗﻨﻘﺴﻢ ذاآﺮة آﺮت اﻟﺸﺎﺷﺔ إﻟﻰ ﻗﺴﻤﻴﻦ ﻣﺮﺋﻲ )أﻣﺎﻣﻲ( وﻏﻴﺮ ﻣﺮﺋﻲ
)ﺧﻠﻔﻲ ),ﺗﺒﺪأ ﻋﻤﻠﻴﺔ اﻟﺮﺳﻢ ﻓﻲ ﺻﻔﺤﺔ اﻟﻘﺴﻢ ﻏﻴﺮ اﻟﻤﺮﺋﻲ )ﺷﻜﻞ ) aوﺑﻌﺪ
اﻹﻧﺘﻬﺎء ﺗﺘﻢ ﻋﻤﻠﻴﺔ ﺗﺒﺎدل اﻟﺼﻔﺤﺎت ﻟﺘﺼﺒﺢ اﻟﻤﻌﻄﻴﺎت ﻣﺮﺋﻴﺔ )ﺷﻜﻞ b),وﺑﻌﺪهﺎ
ﺗﺘﻢ ﻋﻤﻠﻴﺔ ﺗﻨﻈﻴﻒ اﻟﻘﺴﻢ ﻏﻴﺮ اﻟﻤﺮﺋﻲ وﺗﺰوﻳﺪﻩ ﺑﺎﻟﺒﻴﺎﻧﺎت اﻟﺘﺎﻟﻴﺔ اﻟﺠﺪﻳﺪة.
ﺗﻨﻘﺴﻢ ذاآﺮة آﺮت اﻟﺸﺎﺷﺔ إﻟﻰ ﻗﺴﻤﻴﻦ ﻣﺮﺋﻲ )أﻣﺎﻣﻲ( وﻏﻴﺮ ﻣﺮﺋﻲ
)ﺧﻠﻔﻲ ),ﺗﺒﺪأ ﻋﻤﻠﻴﺔ اﻟﺮﺳﻢ ﻓﻲ ﺻﻔﺤﺔ اﻟﻘﺴﻢ ﻏﻴﺮ اﻟﻤﺮﺋﻲ )ﺷﻜﻞ ) aوﺑﻌﺪ
اﻹﻧﺘﻬﺎء ﺗﺘﻢ ﻋﻤﻠﻴﺔ ﻧﺴﺦ ) (Copyاﻟﺼﻔﺤﺎت ﻣﻦ اﻟﻘﺴﻢ ﻏﻴﺮ اﻟﻤﺮﺋﻲ إﻟﻰ
اﻟﻘﺴﻢ اﻟﻤﺮﺋﻲ )ﺷﻜﻞ b),وﺑﻌﺪهﺎ ﺗﺘﻢ ﻋﻤﻠﻴﺔ ﺗﻨﻈﻴﻒ اﻟﻘﺴﻢ ﻏﻴﺮ اﻟﻤﺮﺋﻲ
وﺗﺰوﻳﺪﻩ ﺑﺎﻟﺒﻴﺎﻧﺎت اﻟﺘﺎﻟﻴﺔ اﻟﺠﺪﻳﺪة.
Discardingﻣﺼﻄﻠﺢ اﻟـ
:آﻮد
;SwapEffect.Discard
ﻟﻨﺄﺧﺬ ﻣﺜﺎل ﻟﺘﺘﻮﺿﺢ اﻟﻔﻜﺮة أآﺜﺮ ,ﻋﻨﺪ اﻟﺒﺪء ﺑﺎﻟﺮﺳﻢ ﺑﺈﺳﺘﺨﺪام اﻟـ DirectXﻳﻘﻮم
ﻳﻘﻮم اﻟﻜﻤﺒﻴﻮﺗﺮ ﺑﺘﺨﺰﻳﻦ اﻷﺷﻜﺎل ﺑﺪاﺧﻞ اﻟـ Bufferاﻟﺨﺎص ﺑﻲ اﻟـ RAMأي
ﺑﺪاﺧﻞ ﺟﻬﺎز اﻟﻜﻤﺒﻴﻮﺗﺮ )أﻧﻈﺮ إﻟﻰ اﻟﺸﻜﻞ a),وﻋﻨﺪ اﻹﻧﺘﻬﺎء ﻳﻘﻮم اﻟﺒﺮﻧﺎﻣﺞ ﺑﻨﺴﺦ
ﺟﻤﻴﻊ اﻟﺮﺳﻮﻣﺎت إﻟﻰ ذاآﺮة ) (Bufferاﻟﺨﺎص ﺑﻲ آﺮت اﻟﺸﺎﺷﺔ )أﻧﻈﺮ إﻟﻰ
اﻟﺸﻜﻞ b),وﻣﻦ ﺛﻢ ﻳﻘﻮم ﺑﺘﻨﻈﻴﻒ اﻟـ ) (Bufferﺑﺪاﺧﻞ اﻟﻜﻤﺒﻴﻮﺗﺮ )(RAM
ﻟﻴﺴﺘﻘﺒﻞ اﻟﺒﻴﺎﻧﺎت اﻟﺘﺎﻟﻴﺔ وهﻜﺬا....
اﻟﻤﺮاد Bufferﺑﺘﺤﺪﻳﺪ ﻋﺪد اﻟـ BackBufferCountﺣﻴﺚ ﺗﻘﻮم اﻟﺨﺎﺻﻴﺔ
Bufferﻓﻬﻮ ﻳﻌﺘﻤﺪ ﻋﻠﻰ ﻧﻮع آﺮت اﻟﺸﺎﺷﺔ ﻟﺪﻳﻚ وآﻠﻤﺎ آﺒﺮ ﻋﺪد اﻟـ ,إﺳﺘﺨﺪاﻣﺔ
آﻠﻤﺎ زادت ﺳﺮﻋﺔ ﻣﻌﺎﻟﺠﺔ اﻟﺒﻴﺎﻧﺎت .وﻓﻲ اﻟﺸﻜﻞ اﻟﺘﻮﺿﻴﺤﻲ ﺑﺎﻷﻋﻼ اﻟﻤﺴﺘﺨﺪم
ﻳﺴﺎوي BackBufferCount ٢آﺎن اﻟـ
ﻣﻊ آﺮت اﻟﺸﺎﺷﺔ ﺣﻴﺚ ﺗﻘﻮم DirectXآﻴﻔﻴﺔ ﺗﻌﺎﻣﻞ اﻟـ Classﺗﺤﺪد هﺬﻩ اﻟـ
:ﺑﻲ
أوﻻً :ﺗﺤﺪﻳﺪ أي آﺮت ﺷﺎﺷﺔ ﺳﻮف ﻳﺴﺘﺨﺪم ,ﻧﻌﻠﻢ ﺑﺄن هﻨﺎك أﺟﻬﺰة ﺗﺤﻮي أآﺜﺮ
آﺮت ﺷﺎﺷﺔ ,وﻳﻘﻮم اﻟﻜﻤﺒﻴﻮﺗﺮ ﺑﺤﺮآﺔ ذآﻴﺔ ﻟﻴﻤﻴﺰ أي ﻣﻦ هﺬﻩ اﻟﻜﺮوت هﻮ ﻣﻦ
ﺑﻨﻔﺲ هﺬ اﻷﺳﻠﻮب (ID Number),ﻓﻴﻘﻮم ﺑﺈﻋﻄﺎءة اﻟﺮﻗﻢ ٠اﻟﺮﺋﻴﺴﻲ
هﺬﻩ اﻟﻄﺮﻳﻘﺔ ﻟﻴﻘﻮم ﺑﺘﺤﺪﻳﺪ أي ﻣﻦ آﺮوت اﻟﺸﺎﺷﺔ ﺳﻮف DirectXﻳﺴﺘﺨﺪم اﻟـ
.ﻳﺴﺘﺨﺪم
ﻣﻼﺣﻈﺔ :إذا آﻨﺖ ﻻ ﺗﻤﻠﻚ إﻻ آﺮت ﺷﺎﺷﺔ واﺣﺪ ﻓﻘﻂ ﻓﻲ ﺟﻬﺎزك ﻓﻄﺒﻌﺎً
ﺳﻴﺄﺧﺬ اﻟﺮﻗﻢ ٠
:آﻮد
)… Device (0, …, …, …,
:ﺛﺎﻧﻴﺎً :ﺗﺤﺪﻳﺪ اﻟﻤﻜﺎن اﻟﺬي ﺳﺘﺘﻢ ﻓﻴﻪ اﻟﻤﻌﺎﻟﺠﺔ ,وﺗﻮﺟﺪ ﺛﻼﺛﺔ ﺧﻴﺎرات هﻢ
أي أن ﺟﻤﻴﻊ ﻋﻤﻠﻴﺎت اﻟﻤﻌﺎﻟﺠﺔ )ﻣﻦ إزاﺣﺎت وإﺿﺎءة – ﺳﻨﺘﻜﻠﻢ Softwareاﻟـ
(CPU).ﻻﺣﻘﺎً( ﺳﺘﺘﻢ ﻓﻲ اﻟﻜﻤﺒﻴﻮﺗﺮ ﺑﻲ وﺣﺪة اﻟﻤﻌﺎﻟﺠﺔ اﻟﻤﺮآﺰﻳﺔ ﻋﻨﻬﺎ
(GPU).ﺟﻤﻴﻊ ﻋﻤﻠﻴﺎت اﻟﻤﻌﺎﻟﺠﺔ ﺳﺘﺘﻢ ﻓﻲ آﺮت اﻟﺸﺎﺷﺔ Hardwareاﻟـ
أي Debuggingﻳﺴﺘﺨﺪم هﺬا اﻟﺨﻴﺎر ﻓﻘﻂ ﻣﻦ أﺟﻞ ﻋﻤﻠﻴﺔ اﻟـ Referenceاﻟـ
DirectXﻟﻠـ SDKاﻹﺧﺘﺒﺎر ﺣﻴﺚ ﺗﻌﺘﻤﺪ ﻋﻤﻠﻴﺔ اﻟﻤﻌﺎﻟﺠﺔ ﻓﻴﻪ ﻋﻠﻰ ﻋﻤﻠﻴﺔ
:آﻮد
)… Device (0, DeviceType.Hardware ,…, …,
ﻋﻠﻰ اﻟﺮﺳﻢ ﻋﻠﻴﻪ ,وﻧﺴﺘﻄﻴﻊ DirectXﺛﺎﻟﺜﺎً :ﺗﺤﺪﻳﺪ اﻟﻔﻮرم اﻟﺬي ﺳﻴﻌﻤﻞ اﻟـ
.أي هﺬا اﻟﻔﻮرم اﻟﺬي ﻧﺤﻦ ﻓﻴﻪ ) (thisاﻟﺘﻌﺒﻴﺮ ﻋﻨﻪ ﺑﺎﻟﻜﻠﻤﺔ
:آﻮد
)… Device (0, DeviceType.Hardware , this, …,
وهﻲ اﻟﻨﻘﺎط اﻟﺘﻲ ( Vectorsراﺑﻌﺎً :ﺗﺤﺪﻳﺪ اﻟﻤﻜﺎن اﻟﺬي ﺳﺘﺘﻢ ﻓﻲ ﻣﻌﺎﻟﺠﺔ اﻟـ
:ﻳﺘﻢ رﺳﻢ اﻷﺷﻜﺎل ﺑﻮاﺳﺘﻄﻬﺎ( وﺗﻮﺟﺪ ﺛﻼﺛﺔ ﺧﻴﺎرات ﻟﺬﻟﻚ هﻲ
:آﻮد
Device (0, DeviceType.Hardware , this, SoftwareVertexProcessing )… ,
:آﻮد
Device (0, DeviceType.Hardware , this, SoftwareVertexProcessing ,
) Object- PresentParameters
:آﻮد
)(public void ondevice
{
PresentParameters pp = new
PresentParameters();
pp.Windowed=true;
pp.SwapEffect = SwapEffect.Discard;
pp.EnableAutoDepthStencil = true;
pp.AutoDepthStencilFormat = DepthFormat.D16;
ﻻ ﺗﻘﻠﻖ ﺳﻨﺘﻜﻠﻢ ﺑﺎﻟﺘﻔﺼﻴﻞ ﻋﻦ ﻣﻜﺎن وﺿﻊ هﺬا اﻟﻜﻮد وآﻴﻔﻴﺔ ﺟﻌﻠﻪ ﻳﻌﻤﻞ
.. ﻓﻤﺎ ﻳﻬﻤﻨﺎ ﻓﻲ هﺬﻩ اﻟﻤﺮﺣﻠﺔ هﻮ ﻓﻬﻢ آﻞ ﻋﻨﺼﺮ ووﻇﻴﻔﺘﻪ... وﻷآﻦ ﻟﻴﺲ اﻵن
( وأﻋﻄﻴﻨﺎهﺎ اﻹﺳﻢfunction) آﻤﺎ ﻧﺮى ﻓﻲ اﻟﻜﻮد ﺑﺎﻷﻋﻼ ﻓﻘﺪ ﻗﻤﻨﺎ ﺑﻌﻤﻞ داﻟﺔ
وﺳﺘﺤﻮي هﺬﻩ اﻟﺪاﻟﺔ اﻟﻔﺌﺘﻴﻦ اﻟﻼﺗﻴﻦ ﺗﻜﻠﻤﻨﺎ ﻋﻨﻬﻤﺎ وهﻢondevice()
deviceو اﻟـPresentParameters
اﻟﺪرس اﻟﺮاﺑﻊ:
-اﻟﺪاﻟﺔOnpaint
-اﻟﺪاﻟﺔ اﻟﺮﺋﻴﺴﻴﺔ)(Main
اﻟﺪاﻟﺔ)( OnPaint
ﻟﺘﺘﻮﺿﺢ أهﻤﻴﺔ هﺬﻩ اﻟﺪاﻟﺔ ,ﻣﺎ رأﻳﻚ أن ﻧﺄﺧﺬ ﻣﺜﺎل ﻋﻤﻠﻲ :ﻧﺤﺘﺎج إﻟﻰ آﻤﻴﺮا
اﻟﺠﻮال وﺷﺎﺷﺔ آﻤﺒﻴﻮﺗﺮ ,اﻵن إﻓﺘﺢ آﻤﻴﺮا اﻟﺠﻮال ﻟﺪﻳﻚ وﻧﻈﺮ إﻟﻰ ﺷﺎﺷﺔ
اﻟﻜﻤﺒﻴﻮﺗﺮ ,ﻣﺎذا ﺗﺮى؟؟ ﻧﻌﻢ ﻣﺎ ﺗﺮاﻩ هﻲ اﻟﺤﻘﻴﻘﺔ ﻷﺣﻆ وﺟﻮد ﺧﻄﻮط ﻓﻲ
اﻟﺸﺎﺷﺔ ﻣﺜﻞ ﻣﺎ آﺄن اﻟﺨﻂ ﻳﻘﻮم ﺑﻌﻤﻞ ﻣﺴﺢ ) (Scanﻟﻠﺸﺎﺷﺔ وﻳﺴﺘﺒﺪﻟﻬﺎ
ﺑﺄﺧﺮى وﺗﺴﺘﻤﺮ هﺬﻩ اﻟﻌﻤﻠﻴﺔ ﻣﺎ داﻣﺖ اﻟﺸﺎﺷﺔ ﺗﻌﻤﻞ.
ﻋﻤﻠﻴﺔ اﻟﻤﺴﺢ اﻟﻤﺘﻼﺣﻘﺔ أو ﻗﻞ اﻟﺮﺳﻢ هﻲ ﻣﺎ ﺗﻘﻮم ﺑﻪ هﺬﻩ اﻟﺪاﻟﺔ ,ﺣﻴﺚ
ﺗﻘﻮم ﺑﻌﻤﻠﻴﺔ ﻋﺮض اﻟـ Bufferاﻟﺬي ﻗﻤﻨﺎ ﺑﺘﺤﺪﻳﺪ ﻃﺮﻳﻘﺔ ﻋﺮﺿﺔ ﻋﻨﺪﻣﺎ ﺗﻜﻠﻤﻨﺎ
ﻋﻦ اﻟـ SwapEffectاﻟﻤﻮﺟﻮد ﻓﻲ اﻟـ Classاﻟﻤﺴﻤﻰ PresentParameters
(راﺟﻊ اﻟﺪرس اﻟﺜﺎﻟﺚ).
آﻮد:
protected override void OnPaint(System.Windows.Forms.PaintEventArgs
)e
{
....
....
}
ﻣﺎ رأﻳﻚ أن ﻧﺮاﺟﻊ ﺑﻌﺾ ﻣﺎ ﻗﻠﻨﺎ ﻓﻲ اﻷﻋﻼ وﻓﻲ اﻟﺪرس اﻟﺴﺎﺑﻖ ﻟﻨﺮﺑﻂ اﻟﻤﺎﺿﻲ
ﺑﺎﻟﺤﺎﺿﺮ:
إذن ﻣﻦ أﻋﻼ ..ﺳﻴﻜﻮن ﻋﻠﻰ ﻋﺎﺗﻖ هﺬﻩ اﻟﺪاﻟﺔ ) (OnPaintﺑﻤﺎ ﺗﺤﻮﻳﺔ ﻣﻦ
ﺑﺎراﻣﻴﺘﺮ ) (parameterاﻟﺘﻌﺎﻣﻞ ﻣﻊ اﻟـ Bufferاﻟﻤﻮﺟﻮد ﻓﻲ آﺮت اﻟﺸﺎﺷﺔ
وﺗﺤﻮﻳﻠﺔ إﻟﻰ رﺳﻮﻣﺎت.
ﻋﻤﻠﻴﺔ إﻇﻬﺎر اﻟﺮﺳﻮﻣﺎت ﺗﻜﻮن ﻋﻠﻰ ﺷﻜﻞ :ﻓﺮﻳﻢ ﻳﻈﻬﺮ ﻋﻠﻰ اﻟﺸﺎﺷﺔ وﻓﻲ
وﻗﺖ ﻗﺼﻴﺮ ﺟﺪا ﻳﺒﻠﻎ ﻧﺎﻧﻮ( secondsأي واﺣﺪ ﻋﻠﻰ ﻣﻠﻴﻮن( ﻳﺨﺘﻔﻲ وﻳﻈﻬﺮ اﻟﺬي
ﻳﻠﻴﻪ وهﻜﺬا ..ﻻ أدري هﻞ وﺿﺤﺖ اﻟﻔﻜﺮة أم ﻻ ...ﺣﺴﻨﺎً ﺳﻨﻮﺿﺤﻬﺎ أآﺜﺮ ﺑﻤﺜﺎل
ﻋﻤﻠﻲ ,أﺣﻀﺮ ﻣﺼﺒﺎح وﻗﻢ ﺑﻔﺘﺢ اﻟﻀﻮء وﻣﻦ ﺛﻢ إﻗﻔﺎﻟﺔ ..ﺑﺴﺮﻋﺔ أآﺒﺮ ..أﺳﺮع ..
أآﺜﺮ ..إﻟﻰ ان ﺗﺼﻞ إﻟﻰ ﺳﺮﻋﺔ ﻧﺎﻧﻮ secondsﻋﻨﺪهﺎ ﻟﻦ ﺗﻼﺣﻆ ﺑﺄن اﻟﻀﻮء
ﻳﻘﻔﻞ ﺑﻞ ﺳﺘﺮاﻩ ﻣﻀﺊ ﺑﺸﻜﻞ ﻣﺴﺘﻤﺮ ,وهﺬا هﻮ ﻧﻔﺲ ﻧﻈﺮﻳﺔ ﻋﻤﻞ اﻟﺪاﻟﺔ
)(Functionاﻟﻤﺴﻤﻰ(OnPaint) .
اﻵن ﻋﻤﻠﻴﺔ إﻇﻬﺎرﻓﺮﻳﻢ وﻣﻦ ﺛﻢ )ﻣﺴﺤﻪ( وإﻇﻬﺎر اﻟﺬي ﻳﻠﻴﻪ .......وﻷآﻦ ﻟﺤﻈﺔ
إرﺟﻊ إﻟﻰ اﻟﻮراء ﻣﻦ ﻗﻠﻴﻼً ...ﻗﻠﺖ )ﻣﺴﺤﻪ( ..ﻧﻌﻢ ﻗﺒﻞ أن ﻳﺤﻞ اﻟـ ﻓﺮﻳﻢ اﻟﺠﺪﻳﺪ
ﻣﺤﻞ اﻟﻘﺪﻳﻢ ﻓﻴﺠﺐ ﻋﻠﻴﻨﺎ ﺗﻨﻈﻴﻒ اﻟﻤﻜﺎن ,وهﻨﺎ ﻧﺄﺗﻲ إﻟﻰ ﻣﻮﺿﻮع اﻟـ Clear.
اﻟﺬي ﻳﺠﺐ أن ﻳﻜﻮن ﺑﻲ هﺬﻩ اﻟﺪاﻟﺔ.
آﻮد:
)device.Clear (.. , .., ..,..
آﻮد:
)device.Clear (ClearFlags.Target , .., ..,..
اﻟﺜﺎﻧﻴﺔ :ﺑﻌﺪﻣﺎ إﻧﺘﻬﻴﻨﺎ ﻣﻦ ﻋﻤﻠﻴﺔ اﻟﺘﻨﻈﻴﻒ ﻳﺄﺗﻲ دور اﻟﻠﻌﺐ ﺑﺎﻷﻟﻮان ,ﻓﻨﻘﻮم ﺑﺼﺒﻎ
اﻟـ Bufferﺑﺎﻟﻠﻮن اﻟﺬي ﻧﺮﻳﺪﻩ وﻳﻤﻜﻨﻨﺎ إﺳﺘﻐﻼل ذﻟﻚ ﺑﺤﻴﺚ ﻧﺠﻌﻠﺔ ﻟﻮن ﻟﺨﻠﻔﻴﺔ
اﻟﻤﺸﻬﺪ ,ﻧﻘﻮم ﺑﻬﺬا اﻟﻌﻤﻞ ﺑﻤﺴﺎﻋﺪة اﻟﺪاﻟﺔ Colorﺣﻴﺚ ﻧﻘﻮم ﺑﺘﺤﺪﻳﺪ اﻟﻠﻮن
اﻟﺬي ﻧﺮﻳﺪﻩ )أزرق ,أﺣﻤﺮ ,أﺑﻴﺾ ,أﺳﻮد ...اﻟﺦ).
آﻮد:
)device.Clear (ClearFlags.Target ,Color.Red , ..,..
اﻟﺜﺎﻟﺜﺔ:
ﺗﺄﺧﺬ رﻗﻢ ١وهﻲ ﺧﺎﺻﺔ درﺟﺔ ﻋﻤﻖ اﻟـBuffer
آﻮد:
)device.Clear (ClearFlags.Target ,Color.Red , ١,..
واﻟﺮاﺑﻌﺔ:
ﺗﺄﺧﺬ رﻗﻢ ٠وهﻲ ﺧﺎﺻﺔ ﺑﻲ أﻣﻮر اﻟـPixels
آﻮد:
)device.Clear (ClearFlags.Target ,Color.Red , ١،٠
دﻋﻨﺎ اﻵن ﻧﺮﺗﺐ اﻟﻜﻼم اﻟﺬي وﺻﻠﻨﺎ إﻟﻴﻪ إﻟﻰ اﻵن ﺑﺮﻣﺠﻴﺎً ,,,ﺳﻴﻜﻮن آﺎﻟﺘﺎﻟﻲ:
آﻮد:
protected override void OnPaint(System.Windows.Forms.PaintEventArgs
)e
{
)device.Clear (ClearFlags.Target ,Color.Red , ١،٠
}
آﻮد:
protected override void OnPaint(System.Windows.Forms.PaintEventArgs
)e
{
)device.Clear (ClearFlags.Target ,Color.Red , ١،٠
;)( device.Present
}
-----------
اﻟﺪاﻟﺔ اﻟﺮﺋﻴﺴﻴﺔ)(Main
إﺑﺪأ ﻣﻦ هﻨﺎ ....هﻮ ﺷﻌﺎر هﺬﻩ اﻟﺪاﻟﺔ ﻓﻬﻲ ﻧﻘﻄﺔ اﻟﺪﺧﻮل إﻟﻰ اﻟﻜﻮد (Access
)Pointأو اﻟـ ) (Entry Pointواﻟﺘﻲ ﺗﻘﻮم ﺑﺘﺠﻤﻴﻊ وإﺳﺘﺪﻋﺎء اﻟﺪوال أو اﻟﻔﺌﺎت
اﻟﻼزﻣﺔ ,ﻓﻜﻞ ﻣﺎ آﺘﺒﻨﺎ ﻋﻨﻪ ﺑﻬﺬا اﻟﺪرس واﻟﺪرس اﻟﺴﺎﺑﻖ ﺳﻨﻘﻮم ﺑﺈﺳﺘﺪﻋﺎﺋﺔ
ﺑﻮاﺳﻄﺔ هﺬﻩ اﻟﺪاﻟﺔ.
آﻮد:
)(static void Main
{
…
…
}
ﻧﻘﻮم ﺑﺄول ﺧﻄﻮة ﺑﻌﻤﻞ آﺎﺋﻦ ) (Objectﻟﻠﻔﻮرم ﻟﻜﻲ أﺳﺘﻄﻴﻊ إﺳﺘﺪﻋﺎء أي ﺟﺰء
ﻣﻨﻪ ﺑﺤﺴﺐ اﻟﺤﺎﺟﺔ ,ﺣﻴﺚ ﻋﻦ ﻃﺮﻳﻘﺔ ﺳﻨﻘﻮم ﺑﺈﺳﺘﺪﻋﺎء اﻟﺪاﻟﺔ )(function
اﻟﻤﺴﻤﻰ ondeviceاﻟﻸزﻣﺔ ﻣﻦ أﺟﻞ اﻟﺘﺤﻜﻢ ﻓﻲ اﻟـ Deviceاﻟﺘﺎﺑﻌﺔ ﻟﻠـ
DirectXواﻟﺘﻲ ﺗﻜﻠﻤﻨﺎ ﻋﻨﻬﺎ ﻓﻲ اﻟﺪرس اﻟﺜﺎﻟﺚ.
أﻣﺎ ﺑﺎﻟﻨﺴﺒﺔ ﻟﻠﺪاﻟﺔ )( OnPaintﻓﻼ ﻳﻮﺟﺪ داﻋﻲ ﻹﺳﺘﺪﻋﺎﺋﻬﺎ ﻷﻧﻬﺎ آﻤﺎ أوﺿﺤﻨﺎ
ﺑﺄﻧﻬﺎ(Built In) .
ﻟﺘﺼﺒﺢ آﺎﻟﺘﺎﻟﻲ:
آﻮد:
)(static void Main
{
;)(Form١ xx = new Form١
{
;)( xx.ondeivce
}
}
إﻟﻰ هﺬﻩ اﻟﻤﺮﺣﻠﺔ آﻞ ﺷﺊ أﺻﺒﺢ ﺟﺎهﺰ ,وﻷآﻦ ﺑﻘﻴﺖ ﻣﺸﻜﻠﺔ واﺣﺪة وهﻲ
آﻤﺎ ﺗﻼﺣﻆ ﺑﺄن اﻟـ Objectاﻟﺬي أﻧﺸﺌﻨﺎﻩ ﻟﻠﻔﻮرم (xx),ﻳﺠﺐ أن ﻳﺴﺘﺪﻋﻲ
ﺑﺸﻜﻞ ﻣﺴﺘﻤﺮ ﻣﺎ دام اﻟﻔﻮرم ﻳﻌﻤﻞ ﻟﺬﻟﻚ ﻳﺠﺐ ﻋﻠﻴﻨﺎ إﺿﺎﻓﺔ اﻟﺠﻤﻠﺔ اﻟﺘﺎﻟﻴﺔ
ﻟﺘﺤﻘﻴﻖ هﺬﻩ اﻟﻐﺎﻳﺔ
آﻮد:
;)Application.Run (xx
آﻮد:
)(static void Main
{
;)(Form١ xx = new Form١
{
;)( xx.ondeivce
;)Application.Run (xx
}
}
------------------------------
اﻟﺪرس اﻟﺨﺎﻣﺲ:
-ﺗﺤﻤﻴﻞ ﻣﻠﻔﺎت اﻟـ DirectXﻓﻲ اﻟـ Microsoft Visual Studio.Net
-اﻟﺒﺪاﻳﺔ ﻣﻊWindows Application
-اﻟﺒﺮﻧﺎﻣﺞ اﻷول ﻣﻊ اﻟـDirectX
ﻧﻘﻮم ﺑﻔﺘﺢ ﺑﺮﻧﺎﻣﺞ اﻟـ Microsoft Visual Studio.Netﻟﺘﻈﻬﺮ ﺷﺎﺷﺔ آﻤﺎ ﻓﻲ
اﻷﺳﻔﻞ ,ﻟﻨﺨﺘﺎر ﻣﻨﻬﺎNew Project
ﻳﻈﻬﺮ ﻟﺪﻳﻨﺎ اﻟﺼﻨﺪوق آﻤﺎ ﻓﻲ اﻷﺳﻔﻞ ﻧﺨﺘﺎر ﻣﻨﻪ Visual C# Projectsوﻣﻦ ﺛﻢ
Windows Applicationوﺑﻌﺪهﺎ ﻧﺨﺘﺎر اﻹﺳﻢ اﻟﺬي ﻧﺮﻳﺪﻩ ﻟﻠﻤﻠﻒ وﻟﻴﻜﻦ DirectX
وﺑﻌﺪهﺎ ﻧﻘﻮم ﺑﺎﻟﻀﻐﻂ ﻋﻠﻰOk
ﺑﻌﺪهﺎ ﺳﻮف ﻳﻈﻬﺮ اﻟﻔﻮرم ,وﻧﺨﺘﺎر ﻣﻦ أﻋﻠﻰ اﻟﻘﺎﺋﻤﺔ Projectوﻣﻦ ﺛﻢ Add
Referenceآﻤﺎ ﻓﻲ اﻟﺸﻜﻞ ﺑﺎﻷﺳﻔﻞ
ﻓﻲ اﻟﺨﻄﻮة اﻟﺘﺎﻟﻴﺔ ﺳﻴﻈﻬﺮ ﻟﺪي اﻟﺸﻜﻞ ﺑﺎﻷﺳﻔﻞ ,ﻟﻨﻘﻮم ﺑﺘﻈﻠﻴﻞ ﺟﻤﻴﻊ
ﻣﻜﺘﺒﺎت اﻟـ DirectX,وﺑﻌﺪهﺎ ﻧﻀﻐﻂ ﻋﻠﻰSelect
ﻧﻼﺣﻆ اﻵن ﺑﺄن ﺟﻤﻴﻊ ﻣﻜﺘﺒﺎت اﻟـ DirectXﻗﺪ ﻇﻬﺮت ﺑﺎﻷﺳﻔﻞ ﻋﻨﺪ Select
Components,آﻤﺎ ﻓﻲ اﻟﺸﻜﻞ ,ﻟﻨﻀﻐﻂ ﺑﻌﺪهﺎ ﻋﻠﻰOk
ﻻﺣﻆ اﻵن ﺑﺄن ﺟﻤﻴﻊ ﻣﻜﺘﺒﺎت اﻟـ DirectXﻗﺪ أﺿﻴﻔﺖ إﻟﻰ اﻟﻔﻮرم آﻤﺎ ﻳﺒﻴﻦ اﻟـ
Solution Explorerوهﻮ اﻟﻤﺮﺑﻊ اﻟﻤﻮﺟﻮد ﻋﻠﻰ أﻗﺼﻰ ﻳﻤﻴﻦ اﻟﺸﺎﺷﺔ
ﻳﺠﺐ ﻋﻠﻴﻚ اﻟﻘﻴﺎم ﺑﻬﺬﻩ اﻟﺨﻄﻮات ﺑﺎﻷﻋﻼ ﻓﻲ آﻞ ﻣﺮة أردت ﺑﻬﺎ اﻟﻌﻤﻞ ﻋﻠﻰ اﻟـ
DirectX
ﻧﻘﻮم ﺑﺎﻟﻀﻐﻂ ﺑﺎﻟﺰر اﻷﻳﻤﻦ ﻟﻠﻤﺎوس ) (Right Clickﻋﻠﻰ اﻟﻔﻮر آﻤﺎ ﻓﻲ اﻟﺸﻜﻞ
ﺑﺎﻷﺳﻔﻞ ,وﻣﻨﻪ ﺗﺨﺘﺎر(View Code).
ﻟﻨﺮى اﻟﻜﻮد ﻓﻲ اﻷﺳﻔﻞ ,واﻟﺬي ﻗﺎم اﻟﻔﻮرم ﺑﺈﻧﺸﺎﺋﺔ ﺑﺸﻜﻞ إﻓﺘﺮاﺿﻲ , (On
Self Generated).
)ﻟﻠﻌﻠﻢ ﻓﻘﻂ: ﻟﻨﺄﺧﺬ ﻧﻈﺮة ﺳﺮﻳﻌﺔ,)ﻧﻼﺣﻆ ﻓﻲ هﺬا اﻟﻜﻮد ﻋﺪة أﺷﻴﺎء
آﻮد:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
آﻮد:
using System.Drawing;
آﻮد:
using System.Windows.Forms;
وأﻳﻀﺎً هﺬا اﻟﻬﻴﺪر ﻷﻧﻬﺎ ﺗﺤﻮي اﻟﺪاﻟﺔpaint وﻏﻴﺮهﺎ ﻣﻦ اﻟﺪوال اﻟﻌﺎﻣﺔ ﻟﻠﺘﺤﻜﻢ
ﺑﻲ اﻟﻔﻮرم
آﻮد:
آﻮد:
private System.ComponentModel.Container components = null;
public Form1()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();
//
// TODO: Add any constructor code after
InitializeComponent call
//
}
/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
ﻓﻬﻮ ﻳﺨﺘﺺ ﺑﻲ أﻣﻮر ﺗﺮﺗﻴﺐ اﻟﻜﻮد وﺟﻌﻞ,وﺟﻮد هﺬا اﻟﻜﻮد ﺑﺎﻷﻋﻼ أو ﻋﺪﻣﻪ واﺣﺪ
وإذا. ﻟﻦ ﻳﻔﻴﺪﻧﺎ ﻓﻲ دورﺗﻨﺎ,(ﺟﻤﻴﻊ اﻟﻌﻨﺎﺻﺮ ﻓﻲ ﻗﺎﻟﺐ واﺣﺪ )آﺒﺮ ﻣﺨﻚ وﺗﺮآﻪ
أردت ﻓﻤﺴﺤﻪ.
آﻮد:
static void Main()
{
;))(Application.Run(new Form1
}
هﻨﺎ اﻟﺤﺴﻨﺎء ﺗﺘﺮﺑﻊ ﻋﻠﻰ اﻟﻌﺮش ...ﻧﻌﻢ هﺎ هﻲ داﻟﺔ )ﻧﻘﻄﺔ اﻟﺪﺧﻮل( وﺑﻬﺎ
.ﻧﺴﺘﺪﻋﻲ أي ﺟﺰء ﻓﻲ اﻟﻜﻮد
ﻓﻲ هﺬا اﻟﻤﻮﺿﻮع ﺳﻮف ﻧﺼﻴﻎ اﻟﺪرﺳﻴﻦ اﻟﺮاﺑﻊ واﻟﺜﺎﻟﺚ ﺑﺮﻣﺠﻴﺎً ﻓﻬﻮ ﻳﻌﺘﻤﺪ
ﺑﺸﻜﻞ آﺒﻴﺮ )وآﻞ ﺷﺊ ﺳﻨﻜﺘﺒﻪ ﻓﻲ اﻷﺳﻔﻞ ﻗﻤﻨﺎ ﺑﺸﺮﺣﺔ ﻓﻲ هﺎذﻳﻦ ﻋﻠﻴﻬﻢ
).اﻟﺪرﺳﻴﻦ
:آﺎﻟﺘﺎﻟﻲ DirectXأوﻻً :ﻧﻘﻮم ﺑﺎﻟﺘﺼﺮﻳﺢ ﻋﻦ اﻟﻬﻴﺪر ﻟﻠـ
:آﻮد
;using Microsoft.DirectX
;using Microsoft.DirectX.Direct3D
ﻧﺼﺮح ﺑﺪاﺧﻠﻬﺎ ﻋﻦ )( ondeviceﺛﺎﻟﺜﺎً :ﻧﻘﻮم ﺑﻌﻤﻞ داﻟﺔ وﻧﺴﻤﻴﻬﺎ أي إﺳﻢ وﻟﺘﻜﻦ
PresentParametersو Deviceاﻟﺪاﻟﺘﻴﻦ
:آﻮد
)(public void ondevice
{
PresentParameters pp = new PresentParameters
;)(
;pp.Windowed = true
;pp.SwapEffect = SwapEffect.Discard
:آﻮد
}
:اﻟﻜﻮد آﺎﻣﻼً
آﻮد:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;
namespace DirectX9
{
/// <summary>
/// Summary description for Form1.
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
Device device3d;
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components =
null;
public Form1()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();
//
// TODO: Add any constructor code after
InitializeComponent call
//
}
/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
using (Form1 xx = new Form1 ())
{
xx.ondevice ();
Application.Run(xx);
}
}
}
}
ﻣﺎ رأﻳﻚ اﻵن أن ﻧﻀﻴﻒ ﺗﻐﻴﺮ ﺑﺴﻴﻂ ﺑﺤﻴﺚ ﻧﺠﻌﻞ ﻓﻮرم اﻟـDirectX ﻓﻲ ﺻﻴﻐﺔ
( ﻣﻠﺊ اﻟﺸﺎﺷﺔFull Screen)
ﺣﻴﺚ ﺳﻮف ﻧﻘﻮم ﺑﺘﻌﻄﻴﻞ اﻟﺨﺎﺻﻴﺔwindowed وإﺿﺎﻓﺔ اﻟﻜﻮد اﻟﺘﺎﻟﻲ:
آﻮد:
Format current = Manager.Adapters[0].CurrentDisplayMode.Format;
pp.Windowed = false;
pp.BackBufferFormat = current;
pp.BackBufferCount = 1;
pp.BackBufferWidth = 800;
pp.BackBufferHeight = 600
آﻮد:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;
namespace DirectX9
{
/// <summary>
/// Summary description for Form1.
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
Device device3d;
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components =
null;
public Form1()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();
//
// TODO: Add any constructor code after
InitializeComponent call
//
}
pp.SwapEffect = SwapEffect.Discard;
Format current =
Manager.Adapters[0].CurrentDisplayMode.Format;
pp.Windowed = false;
pp.BackBufferFormat = current;
pp.BackBufferCount = 1;
pp.BackBufferWidth = 800;
pp.BackBufferHeight = 600;
/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
using (Form1 xx = new Form1 ())
{
xx.ondevice ();
Application.Run(xx);
}
}
}
}
------
ﻧﻔﺲ اﻟﻜﻮد ﺑﺎﻷﻋﻼ... ( وﻷآﻦ هﻨﺎ ﻗﻤﻨﺎ ﺑﺤﺬف اﻟﺠﺰء ﻣﻦ اﻟﻜﻮدOn Self
Generated), ﻓﻴﺼﺒﺢ آﺎﻟﺘﺎﻟﻲ... ﻟﻜﻲ ﺗﺘﻮﺿﺢ اﻟﺮؤﻳﺎ أآﺜﺮ:
آﻮد:
using System.Drawing;
using System.Windows.Forms;
using Microsoft.DirectX.Direct3D;
pp.Windowed = true;
pp.SwapEffect = SwapEffect.Discard;
pp.EnableAutoDepthStencil = true;
pp.AutoDepthStencilFormat = DepthFormat.D16 ;
{
device.Clear (ClearFlags.Target ,Color.SkyBlue
,1,1);
device.Present ();
}
Vertexes
ﻋﻨﺪ رﺳﻢ أي ﺟﺴﻢ ﻓﻨﺤﻦ ﺑﺤﺎﺟﺔ إﻟﻰ ﺣﻔﻆ اﻟﺒﻴﺎﻧﺎت اﻟﻬﻨﺪﺳﻴﺔ )ﻧﻘﺎط اﻟﻤﺤﻮر
xواﻟﻤﺤﻮر yواﻟﻤﺤﻮر ) zﻟﻬﺬا اﻟﺸﻜﻞ ,ﺑﺪاﺧﻞ آﺎﺋﻦ ) (Objectﻳﺴﻤﻰ هﺬا اﻟـ
objectﺑﻲ اﻟـ Vertexes,وﺑﻤﻌﻨﻰ ﺁﺧﺮ اﻟـ Vertexesهﻲ اﻟﻨﻘﺎظ ﻓﻲ ﻓﻀﺎء اﻟـ
DirectXوﺑﻮاﺳﻄﺔ هﺬا اﻟﻨﻘﺎط ﻧﺮﺳﻢ اﻷﺷﻜﺎل .
ﺟﻤﻴﻊ اﻷﺷﻜﻞ ﻓﻲ اﻟـ DirectXﺗﺮﺳﻢ ﻋﻦ ﻃﺮﻳﻖ اﻟﻤﺜﻠﺜﺎت ) (Rectangleﺣﺘﻰ
اﻟﺪاﺋﺮة ﻣﺎ هﻲ ﺳﻮي ﻣﺜﻠﺜﺎت ﻣﺘﻨﺎهﻴﺔ ﻓﻲ اﻟﺼﻐﺮ ..أﻧﻈﺮ إﻟﻰ اﻟﺸﻜﻞ ﺑﺎﻷﺳﻔﻞ
ﻟﻴﺘﻮﺿﺢ ﻣﺎ أﻋﻨﻴﻪ.
ﻳﺘﻴﺢ ﻟﻨﺎ اﻟـ DirectXﺑﺎﻟﺘﺤﻜﻢ ﻓﻲ هﺬﻩ اﻟﻨﻘﺎط وذﻟﻚ ﺑﺈﺳﺘﺨﺪام اﻟـ Namespace
وهﻲ اﻟـ Direct٣Dو اﻟـ Classاﻟﻤﺴﻤﻰ CustomVertexواﻟﺘﻲ ﺗﺤﻮي ﺑﺪورهﺎ
ﻋﻠﻰ ﻧﻮاﻋﻴﻦ ﻣﻦ اﻟـ Vertexهﻢ اﻟـ Position Vertexesو اﻟـ Transformed
Vertexes
------------------------
ﻳﻌﺘﻤﺪ ﻓﻴﻬﺎ ﺗﺤﺪﻳﺪ ﻧﻘﺎط اﻟﺮﺳﻢ اﻟـ ) (Vertexﻋﻠﻰ ﻣﺤﻮر ) (x,y,zﺣﻴﺚ أن ﻧﻘﻄﺔ
اﻟﺒﺪء ﺗﻜﻮن ﻓﻲ ﻣﻨﺘﺼﻒ اﻟﺸﺎﺷﺔ ))٠،٠،٠
------------------------
ﻳﻌﺘﻤﺪ ﻓﻴﻬﺎ ﺗﺤﺪﻳﺪ ﻧﻘﺎط اﻟﺮﺳﻢ اﻟـ ) (Vertexﻋﻠﻰ اﻟﺒﻴﻜﺴﻞ ) (Pixelsﺣﻴﺚ أن
ﻧﻘﻄﺔ اﻟﺒﺪء ﺗﻜﻮﻧﻦ ﻓﻲ أﻗﺼﻰ ﻳﺴﺎر اﻟﺸﺎﺷﺔ ) ,(٠،٠،٠ﻟﻨﺄﺧﺬ اﻟﻤﺜﺎل اﻟﺘﺎﻟﻲ :
ﻟﻨﻔﺮض ﺑﺄن آﺮت اﻟﺸﺎﺷﺔ ﻟﺪي ﻳﺪﻋﻢ ﻧﻤﻆ اﻟـ h ١٣وهﻮ اﻟـ ٣٢٠ﺿﺮب ٢٠٠
)(Pixelsﻓﺴﻴﻜﻮن اﻟﻤﺤﻮر اﻟﺬي ﺳﻨﺴﺘﺨﺪﻣﺔ ﻣﻦ أﺟﻞ رﺳﻢ اﻟﻨﻘﺎط آﻤﺎ ﻓﻲ
اﻟﺸﻜﻞ ﺑﺎﻷﺳﻔﻞ.
------------------------