sayedf1

دروس فى برمجة الألعاب

42 ردود في هذا الموضوع

بسم الله الرحمن الرحيم

السلام عليكم أعضاء المنتدى الكرام

سوف أبدأ بإذن الله دوره في برمجة الألعاب ، ونبدأها بــ DirectX9 ولن ادخل في تفاصيل معقدة سوف نتعامل مع الـ DirectX

كأنه قطع غيار بمعنى عندما أريد أن أجعل التطبيق يعمل في نافذة أو شاشه كاملة سوف أضع الكود كامل أو الدالة كاملة ولن اشرح كلمة كلمة، وسوف أضع تعليقات فى الكود لمعرفة وظيفة كل داله، كل ما يهمنا أداء المطلوب ونركز على تطوير اللعبة،

وسوف نستخدم Visual Basic.net 2005

المتطلبات:

1ـــ الرغبة في تعلم برمجة الألعاب

2ـــVisual Basic.net 2005

3ـــMicrosoft DirectX 9.0 SDK

4ــ كارت شاشه ذو إمكانيات معقولة

ملحوظة:

لمعرفة إن كان كارت الشاشة مناسب أم لا، بعد أن تعد Microsoft DirectX 9.0 SDK تصفح المجلد

C:\DXSDK\Samples\VB.Net\Direct3D\Bin وجرب كل الملفات إن عمل بشكل صحيح فكارت شاشة مناسب

ملحوظه اكتشفتها حديثا

يجب ان يكون ال sdk

DirectX 9.0 SDK Update (Summer 2003)

وهذا رابط التحميل

http://myboxy.co/index.php/files/get/-9izGSDfBu/dx90updatesdk.rar

فلنبدأ بأذن الله

تم تعديل بواسطه sayedf1
1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم

بالتوفيق في الدروس اخي سيد

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

ما مدى صحة هذه المعلومة ؟

و هل هناك فرق واضح بين تشغيل نفس المشروع بواسطه فيجول بيسك و سي شارب ؟

لانني بصراحة و بعد انضمام مجموعة من لغات ميكروسوفت مثل visual basic و #C و C++/CLR تحت لواء دوت نت لم استطع التفريق بينها من ناحية السرعة

تحياتي

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم

مقدمة حول Microsoft DirectX 9.0

منذ فترة، وميكروسوفت معنيّة بتطوير أدواتها الخاصّة بالرسوم والألعاب والوسائط المتعدّدة Multimedia.. وفي هذا الصدد، قامت ميكروسوفت بتطوير ما أسمته DirectX.. ويعنينا هنا أن نتوقّف قليلا أمام هذه التسميّة.

أمّا بخصوص كلمة "مباشر" Direct، فهي ناتجة من أنّ هذه التقنية تستخدم مجموعة منخفضة المستوى Low Level من واجهات برمجة التطبيقات Application Programming Interfaces (APIs)، التي تتيح لمن يستخدمها أن يتعامل ((مباشرةً)) مع مكونات الكمبيوتر، بدون وسيط من تقنية COM، ممّا يضمن سرعةً وكفاءةً وتحكّما أعلى في تنفيذ التطبيقات التي تستخدم هذه الوسيلة.

وقبلَ أن ينقبضَ صدرك مع سماع التعبيرات Low Level و API و COM، يجب أن أخبركَ أنّ شيئا لن يختلف بالنسبة لك كمبرمج VB، فقد قامت ميكروسوفت بإنتاج نسخة من DirectX في صورة خلايا Classes، بحيث يمكنك استخدامها من داخل VB بنفس الطريقة التي تستخدم بها باقي خلايا إطار العمل Framework.. تنفّس الصُعَداء إذن.

هذا عن كلمة Direct.. ماذا إذن عن هذا الحرف X، الذي يشغف به الأمريكان حبّا؟!

إنّ هذا الحرف يقوم عوضا عن أيّ مجهول، يمكن أن يتّخذ مجموعة مختلفة من القيم..(بالمعنى البرمجى متغير) إنّ هذا إذن يعني أنّ DirectX يحتوي على مجموعة مختلفة من الأدوات، مثل Direct3D و DirectDraw و DirectInput.

إنَ حوالي 75% على الأقّل من الألعاب تحتاج لإصدار من إصدارات DirectX المختلفة لكي تعمل.. إنّ هذا يشير بوضوح لأهمّيّة هذه التقنية، ومدى الإمكانيّات التي تقدّمها.

منقول

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليك اخى الكون

هذه المعلومه كانت صحيحة مع الأصدارات القديمه أما بعد الدوت نت فالأمر أختلف أصبحت لغات الدوت نت تترجم الى لغه واحده

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم

هذه المعلومه كانت صحيحة مع الأصدارات القديمه أما بعد الدوت نت فالأمر أختلف أصبحت لغات الدوت نت تترجم الى لغه واحده

شكرا اخي سيد

هناك نقطة اخرى ال DirectX for Managed Code رغم انني قرأت انه يقوم بالوصول الى معظم وظائف DirectX الاصلية الى انني قرأت انه مبني كطبقة فوقه و بالتالي اعتقد ان الاداء و السرعة اقل لكن في وثائق DirectX كتب التالي

DirectX 9.0 for Managed Code improves performance.

Managed code also frees you from having to deal with most memory management tasks, such as releasing objects.

وهذا شي جيد لصالح دايركت اكس المدار

