DreamNet

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

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

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

التطبيق الأول :

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

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

post-23361-1204546058_thumb.jpg

أول شئ يجب ذكره أن مجسم الأرض ملف directx اسمه earth.x إذا الخطوة الأولى هي تحميل هذا الملف داخل المشهد

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

Dim mesh As AnimatedMesh = GameDevice.SceneManager.GetMesh("earth.x")

الmesh صغير نسبيا لذلك نقوم بتكبيره نوعا ما ثم نحدد موقعه

Dim node As SceneNode = GameDevice.SceneManager.AddAnimatedMeshSceneNode(mesh)
node.Scale = New Vector3D(10, 10, 10)
node.Position = New Vector3D(2, 2, 40)

نعطل خاصية التأثر بالضوء لعدم وجود أي مصدر اضاءة على الجسم المنشئ

node.SetMaterialFlag(MaterialFlag.Lighting, False)

الآن نقوم بانشاء حركة دوران على المحور y

Dim anim As Animator = GameDevice.SceneManager.CreateRotationAnimator(New Vector3D(0, 0.2F, 0))

نضيف الحركة للجسم الذي أنشأناه

node.AddAnimator(anim)

يمكنكم تطبيق المثال

الكود به ملف الديركت اكس لمجسم الأرض

CODE.zip

بالتوفيق

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

شارك هذا الرد


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

التطبيق الثاني :

درس خفيف حول رسم صندوق السماء

في الألعاب يتم فقط رسم صندوق للسماء يكون ثابت وبما أنه صندق أي مكعب فهو يحتوي 6 أوجه

لذلك سنحتاج إلى 6 صور للسماء تربط لتكوين هذا الصندوق

هنا سنقوم برسم الشكل الممثل للسماء كما في الصورة

post-23361-1204546644_thumb.jpg

يمكنكم تحميل الصور الست الممثله لصندوق السماء هنا

ماعلينا سوى اضافة صندوق السماء عن طريق الدالة AddSkyBoxSceneNode التي توجد في الفئة SceneManager للمحرك قبلها يجب تحميل الاكساءات Texture بالترتيب داخل مصفوفة تحمل الصور التي تكلمنا عنها وعملية الترتيب أساسية

وبذلك نستطيع أن ننشئ المشهد الذي تكلمنا عنه

الكلاس التي ستقوم بانشاء السماء نسميها مثلا SkyBB وتكون كيان طبعا نضيفه داخل اللعبة

Imports Framework
Imports Framework.Irrlicht
Public Class SkyBB
Inherits Entity
Public Sub New(ByVal myGame As Game)
MyBase.New(myGame)
Dim smgr As SceneManager = myGame.SceneManager
Dim driver As VideoDriver = myGame.VideoDriver
Dim SkyBText() As Texture
ReDim SkyBText(5)
SkyBText(0) = driver.GetTexture("cloudy_noon_UP.jpg")
SkyBText(1) = driver.GetTexture("cloudy_noon_dn.jpg")
SkyBText(2) = driver.GetTexture("cloudy_noon_bk.jpg")
SkyBText(3) = driver.GetTexture("cloudy_noon_fr.jpg")
SkyBText(4) = driver.GetTexture("cloudy_noon_rt.jpg")
SkyBText(5) = driver.GetTexture("cloudy_noon_lf.jpg")
smgr.AddSkyBoxSceneNode(Nothing, SkyBText, 0)
End Sub
End Class

كود التطبيق

CODE2.zip

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

0

شارك هذا الرد


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

التطبيق الثالث:

رسم الأرضية

post-23361-1204547344_thumb.jpg

نلاحظ في الصورة أننا أنشأنا سطح أو لأرضية وعملنا له كساء ووضعنا مكعب فوقها

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

باستعمال AddHillPlaneMesh نضيف للمشهد أرضية مسطحة بتحديد عدة عناصر

1- اسم السطح أو التل إذا صح التعبير (غير مهم الآن)

2-حجمه يعني هنا مساحته لانه سياخذ متغير من النوع dimension2df

