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

إطار جيد للتعامل مع Irrlichtcp رسم صوت وفيزياء معا

رائج
بدأه DreamNet في 7 أكتوبر 2007 · 112 رد · 21,104 مشاهدة · في قسم برمجة الألعاب و الرسوميات العام
مشاركة: واتساب X فيسبوك تيليجرام
#51

الصراحة كم هائل من الاكواد المفيدة جدا جدا :):)

ماشاء الله عليك يا غالى

ننتظر المزيد دائما :)

الصراحة احببت هذه المكتبة كثيرا

وان شاء الله هطبق الامثلة كلها قريبا وان شاء الله ازيد كمان :):)

تم تعديل هذه المشاركة بواسطة (HARD) في 4 فبراير 2008 في 21:46

#52

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

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

Tut_CSharp01.zip

Tut_CSharp02.zip

#53

الله عليك يا غالى :)

الصراحة شئ رائع منك :)

مشكوووور على الامثلة سأطلع عليها ولى رجعة ان شاء الله تعالى :)

#54

انا حملت المثالين يا غالى

بس لى طلب ولكن اذا كان صعب عليك فلا يهم

اريد منك يا غالى ولو شرح بسيط عن الامثلة :)

اذا كان صعب انا اعتذر عن هذا الطلب :):)

#55
اقتباس
اريد منك يا غالى ولو شرح بسيط عن الامثلة

أصلا الشرح بسيط جدا:)

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

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

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

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

#57
اقتباس
أصلا الشرح بسيط جدا

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

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

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

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

الصراحة اخجلتنى جدا

طبعا كل المحرك بلا ادنى شك يندرج تحت الاساسيات لازم اساسيات علشان تعرف تشتغل :):)

سأبدء فى المحرك بأقرب وقت ان شاء الله تعالى

بعد دراسة الاكواد :)

#58

قبل التطرق إلى تحريك الأجسام والتصادم باستعمال مكتبة الفيزياء

سنتطرق إلى مثال نطبق فيه نفس الشئ الذي رأيناه في أول مرة استعملنا فيها مكتبة نيوتن لكن هذه المرة نستعمل أرضية تكون هي الجسم الثابت

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

post-23361-1202676740_thumb.jpg

اذا الشئ الذي يجب عمله الآن هو انشاء RigidBody طبعا بعد تحديد نوع الجسم ثم بعد ذلك نقوم بتطبيق القوى اللازمة عليه

طبعا طل جسم يخضع لكتلته والجاذبية في الحالة العادية

نقوم بانشاء SceneNode عبارة عن مكعب

وكما رأينا في السابق نضيف المكعب داخل العالم الفيزيائي المحدد بأبعاده

ومن أجل التحريك نستدعي الحدث Transform ولتطبيق القوى المؤثرة نستغل الحدث ApplyForceAndTorque

post-23361-1202677282_thumb.jpg

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

يعني لن نستعمل الحدثين Transform و ApplyForceAndTorque

في المرة القادمة سنرى كيف نقوم بتطبيق ماورد

#59

انا الحمد لله قمت بتحميل المكتبة وهى فعلا جميلة جدا :)

والمكتبة سهلة جدا فى البرمجة سأبدء بها اليوم ان شاء الله :)

#60

كما تعودنا مع هذه المكتبة نحتاج في البداية إلى فئة موورثة من Game والتي سنقوم انطلاقا منها تهيئة محرك الرسم ومحرك الفيزياء واضافة الكيانات

داخل اللعبة

بما أننا سنقوم كما رأينا في الشكل السابق برسم مكعب وأرضية واضافة كاميرا فسيلزمنا 3 كيانات Entity ونسميهم مثلا

Plane فئة الأرضية

mBox فئة المكعب

GameCam فئة الكاميرا

طبعا بعد تحديد أبعاد العالم الفيزيائي

وبذلك تكون فئة اللعبة والمساماة myGame مكتوبة بالشكل التالي:

Imports Framework
Imports Framework.Irrlicht
Public Class myGame
	Inherits Framework.Game

	Public Sub New()
		IrrlichtDevice.WindowCaption = "Plane Sample With IrrlichtFramework"
		NewtonWorld.WorldSize(New Vector3D(-1000, -1000, -1000), New Vector3D(1000, 1000, 1000))
		IrrlichtDevice.CursorControl.Visible = False
		Entities.Add(New Plane(Me))
		Entities.Add(New mBox(Me))
		Entities.Add(New GameCam(Me))
		Run()
	End Sub