انا احب ال #C بالاضافة الى لغتي ++C لكنني سأتابع موضوعك لان الفرق بسيط بين لغات دوت نت

تحياتي

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

Direct3D

لا شك أن قوة DirectX تكمن في قدرته على تطوير وبناء البرامج ذات الأبعاد الثلاثة والتي أصبحت منتشرة جدا الآن، وكذلك لا شك أن DirectX توفر لك إمكانيات مذهلة في هذا المجال

يوفر لك Direct3D إمكانيات هائلة وغير محدودة في التعامل مع العوالم ثلاثية الأبعاد 3D Worlds

من حيث الإنشاء والتعديل والإكساء والإضاءة وتغيير الأحجام والتحريك وغير ذلك كثيرا من التأثيرات .

نظام الإحداثيات ثلاثي الأبعاد 3-D Coordinate Systems:

تستخدم الرسوم المجسّمة نوعين من نظم الإحداثيّات: اليساريّ Left-handed واليميني Right-handed.. وفي كلا النظامين، يشير محور (X) الموجب Positive x-axis إلى اليمين، ومحور (Y) الموجب Positive y-axis لأعلى.

ملحوظة:

انتبه لهذه الاتجاهات جيّدا، ولا ترتبك بينها وبين إحداثيّات الشاشة في النظام ثنائيّ البعد 2D.. (تذكّر أنّ محور (Y) الموجب Positive y-axis في VB يشير لأسفل).

في أيّ اتجاه إذن يشير محور (z) الموجب Positive z-axis؟

بسيطة.. كلّ ما عليك هو أن تطبّق قاعدة اليد اليسرى في النظام اليساريّ، وقاعدة اليد اليمنى في النظام اليمينيّ!

ولا تمتعض هكذا حال سماعك كلمة قاعدة، فالموضوع في غاية السهولة:

post-45582-1191598379_thumb.jpg

اجعل أصابعك الثلاثة الإبهام والسبّابة و الوسطى متعامدة، واجعل سبّابتك تشير إلى اتجاه محور (X) الموجب، ووسطاك تشير إلى اتجاه محور (Y) الموجب.. في هذه الحالة سيشير إبهامك إلى اتجاه محور (Z) الموجب.

وطبعا في نظام الإحداثيّات اليمينيّ يجب أن تستخدم أصابع يدك اليمني، وفي نظام الإحداثيّات اليساريّ يجب أن تستخدم يدك اليسرى.

وكما هو واضح من الرسم، يشير اتجاه محور (Z) الموجب إلى خارج الشاشة في نظام الإحداثيّات اليمينيّ، وإلى داخل الشاشة في نظام الإحداثيّات اليساريّ.

هذا، ويستخدم Direct3Dنظام الإحداثيّات اليساريّ Left-handed coordinate system.

طبعا ستتساءل في ضجر، عن سبب كلّ هذه الثرثرة.. إنّ هذا يعود لسبب جوهريّ.. هو أنّك لن تستخدم Direct3D بمفرده، فلا بدّ أنّك ستستعين ببعض تطبيقات الرسوم ثلاثّية الأبعاد الشهيرة، لتصميم الشكل الذي تريده ـ وذلك للاستفادة من التسهيلات التي تقدّمها لك هذه التطبيقات.. في هذه الحالة قد تصطدم بأنّ بعض هذه التطبيقات يستخدم نظام الإحداثيّات اليمينيّ!!... فماذا ستفعل إذن يا ترى في هذه الحالة؟

طبعا يجب عليك أن تحوّل من النظام اليمينيّ إلى النظام اليساريّ.. عامّة لا تقلق.. هناك من الدوال ما سيساعدك على القيام بهذا

مرحبا DirecX في VB:

قديما كانت الوسيلة المثلي لاستخدام Direct3D هي عن طريق استدعاء دوال API من لغة C++.. كان ذلك كذلك، إلى أصدرت ميكروسوفت DirecX7، وسمحت فيه لمبرمجي VB بالتعامل مع DirectX بطريقة مشابهة لتقنية COM.

والآن مع DirectX9 تطوّر الأمر كثيرا، حيث صار بإمكان مبرمج VB.Net أن يستخدم DirextX9 بطريقة مشابهة لاستخدام خلايا إطار العمل Framework Classes، وذلك عن طريق ما يسمّى بالكود المنظّم Managed-code، وهو ذلك الذي تديره بيئة VS.Net حتّى لا يكون مرتبطا بنوع نظام التشغيل أو مكوّنات الجهاز، وحتّى يكون آمنا في تعامله مع الذاكرة المؤقّتة RAM.

وللمقارنة، فإنّ استدعاء دوال API هو كود غير منظّم Unmanaged-code، وذلك لاعتماده على إصدار نظام التشغيل.. كذلك فإنّ حجز مساحة من الذاكرة مباشرةً هو كود غير منظّم، لأنّه قد يؤدّي إلى استهلاك مساحة الذاكرة لو لم يتمّ تحرير المساحات المحجوزة بعد الانتهاء من استخدامها.

ملحوظة:

إن ميكروسوفت أصدرت VS.NET وفي نيتها جعل التطبيقات المنشأة بها قابلة للعمل على أنظمة التشغيل المختلفة (مثل Linux).. للأسف، لن يكون ذلك سهلا بالنسبة للتطبيقات الخاصة بـ DirectX، لأنّه مصمّم خصّيصا للويندوز!

منقول