3-عدده وهنا المساحة التي حددنا بها السطح سنقوم بتكرارها

طبعا لتحديد الكساء هنا ننشئ كائن Material ندرج فيه الtexture للأرضية (هنا فقط سأدرج كساء واحد وليس متعدد ) وقد استعملت ككساء الملف الموجود مع المحرك وهو rockwall.bmp

Imports Framework
Imports Framework.Irrlicht
Public Class Plane
Inherits Entity
Public Sub New(ByVal myGame As Game)
MyBase.New(myGame)
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)
End Sub
End Class

ملاحظة تعطيل الإضاءة في حالة عدم وجود مصدر للإضاءة ضروري لكي يظهر لنا المشهد لانه مفعل إفتراضيا لذلك نغير MaterialFlag.Lighting إلى false كماهو في السطر الأخير

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

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

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

post-23361-1204547413_thumb.jpg

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

0

شارك هذا الرد


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

التطبيق الرابع :

إستعمال الGUI والتي هي إختصار لـGraphical User Interface

post-23361-1204547991_thumb.jpg

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

قبل البدأ يجب أن نستعمل الإجراء Draw الموجود بالمكتبة والذي به نقوم بتنفيذ عمليات رسم الكائنات من النوع GUI لذلك فيجب أن نضيف الإجراء المعرف أصلا في الفئة Game ونخبر الفئة الخاصة بالكائنات من هذا النوع بأمر الرسم

Protected Overrides Sub Draw()
IrrlichtDevice.GUIEnvironment.DrawAll()
End Sub

لآن يمكنا إنشاء محيط لرسم الأدوات فالمسؤول هنا عن رسم الأدوات GUI يختلف عن المسؤول عن رسم المشهد لان طريقة الرسم ستكون مختلفة

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

Dim mySkin As GUISkin = device.GUIEnvironment.Skin

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

mySkin.SetColor(GuiDefaultColor.ButtonText, New Color(255, 0, 4, 0))

عملية تحميل الخط في المحرك تتم باستعمال صورة الخط والتي يمكن انتاجه بواسطة أداة تابعة للمحرك تقوم باستخراج الصورة المقابلة للخط الذي نريد استعماله موجود في المجلد \tools\IrrFontTool

mySkin.Font = device.GUIEnvironment.GetFont("myfont0.bmp")

نمر الآن إلى عملية انشاء زر بسيط داخل الinterface الخاص بمحيط اللعبة

من أجل هذا نعرف كائن من النوع GUIElement أو GUIButton نفس الشئ

ثم نقوم باضافة هذا الزر داخل اطار الرسم

Dim dimen As Dimension2D = New Dimension2D(250, 40)
Dim pos As Position2D = New Position2D(200, 150)
Dim aButton As GUIButton = device.GUIEnvironment.AddButton(New Rect(pos, dimen) _
, Nothing, 101, "New Button")

الآن يمكن أن نقول أننا قد أنشأنا زر بسيط موجود في الاحداثيات المحددة من المتغير pos وحجمه متعلق بالمتغير dimen ومعرفه 101 (سنرى فيما بعد فائدته) و النص الذي مكتوب به هو New Button

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

يبقى الآن معرفة كيفية التحكم بأحداث هذا الكائن مثلا الزر المنشئ

كما عرفنا سابقا فان تتبع أحداث اللعبة يسيرها المحرك من خلال الحدث OnEvent فقط هنا علينا أن نميز أن الحدث تابع لعناصر الGUI ومن ثم التفريق فيما بعد بين العناصر عن طريق المعرف ID الذي تكلمنا عنه للزر وكانت قيمته 101 مثلا

Function OnEvent(ByVal ev As [Event]) As Boolean
If ev.Type = EventType.GUIEvent And ev.GUIEvent = GUIEventType.ButtonClicked Then
If ev.Caller.ID = 101 Then
IrrlichtDevice.GUIEnvironment.AddMessageBox("Test", "Ok Button is Clicked Now...", True, MessageBoxFlag.OK, Nothing, 0)
End If
End If
End Function

