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

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

مثبّترائج
بدأه sayedf1 في 5 أكتوبر 2007 · 41 رد · 23,557 مشاهدة · في DirectX
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

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

سوف أبدأ بإذن الله دوره في برمجة الألعاب ، ونبدأها بــ 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 في 8 مارس 2012 في 19:05

1

163374357.gif

#2

السلام عليكم

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

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

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

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

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

تحياتي

#3

السلام عليكم

مقدمة حول 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 المختلفة لكي تعمل.. إنّ هذا يشير بوضوح لأهمّيّة هذه التقنية، ومدى الإمكانيّات التي تقدّمها.

منقول

163374357.gif

#4

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

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

163374357.gif

#5

السلام عليكم

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

شكرا اخي سيد

هناك نقطة اخرى ال 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 لكنني سأتابع موضوعك لان الفرق بسيط بين لغات دوت نت

تحياتي

#6

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 في 12 ديسمبر 2007 في 20:32

163374357.gif

#7

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

أضف إليه 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 في 5 أكتوبر 2007 في 19:08

163374357.gif

#8

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

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

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 في 16 يونيو 2009 في 18:47

163374357.gif

#9

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

163374357.gif

#10

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

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

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

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

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

#11

السلام عليكم

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

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

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

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

تحياتي

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

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

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

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

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

163374357.gif

#13

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

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

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

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

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

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

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

تحياتي

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

تقبل تحياتى

163374357.gif

#15

السلام عليكم

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

المطلوب للدرس ملف 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

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

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

163374357.gif

#16

والأن سوف نعلن عن المتغيرات الخاصه بال 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

163374357.gif

#17

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

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

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

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

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

post-23361-1193634691_thumb.jpg

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

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

D3DDev.Lights(0).Commit()

وعمل المثال

تم تعديل هذه المشاركة بواسطة DreamNet في 29 أكتوبر 2007 في 08:57

#18

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

163374357.gif

#19

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

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

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

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

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#20

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

163374357.gif

#21

السلام عليكم

الدرس الثالث 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

163374357.gif

#22

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

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

#23

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

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

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

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

أنا لقيت رابط في موضوع آخر /index.ph...&hl=directx

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

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

اضغط هنا

460.gif

#24

السلام عليكم

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

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

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

post-2767-1211415478_thumb.jpg

460.gif

#25

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

وقمت بتركيب التحديث اللي فيه 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.

460.gif

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