تم تعديل بواسطه sayedf1
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

الآن سوف نبدأ العمل ابدأ مشروع جديد

أضف إليه class واسميه CSampleGraphicsEngine.vb

كي نتمكن من التعامل مع DirectX يجب أن نضيفه كمرجع

اضغط القائمة الرئيسيّة Project ثم اختار Add Reference ستظهر لك نافذة تحتوي على كلّ المراجع التي يمكن إضافتها.. لو كنت قد أعددت DirectX9 SDK، فستجد العناصر التالية في القائمة:

Microsoft.DirectX
Microsoft.DirectX.Direct3D
Microsoft.DirectX.Direct3DX

اختر هذه العناصر، ، ثمّ اضغط موافق.

بعد ذلك عليك باستيراد هذه المراجع في بداية كلّ ملفّ ستستخدمها فيه:

Imports Microsoft.DirectX 
Imports Microsoft.DirectX.Direct3D
Imports System.Math

بعد ذلك سوف نعلن عن بعض المتغيرات العامة لل class

 ' الكائنات الأساسيّة 
Private D3DRoot As Manager
Private D3DDev As Device
Private D3DHelp As D3DX

' مصفوفات التحويلِ
Private matCube1 As Matrix
Private matView As Matrix
Private matProj As Matrix

'الخامات
Private texCube1 As Texture

' الأشكال الهندسيّة
Private vbCube As VertexBuffer
Private vbMenu As VertexBuffer

Private lastFrameUpdate As Int32 ' متغير نحتفظ فيه بآخر وقت حدّثنا فيه الإطار

Private cube1Angle As Single
Private Const cube1Speed As Single = 50.0F
Private Const cube1Size As Single = 2.0F


Private bInitOkay As Boolean = False ' متغيّر يمثّل نجاح وضع القيم الابتدائيّة أم لا

Private iLastFPSCheck As Int32
Private Const iFPSProfileSpeed As Integer = 200
Private iCurrCnt As Integer
Private iFrameRate As Integer

Private sDispInfo As String ' سنكتب في هذا المتغيّر معلومات حول طريقة العرض

Private bRenderTextures As Boolean = True

Private rTarget As System.Windows.Forms.Form ' ّ النموذج الذي سيتم الرسم عليه
Private bWindowed As Boolean ' (كاملة/نافذة) طور الشاشة

بعد ذلك يجب أن نعرف هل نمط العرض مناسب أم لا ولمعرفة ذلك نكتب هذا الإجراء

Public Shared Function isDisplayModeOkay(ByVal iWidth As Integer, ByVal iHeight As Integer, ByVal iDepth As Integer) As Boolean
Try
Dim AdapterInfo As AdapterInformation
Dim DispMode As DisplayMode
Dim fmt As Format
' اللون لعمق مناسب تنسيق اختيار
Select Case iDepth
Case 16
fmt = Format.R5G6B5
Case 32
fmt = Format.X8R8G8B8
End Select
' مناسب عرض طور وجود من التأكد
For Each AdapterInfo In Manager.Adapters
For Each DispMode In AdapterInfo.SupportedDisplayModes(fmt)
If DispMode.Width = iWidth Then
If DispMode.Height = iHeight Then
Return True
End If
End If
Next
Next
Throw New Exception("مناسب عرض طور على العثور يتم لم")
'DirectX متوقع من غير خطاء أي حدوث لتلافى
Catch DXErr As DirectXException
Return False
Catch Err As Exception
Return False
End Try
End Function

تم تعديل بواسطه sayedf1
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

إذا كنت تريد أن تجعل التطبيق يعمل في نافذة أو شاشه كاملة فهذان الإجراءان ما تريد

في نافذة اكتب هذا الأجراء

Public Sub New(ByVal Target As System.Windows.Forms.Form)
Try
Dim d3dPP As New PresentParameters()
d3dPP.Windowed = True : bWindowed = True
d3dPP.SwapEffect = SwapEffect.Discard
d3dPP.BackBufferCount = 1
d3dPP.BackBufferFormat = Manager.Adapters(0).CurrentDisplayMode.Format
d3dPP.BackBufferWidth = Target.ClientSize.Width()
d3dPP.BackBufferHeight = Target.ClientSize.Height()
#If USE_VSYNC Then
d3dPP.PresentationInterval = PresentInterval.Immediate
#Else
d3dPP.PresentationInterval = PresentInterval.One
#End If

sDispInfo = "[WINDOWED] " + Target.ClientSize.Width.ToString + "x" + _
Target.ClientSize.Height.ToString + " " + d3dPP.BackBufferFormat.ToString()
rTarget = Target

initialiseDevice(CType(Target, System.Windows.Forms.Control), d3dPP)
Catch err As Exception
bInitOkay = False
Throw New Exception("رسومات محرّك أشغّل أن أستطيع لا ")
End Try
End Sub

اما في شاشة كاملة