في الكود السابق قمنا بالتأكد من أن الحدث ev من النوع GUIEvent وانه متعلق بحدث الضغط على الزر ev.GUIEvent = GUIEventType.ButtonClicked

ثم تأكدنا من أن الزر المضغوط هو الزر الذي تم انشاؤه مسبقا بالمعرف 101

If ev.Caller.ID = 101 Then

بعدها قمنا بانشاء messageBox باستعمال الدالة AddMessageBox

تحميل التطبيق

CODE3.zip

0

شارك هذا الرد


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

مشاء الله والله مجهود رائع انا متابع معاك

0

شارك هذا الرد


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

أهلا بك دائما أخي العزيز sayedf1 , نكمل ماتبقى :)

التطبيق الخامس:

نريد الآن أن نتعلم كيف نضيف كيان متحرك

post-23361-1204574357_thumb.jpg

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

بكل بساطة يتم اضافة الأشكال التي تعمل حركات باستعمال متغير AnimatedMeshSceneNode

باستعمال الدالة AddAnimatedMeshSceneNode الموجودة في الكائن SceneManager

نضيف كلاس نسميها m_dwarf للمشروع

Imports Framework
Imports Framework.Irrlicht
Public Class m_dwarf
Inherits Entity
Sub New(ByVal myGame As Game)
MyBase.New(myGame)
Dim GameDevice As IrrlichtDevice = myGame.IrrlichtDevice
Dim smgr As SceneManager = myGame.SceneManager
Dim perso As AnimatedMeshSceneNode = smgr.AddAnimatedMeshSceneNode(smgr.GetMesh("dwarf.x"))
perso.SetMaterialFlag(MaterialFlag.Lighting, False)
perso.Position = New Vector3D(30, 0, 100)
End Sub
End Class

وبعدها نعمل إلى اضافة هذا الكيان كما رأينا من Entities داخل الكلاس الموروثة من Game

لمن لا يملك ملف الديركت اكس للشخصية dwarf يمكنهم تحميله من هنا

dwarf.rar

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

0

شارك هذا الرد


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

التطبيق السادس:

رسم الظل للشخصية المتحركة

post-23361-1204574775_thumb.jpg

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

أولا وقبل البدأ لتفعيل الظل يجب عند تجهيز المحرك للعمل تفعيل خاصية الظل وجعل stencilbuffer مفعلة

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

أي نضيف السطر التالي في الاجراء New

MyBase.New(DriverType.Direct3D9, New Dimension2D(440, 380), 32, False, True, False, False)

لقد غييرنا اشياء منها كما قلنا stencilbuffer أصبحت True والبقية كلها غير مفعلة

كما لا يفوتني هنا أن أذكر أننا يمكننا تشغيل اللعبة fullscreen بتفعيل الخاصية أيضا بوضع True بدل False

يجدر الذكر هنا أن الأجسام التي نستطيع عمل لها ظل تكون من النوع AnimatedMeshSceneNode

في الصورة نرى أننا استعملنا شخصية متحركة dwarf لذلك نقوم بانشاء كلاس خاصة بالشخصية من النوع Entity

ويجد بالذكر أننا هنا يجب علينا انشاء شكل الظل للشخصية المنشئة باستعمال AddShadowVolumeSceneNode للSceneNode المنشئ

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

CreateFlyCircleAnimator للSceneManager للمحرك

في الأخير تكون لدينا فئة الشكل المعبر عن الشمس على الشكل التالي:

Imports Framework
Imports Framework.Irrlicht
Public Class SunMesh
Inherits Entity
Public Sub New(ByVal myGame As Game)
MyBase.New(myGame)
Dim light As LightSceneNode = myGame.SceneManager.AddLightSceneNode(Nothing, _
New Vector3D(0, 0, 0), New Colorf(0, 1.02, 0.5, 0.0), 200, 0)
Dim bill As SceneNode = myGame.SceneManager.AddBillboardSceneNode(light, New Dimension2Df(60, 60), 0)
bill.SetMaterialTexture(0, myGame.VideoDriver.GetTexture("particlewhite.bmp"))
bill.SetMaterialType(MaterialType.TransparentAddColor)
bill.Position = New Vector3D(0, 40, 70)
Dim anim As Animator = myGame.SceneManager.CreateFlyCircleAnimator(New Vector3D(0, 80, 0), 150, 0.0005)
light.AddAnimator(anim)
End Sub
End Class