End Class

طبعا رأينا في السابق كيفية انشاء كلاس المكعب مع مثال نيوتن الأول ولذلك سأتطرق لكلاس الأرضية

طبعا عملية رسم الأرضية رأيناها في الدروس الأولى للمحرك في الموضوع الأول الخاص بمكتبة Irrlicht وبذلك يكون الكود باستعمال هذه المكتبة كالتالي :

Dim GameDevice As IrrlichtDevice = myGame.IrrlichtDevice
		Dim smgr As SceneManager = myGame.SceneManager
		Dim driver As VideoDriver = myGame.VideoDriver
		Dim hillmesh As AnimatedMesh = smgr.AddHillPlaneMesh("myHill", New Dimension2Df(30, 30), _
		 New Dimension2D(40, 40), 5, New Dimension2Df(0, 0), New Dimension2Df(10, 10))

		Dim floor As SceneNode = smgr.AddMeshSceneNode(hillmesh.GetMesh(0), Nothing, -1)
		floor.SetMaterialTexture(0, driver.GetTexture("rockwall.bmp"))
		floor.SetMaterialFlag(MaterialFlag.Lighting, False)

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

طبعا ستكون الأرضية أيضا عبارة عن RigidBody

m_body = New RigidBody(myGame.NewtonWorld, collision)

الإختلاف هو في الكائن Collision وكيفية انشائه

لذلك نقوم بإنشاء دالة لهذا الغرض وظيفتها هي تحديد نقاط التصادم داخل الشكل المنشئ

Private Function CreateTreeCollisionFromMesh(ByVal mesh As Mesh) As TreeCollision
		Dim faceList As List(Of Face) = New List(Of Face)
		Dim meshBufferPosition As Integer
		For meshBufferPosition = 0 To mesh.MeshBufferCount - 1 Step +1
			Dim buffer As MeshBuffer = mesh.GetMeshBuffer(meshBufferPosition)
			Dim j As System.UInt32
			For j = 0 To buffer.IndexCount - 1 Step 3
				Dim face As Face = New Face()
				Select Case buffer.VertexType
					Case VertexType.Standard
						face.Vertex1 = buffer.GetVertex(buffer.GetIndex(j)).Position
						face.Vertex2 = buffer.GetVertex(buffer.GetIndex(j + 1)).Position
						face.Vertex3 = buffer.GetVertex(buffer.GetIndex(j + 2)).Position
					Case VertexType.T2Coords
						face.Vertex1 = buffer.GetVertexT2(buffer.GetIndex(j)).Position
						face.Vertex2 = buffer.GetVertexT2(buffer.GetIndex(j + 1)).Position
						face.Vertex3 = buffer.GetVertexT2(buffer.GetIndex(j + 2)).Position
					Case Else
						face.Vertex1 = buffer.GetVertexT2(buffer.GetIndex(j)).Position
						face.Vertex2 = buffer.GetVertexT2(buffer.GetIndex(j + 1)).Position
						face.Vertex3 = buffer.GetVertexT2(buffer.GetIndex(j + 2)).Position
				End Select
				faceList.Add(face)
			Next
		Next
		Return New TreeCollision(Game.NewtonWorld, faceList, True)
	End Function

بهذا يمكننا تعريف كائن التصادم الآن انطلاقا من هذه الدالة

Dim collision As TreeCollision = CreateTreeCollisionFromMesh(hillmesh.GetMesh(0))

فئة الكاميرا تكلمنا عنها في السابق أيضا

مرفق تطبيق الدرس السريع

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

Tut_N02.zip

#61

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

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

الكلاس سنسميها مثلما يسميها الكل :) Character

ومما ذكرنا فسننشئ هيكل عام يعبر عن أزرار التحكم بالشخصية يكون بالشكل التالي

Public Structure CharacterInput
	Dim Rotation As Vector2D
	Dim Forward As Boolean
	Dim Backward As Boolean
	Dim Left As Boolean
	Dim Right As Boolean
End Structure