Public Sub New(ByVal Target As System.Windows.Forms.Form, ByVal iWidth As Integer, _
ByVal iHeight As Integer, ByVal iDepth As Integer)
Try
Dim d3dPP As New PresentParameters()
If Not isDisplayModeOkay(iWidth, iHeight, iDepth) Then
Throw New Exception("ممكن غير كاملة شاشة في العرض")
End If
bWindowed = False
d3dPP.BackBufferWidth = iWidth
d3dPP.BackBufferHeight = iHeight
d3dPP.BackBufferCount = 1
d3dPP.SwapEffect = SwapEffect.Copy
#If USE_VSYNC Then
d3dPP.PresentationInterval = PresentInterval.Immediate
#Else
d3dPP.PresentationInterval = PresentInterval.One
#End If
Select Case iDepth
Case 16
d3dPP.BackBufferFormat = Format.R5G6B5
sDispInfo = "[Fullscreen] " + iWidth.ToString + "x" + iHeight.ToString + " 16bit R5G6B5"
Case 32
d3dPP.BackBufferFormat = Format.X8R8G8B8
sDispInfo = "[Fullscreen] " + iWidth.ToString + "x" + iHeight.ToString + " 32bit X8R8G8B8"
Case Else
Throw New Exception("غير مقبول اللون عمق")
End Select

rTarget = Target

initialiseDevice(CType(Target, System.Windows.Forms.Control), d3dPP)
Catch err As Exception
bInitOkay = False

Throw New Exception("رسومات محرّك أشغّل أن أستطيع لا ")
End Try
End Sub

دالة وضع القيم الابتدائية

Private Sub initialiseDevice(ByVal Target As System.Windows.Forms.Control, _
ByVal win As PresentParameters)
Try
Dim D3DCaps As Caps
Dim DevCreate As Integer
If D3DRoot.CheckDepthStencilMatch(0, DeviceType.Hardware, _
win.BackBufferFormat, _
win.BackBufferFormat, _
DepthFormat.D16) Then
win.AutoDepthStencilFormat = DepthFormat.D16
win.EnableAutoDepthStencil = True
Else
Throw New Exception("بت 16 هذه الوصلة لا تدعم عمق ")
End If
D3DCaps = D3DRoot.GetDeviceCaps(0, DeviceType.Hardware)
If D3DCaps.DeviceCaps.SupportsHardwareTransformAndLight Then
DevCreate = CreateFlags.HardwareVertexProcessing Or CreateFlags.MultiThreaded
Else
DevCreate = CreateFlags.SoftwareVertexProcessing Or CreateFlags.MultiThreaded
End If
D3DDev = New Device(0, DeviceType.Hardware, Target, DevCreate, win)
If D3DDev Is Nothing Then Throw New Exception("device was not allocated")
D3DDev.RenderState.ZBufferEnable = True
D3DDev.RenderState.Lighting = False
D3DDev.RenderState.SourceBlend = Blend.SourceAlpha
D3DDev.RenderState.DestinationBlend = Blend.InvSourceAlpha
D3DDev.SamplerState(0).MinFilter = TextureFilter.Linear
D3DDev.SamplerState(0).MagFilter = TextureFilter.Linear
loadTextures(win.BackBufferFormat)
loadGeometry()
D3DDev.Transform.View = Matrix.LookAtLH(New Vector3(0, 0, 15), New Vector3(0, 0, 0), New Vector3(0, 1, 0))
D3DDev.Transform.Projection = Matrix.PerspectiveFovLH(Math.PI / 4, 4 / 3, 1, 100)
D3DDev.Transform.World = Matrix.Identity()
lastFrameUpdate = Environment.TickCount()
bInitOkay = True
Catch err As Exception
bInitOkay = False
Throw New Exception("فشل إعداد محرك الرسوم")
End Try
End Sub

سوف نرسم مكعب في مركز الشاشة كي نجد شيء نراه ولرسم المكعب نكتب هذا الأجراء

Private Sub loadGeometry()
Try
vbMenu = New VertexBuffer(GetType(CustomVertex.TransformedTextured), _
4, D3DDev, 0, CustomVertex.TransformedTextured.Format, Pool.Default)
Dim v As CustomVertex.TransformedTextured() = CType(vbMenu.Lock(0, 0), CustomVertex.TransformedTextured())

vbCube = New VertexBuffer(GetType(CustomVertex.PositionTextured), _
36, D3DDev, 0, CustomVertex.PositionTextured.Format, Pool.Managed)
Dim vCube As CustomVertex.PositionTextured() = CType(vbCube.Lock(0, 0), CustomVertex.PositionTextured())

' إنشاء وجه المكعب العلويّ
vCube(0) = New CustomVertex.PositionTextured(-0.5, 0.5, 0.5, 0, 0)
vCube(1) = New CustomVertex.PositionTextured(0.5, 0.5, 0.5, 1, 0)
vCube(2) = New CustomVertex.PositionTextured(-0.5, 0.5, -0.5, 0, 1)
vCube(3) = New CustomVertex.PositionTextured(0.5, 0.5, -0.5, 1, 1)
vCube(4) = New CustomVertex.PositionTextured(-0.5, 0.5, -0.5, 0, 1)
vCube(5) = New CustomVertex.PositionTextured(0.5, 0.5, 0.5, 1, 0)

' إنشاء وجه المكعب السفليّ
vCube(6) = New CustomVertex.PositionTextured(-0.5, -0.5, -0.5, 1, 0)
vCube(7) = New CustomVertex.PositionTextured(0.5, -0.5, 0.5, 0, 1)
vCube(8) = New CustomVertex.PositionTextured(-0.5, -0.5, 0.5, 0, 0)
vCube(9) = New CustomVertex.PositionTextured(0.5, -0.5, 0.5, 0, 1)
vCube(10) = New CustomVertex.PositionTextured(-0.5, -0.5, -0.5, 1, 0)
vCube(11) = New CustomVertex.PositionTextured(0.5, -0.5, -0.5, 1, 1)