مرفق الاكساء المستعمل لضوء الشمس

particlewhite.zip

بالتوفيق دائما

0

شارك هذا الرد


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

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

الله يعطيك الف عافية اخي الكريم ونشكر لك جهدك الكريم

0

شارك هذا الرد


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

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

لا أعرف اذا كانت الدروس صعبة التطبيق

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

tut01.zip

وأعتذر عن الاطالة :)

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

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

شارك هذا الرد


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

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

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

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

0

شارك هذا الرد


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

حسنا سأحاول عرض هذه الخصائص للكائن AnimatedMeshSceneNode

نقوم بانشاء خاصية للEntity التي أنشأناها سابقا m_dwarf

الخاصية الأولى تحدد موضع الكائن المتحرك


Public Property Position() As Vector3D
Get
Return perso.Position
End Get
Set(ByVal value As Vector3D)
perso.Position = value
End Set
End Property
	   Private perso As AnimatedMeshSceneNode

الخاصية تقوم بالقراءة والكتابة داخل الخاصية الأساسية للكائن perso

ننشئ إجراء يقوم بتحديد الفرام الذي يتم تشغيله


perso.SetFrameLoop(start, fEnd)
End Sub
	   Public Sub SetFrame(ByVal start As Integer, ByVal fEnd As Integer)

كما ذكرت سابقا الدالة المسؤولة عن تحديد الفرام المشغل هي SetFrameLoop

لايقاف حركة الكائن المتحرك نقوم بتغيير الخاصية LoopMode اما True أو False وهذه الخاصية للكتابة فقط


Set(ByVal value As Boolean)
perso.LoopMode = value
End Set
End Property
	   Public WriteOnly Property Move() As Boolean

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


Set(ByVal value As Integer)
perso.AnimationSpeed = value
End Set
End Property
	   Public WriteOnly Property Vitesse() As Integer

في الأخير الشكل النهائي للفئة الممثلة للكيان المتحرك والمعبر عن الكائن dwarf

تصبح :


Imports Framework.Irrlicht
Public Class m_dwarf
Inherits Entity
Private perso As AnimatedMeshSceneNode
Public Property Position() As Vector3D
Get
Return perso.Position
End Get
Set(ByVal value As Vector3D)
perso.Position = value
End Set
End Property
Public Sub SetFrame(ByVal start As Integer, ByVal fEnd As Integer)
perso.SetFrameLoop(start, fEnd)
End Sub
Public WriteOnly Property Move() As Boolean
Set(ByVal value As Boolean)
perso.LoopMode = value
End Set
End Property
Public WriteOnly Property Vitesse() As Integer
Set(ByVal value As Integer)
perso.AnimationSpeed = value
End Set
End Property
Sub New(ByVal myGame As Game)
MyBase.New(myGame)
Dim GameDevice As IrrlichtDevice = myGame.IrrlichtDevice
Dim smgr As SceneManager = myGame.SceneManager
perso = smgr.AddAnimatedMeshSceneNode(smgr.GetMesh("dwarf.x"))
perso.SetMaterialFlag(MaterialFlag.Lighting, False)
perso.Position = New Vector3D(30, 0, 100)
End Sub
End Class
   Imports Framework

الآن يمكن أن نقوم بتغيير تلك الخصائص من الفئة Game

 Imports Framework