الغرض هنا هو معرفة أي زر تم الضغط عنه من أجل تحريك الشخصية

ننشئ فئتنا ونجعلها موورثة من الفئة Entity لانها كيان سنقوم باضافته داخل اللعبة

طبعا نضيف خاصية للفئة تعبر عن أزرار التحكم

Public Class Character
	Inherits Entity
	Private m_input As New CharacterInput()
	Public Property Input() As CharacterInput
		Get
			Return m_input
		End Get
		Set(ByVal value As CharacterInput)
			m_input = value
		End Set
	End Property
End Class

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

لذلك نقوم بانشاء كائن تصادم للجسم الصلب من النوع Sphere ثم نقوم بتحريكه بتطبيق القوى اللازمة عليه

Protected Overridable Sub mApplyForceAndTorque(ByVal body As RigidBody)
		Dim direction As New Vector3D()
		If Input.Forward Then
			direction.Z += 1.0F
		End If
		If Input.Backward Then
			direction.Z -= 1.0F
		End If
		If Input.Left Then
			direction.X -= 1.0F
		End If
		If Input.Right Then
			direction.X += 1.0F
		End If
		direction.RotateXZBy(-Input.Rotation.Y, New Vector3D())
		direction = direction.Normalize()

		Dim force As Vector3D = Mass * (direction * 200 - body.Velocity) / Game.NewtonWorld.TimeStep
		force *= 0.5
		force.Y = -Gravity * Mass

		body.AddForce(force)
		body.Omega = New Vector3D()
	End Sub

End Class

هنا في الحدث الذي يتم فيه تطبيق القوى وعزوم التدوير ApplyForceAndTorque نقوم بتحريك الشخصية بالتأكد من الأزرار المضغوطة وتطبيق القوى اللازمة والتي تكون طبعا متعلقة باتجاه حركة الشخصية direction

كمثال تطبيق لاستعمال هذه الفئة نحاول ربطها مع الكاميرا كي تتحرك باستعمال الفيزياء لكي تؤثر على الأجسام وتتأثر بها طبعا بالتصادم

المثال المرفق نقوم به بتحريك الكاميرا باستعمال الأزرار q d و z s بدون استعمال keymap :)

Tut05.zip

الملاحظ هنا اننا لما نمر على جسم المكعب أو الكرة فاننا نؤثر عليهما مباشرة يعني مقاربة للحقيقة :)

بالنسبة للأخ HARD سأحاول ترجمة المثال إلى السي شارب قريبا

بالتوفيق للجميع

#62
اقتباس
بالنسبة للأخ HARD سأحاول ترجمة المثال إلى السي شارب قريبا

بالتوفيق للجميع

جزاك الله يا غالى الف خير على اهتمامك وانا متابع للمكتبة

انا اشوف ان المكتبة زى تشبه الـ XNA لحد كبير جدا جدا :)

#64

مشكووور يا غالى علي الكود :):)

ولكن انا صار معاى مشكلة بسيطة