' الأيسر إنشاء وجه المكعب
vCube(12) = New CustomVertex.PositionTextured(-0.5, 0.5, -0.5, 0, 0)
vCube(13) = New CustomVertex.PositionTextured(-0.5, -0.5, -0.5, 1, 0)
vCube(14) = New CustomVertex.PositionTextured(-0.5, 0.5, 0.5, 0, 1)
vCube(15) = New CustomVertex.PositionTextured(-0.5, 0.5, 0.5, 0, 1)
vCube(16) = New CustomVertex.PositionTextured(-0.5, -0.5, -0.5, 1, 0)
vCube(17) = New CustomVertex.PositionTextured(-0.5, -0.5, 0.5, 1, 1)

' الأيمن إنشاء وجه المكعب
vCube(18) = New CustomVertex.PositionTextured(0.5, 0.5, -0.5, 0, 0)
vCube(19) = New CustomVertex.PositionTextured(0.5, 0.5, 0.5, 1, 0)
vCube(20) = New CustomVertex.PositionTextured(0.5, -0.5, -0.5, 0, 1)
vCube(21) = New CustomVertex.PositionTextured(0.5, -0.5, 0.5, 1, 1)
vCube(22) = New CustomVertex.PositionTextured(0.5, -0.5, -0.5, 0, 1)
vCube(23) = New CustomVertex.PositionTextured(0.5, 0.5, 0.5, 1, 0)

' الخلفيّ إنشاء وجه المكعب
vCube(24) = New CustomVertex.PositionTextured(-0.5, 0.5, -0.5, 0, 0)
vCube(25) = New CustomVertex.PositionTextured(0.5, 0.5, -0.5, 1, 0)
vCube(26) = New CustomVertex.PositionTextured(-0.5, -0.5, -0.5, 0, 1)
vCube(27) = New CustomVertex.PositionTextured(0.5, -0.5, -0.5, 1, 1)
vCube(28) = New CustomVertex.PositionTextured(-0.5, -0.5, -0.5, 0, 1)
vCube(29) = New CustomVertex.PositionTextured(0.5, 0.5, -0.5, 1, 0)

' الأماميّ إنشاء وجه المكعب
vCube(30) = New CustomVertex.PositionTextured(0.5, 0.5, 0.5, 1, 0)
vCube(31) = New CustomVertex.PositionTextured(-0.5, 0.5, 0.5, 0, 0)
vCube(32) = New CustomVertex.PositionTextured(-0.5, -0.5, 0.5, 0, 1)
vCube(33) = New CustomVertex.PositionTextured(-0.5, -0.5, 0.5, 0, 1)
vCube(34) = New CustomVertex.PositionTextured(0.5, -0.5, 0.5, 1, 1)
vCube(35) = New CustomVertex.PositionTextured(0.5, 0.5, 0.5, 1, 0)

vbCube.Unlock()


Catch err As Exception
MsgBox("loadGeometry(): " + Chr(13) + Chr(13) + err.ToString())
Throw New Exception("could not complete loadGeometry()")
End Try
End Sub

ولتحميل الخامات نكتب الإجراء التالي

Private Sub loadTextures(ByVal AdapterFmt As Format)

If D3DRoot.CheckDeviceFormat(0, DeviceType.Hardware, AdapterFmt, 0, ResourceType.Textures, Format.X8R8G8B8 _
) Then
texCube1 = TextureLoader.FromFile(D3DDev, Application.StartupPath + "\cube1.bmp", 256, 256, 1, 0, _
Format.X8R8G8B8, Pool.Managed, Filter.Linear, Filter.Linear, 0)

ElseIf D3DRoot.CheckDeviceFormat(0, DeviceType.Hardware, AdapterFmt, 0, ResourceType.Textures, Format.R5G6B5 _
) Then
texCube1 = TextureLoader.FromFile(D3DDev, Application.StartupPath + "\cube1.bmp", 256, 256, 1, 0, _
Format.R5G6B5, Pool.Managed, Filter.Linear, Filter.Linear, 0)
Else
Throw New Exception("بت 32 أو بت 16 عمق تدعم لا لأنها المكعب خامة إنشاء يمكن لا ")
End If
End Sub

ولرسم الإطارات

Public Sub oneFrameUpdate()
If Not bInitOkay Then Throw New Exception("cannot update frame: engine was not properly initialised")

Dim matTmp As Matrix

cube1Angle += ((Environment.TickCount() - lastFrameUpdate) / 1000) * cube1Speed
lastFrameUpdate = Environment.TickCount()


matCube1 = Matrix.Identity()
matCube1 = Matrix.Multiply(matCube1, Matrix.Scaling(4, 4, 4))
matCube1 = Matrix.Multiply(matCube1, Matrix.RotationX(cube1Angle * (Math.PI / 180)))

matCube1 = Matrix.Multiply(matCube1, Matrix.RotationY(cube1Angle * (Math.PI / 180)))


If (Environment.TickCount() - iLastFPSCheck >= iFPSProfileSpeed) Then
iLastFPSCheck = Environment.TickCount()
iFrameRate = iCurrCnt * (1000 / iFPSProfileSpeed)
iCurrCnt = 0
End If
iCurrCnt += 1
End Sub

ولإظهار الرسوم على الشاشة

Public Sub oneFrameRender()
If Not bInitOkay Then Throw _
New Exception("cannot render frame: engine was not properly initialised")