Imports Framework.Irrlicht
Public Class myGame
Inherits Framework.Game
Private dwarf As New m_dwarf(Me)
Public Sub New()
Entities.Add(New Plane(Me))
Entities.Add(dwarf)
Entities.Add(New SkyBB(Me))
Entities.Add(New GameCam(Me))
AddHandler IrrlichtDevice.OnEvent, AddressOf OnEvent
Run()
End Sub
Protected Function OnEvent(ByVal ev As [Event])
Select Case ev.KeyCode
Case KeyCode.F1
dwarf.Position = New Vector3D(0, 50, 50)
Case KeyCode.F2
dwarf.SetFrame(0, 5)
Case KeyCode.F3
dwarf.Move = False
Case KeyCode.F4
dwarf.Move = True
End Select
Return False
End Function

End Class

من الكود فانه يتم التحكم في الخصائص المنشئة باستعمال الأزرار F1 F2 F3 F4

الزر الأول يقوم بتغيير مكان الكائن

الثاني تحديد مجال حركة الجسم المتحرك

الثالث يوقف الحركة

الأخير يعيد تشغيل الحركة

0

شارك هذا الرد


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

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

0

شارك هذا الرد


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

كما ذكرت سابقا

يجب تفعيل stencilbuffer لتمكين رسم الظل

هناك عدة أشياء معطلة منها FullScreen

عند تفعيلها فان اللعبة تنفذ بكامل الشاشة

اذا علينا تخصيص الفئة Game بتحديد خصائصها عند الانشاء أي في New

   Imports Framework
Imports Framework.Irrlicht
Public Class myGame
Inherits Framework.Game
Private dwarf As New m_dwarf(Me)
Public Sub New()
MyBase.New(DriverType.Direct3D9, New Dimension2D(440, 380), 32, False, True, False, False)
Entities.Add(New Plane(Me))
Entities.Add(dwarf)
Entities.Add(New SkyBB(Me))
Entities.Add(New GameCam(Me))
Run()
End Sub
End Class

من جهة أخرى نسيت أذكر أنه لرسم كائن الظل لل AnimatedMeshSceneNode

نستعمل الدالة AddShadowVolumeSceneNode

لذلك نضيف السطر

perso.AddShadowVolumeSceneNode(0, False, 5)

طبعا داخل كود الفئة m_dwarf

0

شارك هذا الرد


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

السلام عليكم

كله تمام لكن انظر الصوره

post-45582-1204988890_thumb.jpg

ولى سؤال هل يمكن عمل ماء

0

شارك هذا الرد


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

الدالة

AddShadowVolumeSceneNode

تحدد ب3 برامترات

الأول معرف ID

البرامتر الثاني zfailmethod يعبر عن الطريقة التي يتم رسم بها الظل

القيمة الأخيرة يمكنك بها تدقيق رسم الظل

ربما في حالتك قد يفيدك زيادة القيمة الأخيرة للحصول على رسم دقيق للظل (مجرد تخمين )

بالنسبة للماء يمكن ذلك باستعمال AddWaterSurfaceSceneNode

ولرسم الماء نحتاج لمساحة مسطحة نربطها بها

مثلا نريد رسم الماء على الأرضية التي أنشأناها سابقا والتي استعملنا لانشائها المتغير hillmesh

نحدد بعدها الtexture

ونضيف خاصية الانعكاس للsceneNode


waterNode.Position = New Vector3D(0, 7, 0)
waterNode.SetMaterialTexture(0, driver.GetTexture("Stones.jpg"))
waterNode.SetMaterialTexture(1, driver.GetTexture("water.jpg"))
waterNode.SetMaterialType(MaterialType.Reflection2Layer)
waterNode.SetMaterialFlag(MaterialFlag.Lighting, False)
   Dim waterNode As SceneNode = smgr.AddWaterSurfaceSceneNode(hillmesh.GetMesh(0), 2, 800, 10, Nothing, -1)

0

شارك هذا الرد


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

السلام عليكم

مش عارف اشكرك ازاى

تخمينك فى محله المشكله اتحلت

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

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

0

شارك هذا الرد


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

بالنسبة للماء فلا أظن أن عملية الرسم له تحتاج لجعله ثلاثي الأبعاد

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

فقط علينا انشاء HillMesh آخر بأبعاد مختلفة عن الأول فقط