وانا استخدم المكتبة الفيزيائة دائما الجهاز يهنج ؟؟ :(:(

#66

اجل يا غالى جربت بالطبع فى البداية المثال الى يأتى من المكتبة

هذا ضرورى حتى افهمه ولكن يهنج الجهاز ؟؟:(:(

علما انا لااملك كرت شاشة خارجى :(

#67
(HARD) كتب:
اجل يا غالى جربت بالطبع فى البداية المثال الى يأتى من المكتبة

هذا ضرورى حتى افهمه ولكن يهنج الجهاز ؟؟ :( :(

علما انا لااملك كرت شاشة خارجى :(

dreamnetأنا سأجيبك بعد إذن

إذا كانت لوحة الأم(mother board)

تحتوي على كرت شاشة داخلي فإنه يكون 64 ميجا في أغلبها

أنصحك بشراء كرت شاشة جديد

كرت شاشة 128 ميجا من شركة نيفيدا فهو أحد أفضل شركات كرت الشاشة وأرخصها :cash:

فعلى حد علمي فقد وجدت كروت شاشة بذواكر كبيرة الحجم جدا :D

السعات الموجوده هي

128 MB

256 MB

512 MB

1024 MB

فهناك كروت شاشة يصل سعرها في السعوديه إلى 3000 ريال سعودي وهي قوية جدا جدا

أرجو أن أكون قد أجبت على سؤالك

#68

أهلا بك مجددا أخ crazy Programm2007er :)

لا بد أنك شغلت الأمثلة السابقة بدون مشاكل

بالنسبة للمشكل أخي HARD فأظنه متعلق بحجم الذاكرة التي تملكه

فعادة يكون استهلاك الموارد عاليا جدا خصوصا عند استعمال المكتبتين الفيزيائية والخاصة بالرسم

وكرت الشاشة الخارجي يريح المعالج في جوانب كثيرة لذلك عليك بزيادة حجم الذاكرة عندك وان استطعت تكريب كرت شاشة خارجي

بالنسبة لي فأنا الآن بدون كرت شاشة خارجي لكني الحمد لله عندي 1 G ذاكرة وكل الأمثلة تعمل بدون مشاكل ماعدا عند زيادة الأجسام داخل الفضاء الفيزيائي فان اللعبة تصبح بطيئة جدا

بالتوفيق للجميع

#70

أخ dreamnet مشكلة في المحرك الفيزيائي أواجهها

وهي أنني عندما تصدم الكائنات الفيزيائية بالأرض(Plane)فإنه الأرض تدور

أرجو حل المشكلة

صورة عن المشكلة:-

post-114540-1203165485_thumb.jpg

#71

اشكركم اخوانى على هذه الاجابة السريعة والمفيدة ايضا

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

وان شاء الله ابدء العمل من جديد :):)

#72

السلام عليكم

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

لى سؤال بعد ما برسم الشخصيه وعملها الحركه وحملها فى المكتبه لا تتحرك لا اعرف السبب

هذا بدايتاً

163374357.gif

#73

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

أهلا بك أخي العزيز مجددا معنا

اقتباس
السلام عليكم

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

لى سؤال بعد ما برسم الشخصيه وعملها الحركه وحملها فى المكتبه لا تتحرك لا اعرف السبب

هذا بدايتاً

لا أعرف هل تقصد الAnimation أو تحريك الشخصية؟

بالنسبة للأولى فالمفروض تحميل الشخصية في كائن من النوع AnimatedMeshSceneNode والتحكم فيما بعد بسرعة الAnimation الموجودة في الشخصية وكذلك أشياء أخرى

أما بالنسبة للتحريك فيتم فقط بتغيير الاحداثيات من الخصائص Position و الدوران Rotation للكائن الذي تم تحميل الشخصية به

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

#74

السلام عليكم

انا فعلاً حملت الشخصية في كائن من النوع AnimatedMeshSceneNode ولكن عندما تتحرك يتيغير موضع اجزاء الشخصيه مثلا انا عملت سير

وعملت له الحركه الازمه وعندما حملته فى المكتبه انظر الصور كى تفهم قصدى

هذا الوضع الطبيعى

post-45582-1204483415_thumb.jpg

وهذا ما حدث بعد الحركه

post-45582-1204483472_thumb.jpg

ولى سؤال اخر كيف يمكن ان اتحكم فى سرعه الحركه وكيف اختار مجموعة فرمات مثلا لما تكون الشخصيه واقفه لا تعمل شيئ تفعل شيئ وعندما تتحرك

تتغير افعاله

163374357.gif

#75

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

بالنسبة للسرعة يمكنك تحديدها بتحديد الخاصية AnimationSpeed للكائن والتي تحمل قيمة عددية

تحديد مجموعة من الفرمات باستعمال الدالة SetFrameLoop وتأخذ قيمتين الاولى لفرام البداية والثانية لآخر فرام

اذا كانت الشخصية أو الملف المحمل داخل الكائن عبارة عن شخصية من النوع MD2 يمكن التحكم بحركاتها باستعمال الدالة SetMD2Animation

يمكن معرفة الفرام الحالي للAnimation بقراءة الخاصية CurrentFrame للكائن التي تعطينا الفرام الحالي

ممكن مشكلتك في تحديد الحركة التي يتم تشغيلها لكي يبقى الشكل في الوضع الاعتيادي

يمكن أيضا استعمال الخاصية LoopMode لايقاف أو تشغيل الحركة

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

تم تعديل هذه المشاركة بواسطة DreamNet في 3 مارس 2008 في 14:56

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

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

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

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

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