D3DDev.Clear(ClearFlags.Target Or ClearFlags.ZBuffer, Drawing.Color.FromArgb(255, 0, 0, 64), 1.0F, 0)

D3DDev.BeginScene()
D3DDev.SetStreamSource(0, vbCube, 0)
D3DDev.VertexFormat = CustomVertex.PositionTextured.Format

If bRenderTextures Then

D3DDev.SetTexture(0, texCube1)
Else

D3DDev.SetTexture(0, Nothing)
End If

D3DDev.Transform.World = matCube1
D3DDev.DrawPrimitives(PrimitiveType.TriangleList, 0, 12)

D3DDev.EndScene()
D3DDev.Present()
End Sub

ونكتب في الفورم الكود الأتي

وهذا كود ال FORM كاملا

Public Class frmMain
Inherits System.Windows.Forms.Form

Private c3DEngine As CSampleGraphicsEngine
Private bRunning As Boolean = False
#Const RENDER_WINDOWED = 0

#Region " Windows Form Designer generated code "

Public Sub New()
MyBase.New()
InitializeComponent()
End Sub
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
Private components As System.ComponentModel.IContainer

<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
Dim resources As System.Resources.ResourceManager = New System.Resources.ResourceManager(GetType(frmMain))
Me.AutoScale = False
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.BackColor = System.Drawing.Color.Black
Me.ClientSize = New System.Drawing.Size(392, 266)
Me.ControlBox = False
Me.Icon = CType(resources.GetObject("$this.Icon"), System.Drawing.Icon)
Me.MaximizeBox = False
Me.MaximumSize = New System.Drawing.Size(400, 300)
Me.MinimizeBox = False
Me.MinimumSize = New System.Drawing.Size(400, 300)
Me.Name = "frmMain"
Me.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide
Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen
Me.Text = "Simple Direct3D9 (DirectX4VB.com)"

End Sub

#End Region

Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Try
Me.Size = New Drawing.Size(400, 300)
Me.MaximumSize = New Drawing.Size(400, 300)
Me.MinimumSize = New Drawing.Size(400, 300)

Me.Show()
Application.DoEvents()

#If RENDER_WINDOWED Then

c3DEngine = New CSampleGraphicsEngine(Me)

#Else

Dim iW As Integer = 0, iH As Integer = 0, iD As Integer = 0
If CSampleGraphicsEngine.isDisplayModeOkay(1024, 768, 32) Then
iW = 1024 : iH = 768 : iD = 32
ElseIf (CSampleGraphicsEngine.isDisplayModeOkay(1024, 768, 16)) Then
iW = 1024 : iH = 768 : iD = 16
ElseIf (CSampleGraphicsEngine.isDisplayModeOkay(640, 480, 32)) Then
iW = 640 : iH = 480 : iD = 32
ElseIf (CSampleGraphicsEngine.isDisplayModeOkay(640, 480, 16)) Then
iW = 640 : iH = 480 : iD = 16
Else

Throw New Exception("No supported display modes found")
End If

c3DEngine = New CSampleGraphicsEngine(Me, iW, iH, iD)

#End If

bRunning = True
Do While bRunning
c3DEngine.oneFrameUpdate()
c3DEngine.oneFrameRender()
Application.DoEvents()
Loop
c3DEngine = Nothing
End

Catch err As Exception
MsgBox(err.ToString)
End
End Try

End Sub

Protected Overrides Sub OnKeyDown(ByVal e As System.Windows.Forms.KeyEventArgs)
Select Case e.KeyCode
Case Keys.Escape
bRunning = False

End Select
End Sub
End Class

لقد انتهينا من الدرس الأول وفي انتظار الاستفسارات

الكود في المرفقات

___________.rar

تم تعديل بواسطه sayedf1
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

ماشاء الله على التفاعل الدرس القادم تحميل المجسمات

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

بارك الله فيك أخي الكريم

المهم أن يقدم الانسان الشئ المفيد

أردت إستفسار بخصوص مرجع الديركت أكس

هل يجب تنزيل الsdk أو فقط ادراج الملفات الضرورية المستعملة في المرجع؟

بالتوفيق ان شاء الله دائما

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم

درس شيق يستحق الاشادة و التقدير

لا تنتظر اخي سيد كلمة شكراً فمثل هذا المقال سيقرأه ان شاء الله مئات ان لم يكن الوف من المهتمين و لعده سنوات

بالنسبة لي لن استطيع المشاركة لانني لا احبذ استخدم لغات الـ NET. في برمجة الالعاب

لكنني سأكون متواجدا هنا لمتابعة الدروس :)

تحياتي

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
أردت إستفسار بخصوص مرجع الديركت أكس

هل يجب تنزيل الsdk أو فقط ادراج الملفات الضرورية المستعملة في المرجع؟

بالتوفيق ان شاء الله دائما

السلام عليك اخى DreamNet

من الأفضل ان تنزل ال sdk كامل ومن الأفضل ان يكون اخر تحديث.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليك اخى الكون

اولا ارحب بك فى هذا الموضوع الشهيد

درس شيق يستحق الاشادة و التقدير

لا تنتظر اخي سيد كلمة شكراً فمثل هذا المقال سيقرأه ان شاء الله مئات ان لم يكن الوف من المهتمين و لعده سنوات