مجرد اقتراح

أنتظر اقتراحك في الموضوع

0

شارك هذا الرد


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

اعتقد ان لو عملنا السطح شفاف سوف يؤدى الغرض لكنى لا اعرف كيف اجعل السطح شفاف

0

شارك هذا الرد


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

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

waterNode.SetMaterialType(MaterialType.TransparentReflection2Layer)

post-23361-1205002804_thumb.jpg

طبعا مع اختيار أنسب للأكساء المناسب لان اللون الأخضر لا يعجبني نوعا ما :)

0

شارك هذا الرد


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

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

0

شارك هذا الرد


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

ربط شكل ما بالشخصية المتحركة

لربط شكل ما مع أي شكل آخر نقوم أولا بتحديد مكان الربط للشكل الآخر بتعريف ScenNode

وذلك باستخدام الدالة GetXJointNode للشكل الأساسي وهي ترجع لنا متغير من النوع SceneNode

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

Dim hand As SceneNode = perso.GetXJointNode("Bip01_R_Hand")

بعدها يمكننا ببساطة باضافة شكل آخر مربوط بهذا النود أو الSceneNode

Game.SceneManager.AddMeshSceneNode(mesh, hand, -1)

mesh هنا يعبر عن الشكل المحمل والذي يتم ربطه باليد (هنا اليد تعبر عن النود الأب وكنا عادة عند انشاء الشكل حر نجعل قيمته Nothing)

بعدها يترتب علينا رسم الشكل بشكل ملائم

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

أو نغير اتجاهه Rotation

قمت بتطبي مثال موضح في الصورة التالية

post-23361-1205079814_thumb.jpg

		 Dim clevemesh As Mesh = Game.SceneManager.GetMesh("cleve3ds/a3dcleve.3ds").GetMesh(0)
Dim hand As SceneNode = perso.GetXJointNode("Bip01_R_Hand")

Dim clevenode As SceneNode = Game.SceneManager.AddMeshSceneNode(clevemesh, hand, -1)
clevenode.SetMaterialFlag(MaterialFlag.Lighting, False)
clevenode.Scale = New Vector3D(5, 5, 5)
clevenode.Rotation = New Vector3D(0, 160, 90)
clevenode.Position = New Vector3D(70, 0, 40)
perso.AnimationSpeed = 500

الشكل المستعمل يمكنكم تحميله من المرفق

cleve3ds.zip

يالتوفيق

0

شارك هذا الرد


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

السلام عليكم بجد عاجز عن ايجاد كلام اقوله

لى سؤالين اعتقد انهم مرتبطين ببعض

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

2 كيف يمكن عمل كائن ثابت ويدور حولين نفسه

ارجو ان اكون قدرت اوضح ما اريد

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

اما فى هذا المحرك فأنا لا أعرف كيف يعمل الريندر

0

شارك هذا الرد


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

طبعا الدوران هنا يتم بتغيير الخاصية Rotation للشخصية

perso.Rotation = New Vector3D(0, y, 0)

طبعا y يعبر عن زاوية الدوران بالنسبة للمحور العيني

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

راجع هذه المشاركة وبها مثال مرفق عن تطبيق قوى الفيزياء على الكاميرا

يمكنك التغيير وجعل الكيان المربوط هو الشخصية

0

شارك هذا الرد


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

الحقنى يا DreamNet

ضيعت اليوم كله وانا بحاول اخلى الشخصيه تتصادم مع الكوره والصندوق بدل الكميره وفشلت فشل زريع،

ارفقتلك العك اللى انا عمله شوفلى الغلط فين وصلحهولى معلش انا عارف انى تعبتك معايا بس هانت،

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

______.rar

0

شارك هذا الرد


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

بالنسبة لثقل اللعبة فهو راجع للظل بعد تفعيله

هذه محاولة كنت قد عملتها قبل ولم يتسنى لي التعديل على مثالك

Mouvement.zip

تعديل على مثالك بدون ملفات الميديا

4.zip

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

شارك هذا الرد


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

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

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



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

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

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