انا فعلا لا أنتظر كلمة شكر فهذا المجهود ابغى به وجه الله ولكن التفاعل يعطى حافز للمواصله وفى نفس الوقت ان اخطأت فى شيئ سوف يكتشفة اخرون

بالنسبة لي لن استطيع المشاركة لانني لا احبذ استخدم لغات الـ NET. في برمجة الالعاب

لكنني سأكون متواجدا هنا لمتابعة الدروس :)

تحياتي

اريد ان اعرف لماذا لا تحبذ استخدم لغات الـ NET. في برمجة الالعاب

تقبل تحياتى

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

حسنا سأحاول تثبيتها بعد تجربة ادارج المرجع الخاص بالديركت اكس

وسأتابع الدروس معك

لكن المهم أن لا تتوقف :rolleyes:

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم

الدرس الثاني تحميل مجسم وإكساءه

المطلوب للدرس ملف tiny.x و Tiny_skin.bmp وسوف تجدهم فى مجلد C:\DXSDK\Samples\Media

تعلمنا في الدرس السابق كيفية إنشاء فضاء اللعبة وتعلمنا أيضا كيفية رسم مربع،

والآن سوف نتعلم الـ Mesh فهو مهم جدا فكل ما تره في اللعبة مكون من Mesh،

ما هو أل Mesh:

هو عبارة عن مجسم يأخذ شكل شخص أو سيارة أو طائره يعنى أي شيء يمكن رسمه في صوره ثلاثية الأبعاد

أفتح مشروع الدرس السابق واذهب إلى إجراء رسم المكعب واحذف كل أوجه المكعب ماعدا الوجه العلوي.

اذهب إلى دالة تحديث الإطارات وعدل حجم المكعب إلى.

matCube1 = Matrix.Multiply(matCube1,Matrix.Scaling(800,0,800))

وأحذف حساب دوران المكعب

cube1Angle += ((Environment.TickCount() - lastFrameUpdate) / 1000) * cube1Speed

وأحذف دالتا الدوران

matCube1 = Matrix.Multiply(matCube1, Matrix.RotationX(cube1Angle * (Math.PI / 180)))
matCube1 = Matrix.Multiply(matCube1, Matrix.RotationY(cube1Angle * (Math.PI / 180)))

والأن نريد أن نتعامل مع الكاميرة بطريقة إحترافية سوف ننشأ داله لإعدادات الكاميرة

وقبل ذالك يجب أن نحذف السطران الأتيان من دالة وضع القيم الإبتدائية

D3DDev.Transform.View = Matrix.LookAtLH(New Vector3(0, 0, -15), New Vector3(0, 0, 0), New Vector3(0, 1, 0))
D3DDev.Transform.Projection = Matrix.PerspectiveFovLH(Math.PI / 4, 4 / 3, 1, 100)

وهذه إجراء إعدادات الكاميرة

Private Sub SetupCamera()
D3DDev.Transform.Projection = Matrix.PerspectiveFovLH(System.Convert.ToSingle(Math.PI) / 4, 4 / 3, 1.0F, 10000.0F)
D3DDev.Transform.View = Matrix.LookAtLH(New Vector3(0, 1000, 1300.0F), New Vector3(0, 300, 0), New Vector3(0, 1, 0))

D3DDev.RenderState.Ambient = Color.DarkBlue
D3DDev.Lights(0).Type = LightType.Directional
D3DDev.Lights(0).Diffuse = Color.White
D3DDev.Lights(0).Direction = New Vector3(0, -1, -1)
D3DDev.Lights(0).Commit()
D3DDev.Lights(0).Enabled = True
End Sub

ونستدعي هذا الأجراء فى دالة وضع القيم الإبتدائية

ثم نفذ البرنامج لتشاهد النتيجة

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

والأن سوف نعلن عن المتغيرات الخاصه بال Mesh

Private mesh As Mesh = Nothing
Private meshMaterials() As Material
Private meshTextures() As Texture
Private angle As Single = 0.0F

ولتحميل المجسم نكتب الأجراءالأتي

  Private Sub LoadMesh(ByVal file As String)
Dim mtrl() As ExtendedMaterial
mesh = Direct3D.Mesh.FromFile(file, MeshFlags.Managed, D3DDev, mtrl)
If Not (mtrl Is Nothing) AndAlso mtrl.Length > 0 Then
meshMaterials = New Material(mtrl.Length) {}
meshTextures = New Texture(mtrl.Length) {}
Dim i As Integer
For i = 0 To mtrl.Length - 1
meshMaterials(i) = mtrl(i).Material3D
If Not (mtrl(i).TextureFilename Is Nothing) AndAlso mtrl(i).TextureFilename <> String.Empty Then
meshTextures(i) = TextureLoader.FromFile(D3DDev, Application.StartupPath + "\" + mtrl(i).TextureFilename)
End If
Next i
End If
End Sub

وبعد ذلك نريد رسم المجسم نكتب الأجراء الأتي

Private Sub DrawMesh(ByVal yaw As Single, ByVal pitch As Single, ByVal roll As Single, ByVal x As Single, ByVal y As Single, ByVal z As Single)
angle += 0.01F

D3DDev.Transform.World = Matrix.Multiply(Matrix.RotationYawPitchRoll(0, 5, roll), Matrix.Translation(0, 280, 0))
Dim i As Integer
For i = 0 To meshMaterials.Length - 1
D3DDev.Material = meshMaterials(i)
D3DDev.SetTexture(0, meshTextures(i))
mesh.DrawSubset(i)
Next i
End Sub

وفى إجراء تحميل الخامات نكتب

LoadMesh(Application.StartupPath + "\tiny.x")

وفى إجراء إظهار الرسم على الشاشه نكتب بعد () D3DDev.BeginScene هذا الكود.

DrawMesh(System.Convert.ToSingle(Math.PI), System.Convert.ToSingle(Math.PI) * 2.0F, angle / System.Convert.ToSingle(Math.PI) / 4.0F, 0.0F, 0.0F, 0.0F)

وسوف تجد هذا المثال فى المرفقات

____________.rar

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم ورحمة الله وبركاته

شرح جميل أخ sayedf1 وأبشرك أني قد حملت الSDK (آخر اصدار) لكن هناك مشكلة واجهتني عند تنفيذ المثال المرفق

أن الدالة Commit ليست موجودة ضمن الفئة Direct3D.Light

ملاحظة : أنا أستعمل vb 2005 Express

المرجع المستعمل عندي موضح في الصورة التالية:

post-23361-1193634691_thumb.jpg

بالتوفيق ان شاء الله في الدروس القادمة

تعديل : لقد أزلت السطر

D3DDev.Lights(0).Commit()

وعمل المثال

تم تعديل بواسطه DreamNet
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليك اخى دريم نت الحمد لله انك متابع معى انا كنت احبط وكنت ناوى ماأكمل لكن سوف اكمل ما دام هناك احد يريد ان يتعلم

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

وأيضا اضافة بعض الصور .. للمثال .. سيزيد من عدد المشاهدة :D .. أتمنى لك التوفيق ..

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم

الدرس الثالث DirectInput

افتح الدرس الثانى واضف اليه ملف module واسمه DirectInput

اضف الى المشروع مرجع DirectInput

افتح ملف DirectInput

ثم أستدعى المراجع التى سوف نستخدمها

Imports Microsoft.DirectX
Imports Microsoft.DirectX.DirectInput
Imports System.Threading

ثم نعلن عن بعض المتغيرات التى سوف نستخدمها

Private devkey As Device = Nothing
Private devmouse As Device = Nothing

Friend cameraz As Single = 1600
Friend camerax As Single = 0
Friend cameray As Single = 500

Friend targetz As Single = 1599
Friend targetx As Single = 0
Friend targety As Single = 500

ثم ننشأ الإجراء التالى

Friend Sub InitializeInput()
devkey = New Device(SystemGuid.Keyboard) ' لوحة المفاتيحِ إنشاء أداةَ
devkey.Acquire()
Updatekey()
End Sub

ثم اجراء كشف لوحة المفاتيح

Private Sub Updatekey()
Dim pressedKeys As String = "Using GetPressedKeys(): " + vbCr + vbLf
Dim k As Key
For Each k In devkey.GetPressedKeys()
Next k

Select Case k
Case Key.Escape
End
Case Key.DownArrow
cameraz += 5
targetz += 5
Case Key.UpArrow
cameraz -= 5
targetz -= 5

Case Key.LeftArrow
camerax += 5
targetx += 5
Case Key.RightArrow
camerax -= 5
targetx -= 5
End Select

End Sub

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

D3DDev.Transform.View = Matrix.LookAtLH(New Vector3(camerax, cameray, cameraz), New Vector3(targetx, targety, targetz), New Vector3(0, 1, 0))

ويبقى ان نستدعى إجراء لوحة المفاتيح من اجراء تحديث الإطارات

InitializeInput()

والدرس فى المرفقات

____________.rar

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم ورحمة الله وبركاته

الله يبارك فيك اخي الكريم وجزاك الكريم الخير على معروفك

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

شكرا لك اخي الكريم

الله يجزاك خير على الجهد

سأكون إن شاء الله من المتابعين المجتهدين :)

أخي الكريم كان من المفترض أن تضع رابط لتحميل DirectX 9 المخصصة للـVB.Net

أنا لقيت رابط في موضوع آخر http://www.arabteam2000-forum.com/index.ph...&hl=directx

ونزلته وبعد انتهاء التحميل وتركيب البرنامج اكتشفت - للأسف - أنه لا يتعامل مع الـVB.Net

هذا رابط التحميل المخصص للـVB.Net

اضغط هنا

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

السلام عليكم

نصبت الـDirectX9 ولكن لا استطيع إضافتها بواسطة Add Referens ( غير موجودة )

مع العلم أني إذا أردت تشغيل ملفات الـSamble يظهر لي رسالة الخطأ المرفقة

وعندما فحصت اختبار ( DirectDraw) و ( Direct3D ) عن طريق أمر ( dixdiag ) قالي تمت كافة الاختبارات بنجاح .

post-2767-1211415478_thumb.jpg

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

الحمد لله زالت المشكلة

وقمت بتركيب التحديث اللي فيه DirectX 9.0 SDK Update (Summer 2003)

واشتغلت ملفات الامثلة وأضفت الـReferense

حملت مثال الدرس الثالث وعندما شغلت التطبيق ظهرت لي رسالة الخطأ

DLL 'C:\WINDOWS\assembly\GAC\Microsoft.DirectX\1.0.900.0__31bf3856ad364e35\Microsoft.DirectX.dll' is attempting managed execution inside OS Loader lock. Do not attempt to run managed code inside a DllMain or image initialization function since doing so can cause the application to hang.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .