هل تريد أن تبرمج لعبة ثلاثية الأبعاد على الدوت نت

achraf.mouni

  • Hero Member
  • *****
    • مشاركة: 2439
    • مشاهدة الملف الشخصي
    • البريد الالكتروني
في: كانون الثاني 15, 2009, 03:34:14 مسائاً
   
السلام عليكم ورحمة الله وبركاته

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

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

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

المكتبة هي IrrlichtFramework
تحميل المكتبة
المكتبة مفتوحة المصدر ومكتوبة بالسي شارب وهي عبارة عن تغليف للمكتبة Irrlicht
على العموم فقط الآن يهمنا هذه الملفات الضرورية لتشغيل المكتبة
   



 

من المستحسن نسخ الملفات كل الملفات ماعدا IrrlichtFramework.dll إلى ملف الsystem32 كي لا نضطر دائما إلى نسخهم إلى مجلد الbin للمشروع

عند إدراجنا لمرجع المكتبة الموجود في الملف IrrlichtFramework.dll  سنرى أنها تحمل 5 فضاءات للأسماء
فضائين موجودين أصلا في المحرك  irrlichtCP  و وفضائي  الصوت والفيزياء وفضاء للإطار المشترك بينهم
يوفر فضاء الإطار المشترك Framework (ليس هو الفريمورك للدوت نت
) فئات مشتركة خصوصا فئات الأحداثيات التي تغنينا عن التحويل لتوحيد معايير القياس بين فضاءات الأسماء الأخرى وفئين خاصين وفرهما صاحب المكتبة لتسهيل الكود وللاستفادة من مميزات الوراثة هما game و entity

الفئة
Game : وتحمل جميع متغيرات اللعبة وهي قابلة للوراثة
الفئة
Entity : تقوم بتحميل كل كيانات داخل اللعبة وهي عبارة عن collection

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

     
                          كود PHP:
     
                      Public Class myGame
    Inherits Framework
.Game

End
Class  
             

               

لآن يمكن استدعاء دوال الفئة بعد وراثتها
الآن يمكننا تجهيز لعبتنا انطلاقا من هذه الفئة علينا فقط إدراج الأمر للتشغيل عند انشاء هذه الفئة لذلك يجب اضافة new

     
                          كود PHP:
     
                      Public Sub New()
       
Run()
 
End Sub  
             


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


     
               كود PHP:
     
                      Dim test As myGame = New myGame  
             

               

شغل البرنامج فقط وسترى

لقد كتبنا 3 أسطر فقط
الآن نريد أن نضيف كائن داخل اللعبة بعد اضافة كاميرا وهنا نريد الاستفادة من الفئة Entity والتي يجب توريثها مثلها مثل الفئة [/SIZE][/FONT]     Game
مثلا نريد اضافة مكعب داخل اللعبة لذلك نقوم باضافة class جديدة لبرنامجنا ولنسميها مثلا mBox

     
                          كود PHP:
     
                      Imports Framework
Imports Framework
.Irrlicht
Public Class mBox
    Inherits Framework
.Entity
   
Private m_node As SceneNode = Nothing
   
Public Sub New(ByVal mgame As Game)
       
MyBase.New(mgame)
       
Dim texture As Texture = Game.VideoDriver.GetTexture("box.png")

       
m_node = mgame.IrrlichtDevice.SceneManager.AddCubeSceneNode(19, Nothing, -1)
       
m_node.SetMaterialFlag(MaterialFlag.Lighting, False)
       
m_node.SetMaterialTexture(0, texture)
       
m_node.Position = New Vector3D(10, -10, 70)
   
End Sub
End
Class  
             

               

ماقمنا بعمله هو فقط انشاء مكعب داخل اللعبة ولو لاحظتم أن عند الانشاء في الإجراء New توجب علينا ادراج متغير من النوع Game لكي يتم اضافتها داخل اطار اللعبة المنشئة طبعا
نرجع إالى فئتنا [/SIZE][/FONT] myGame لكي نرى كيف نضيف هذا الكيان للعبة
طبعا قبل اضافته نضيف كاميرا أولا ثم نستعمل الخاصية Entities والتي هي مجموع الكيانات المحتواة داخل اللعبة لاضافة الكيان الجديد mBox الذي انشئناه

     
                           كود PHP:
     
                      SceneManager.AddCameraSceneNodeFPS(Nothing, 300, 300, False)
 
Entities.Add(New mBox(Me))  
             

               

ثم نشغل اللعبة Run

هذا كل شئ فقط هناك ملاحظة
عند تشغيل اللعبة باستدعاء الأجراء New في الفئة [/SIZE][/FONT] myGame لم نحدد خصائصها لذلك يتم التشغيل بالخصائص الافتراضية والتي هي OpenGL و أبعاد (640, 480) يمكننا تغيير هذه الخصائص باعادة صياغة الفئة باضافة تعديل بسيط

 
     كود PHP:
     
                      Public Sub New(ByVal dtype As DriverType)
       
MyBase.New(dtype, New Dimension2D(640, 480), 32, False, False, False, False)

       
SceneManager.AddCameraSceneNodeFPS(Nothing, 300, 300, False)
       
Entities.Add(New mBox(Me))
       
Run()
End Sub  
             


هنا يجب اعادة كتابة انشاء الفئة بتحديد نوع drivetype

 
     كود PHP:
     
                      Dim test As myGame = New myGame(Framework.Irrlicht.DriverType.Direct3D9)  
             


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

تحميل


achraf.mouni

  • Hero Member
  • *****
    • مشاركة: 2439
    • مشاهدة الملف الشخصي
    • البريد الالكتروني
رد #1 في: كانون الثاني 15, 2009, 03:35:03 مسائاً
    نفتح مشروع جديد ونختار مشروع من النوع Console



بعدها نضيف مرجع المكتبة التي سنعمل بها عن طريق Add Reference




نختار الملف الذي يحوي مرجع المكتبة الا وهو irrlichtframework





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





نكتب داخل الكلاس أو الفئة المضافة الكود التالي :
     
            كود PHP:
    
                 Public Class myGame
    Inherits Framework
.Game
   
Public Sub New()
       
Run()
   
End Sub
End
Class  
           

     [/SIZE]
 وفي كود التشغيل في الmain نكتب

     
         كود PHP:
    
                 Dim test As myGame = New myGame  
           

[/SIZE] نشغل المثال , فسنلاحظ انشاء نافذة بسيطة لم يرسم عليها شئ بعد

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


achraf.mouni

  • Hero Member
  • *****
    • مشاركة: 2439
    • مشاهدة الملف الشخصي
    • البريد الالكتروني
رد #2 في: كانون الثاني 15, 2009, 03:35:18 مسائاً
    التعامل مع أحداث المحرك :
كل الأحداث داخل اللعبة يمكننا التقاطها من الحدث IrrlichtDevice.OnEvent ومن أجل ربطها باجراء معين نستعمل Addhandler

     
            كود PHP:
    
                 AddHandler IrrlichtDevice.OnEvent, AddressOf OnEvent  
           

     

علينا هنا انشاء اجراء أو دالة اسمها OnEvent
     
     
            كود PHP:
    
                 Private Function OnEvent(ByVal ev As [Event]) As Boolean
   
If ev.Type = EventType.KeyInputEvent And ev.KeyCode = KeyCode.Escape Then
       IrrlichtDevice
.Close()
   
End If
End Function  
           


الكود يقوم بترقب حدث الضغط على الزر Escape ليقوم باغلاق المحرك (اي انهاء اللعبة)


كما أن المحرك يسهل لنا الوصول مباشرة إلى إسم المفتاح المضغوط عن طريق قراءة القيمة ev.KeyCode



achraf.mouni

  • Hero Member
  • *****
    • مشاركة: 2439
    • مشاهدة الملف الشخصي
    • البريد الالكتروني
رد #3 في: كانون الثاني 15, 2009, 03:36:26 مسائاً



بعدما رأينا في التطبيق السابق كيفية تحضير المحرك للعمل وبعض الإضافات الصغيرة جدا
سنرى كيف نطبق بشكل مبسط المثال الموجود في الSDK والذي يخص مشهد اللعبة الشهيرة quake3
لذلك نحتاج أولا أن نحدد وجود الملف map-20kdm2.pk3 الموجود في المجلد media الملف مضغوط ويحتوي على تجسيد المشهد من كسائات وملفات لازمة لرسم المشهد

تحمبل ملف المشهد

بعد اضافة المرجع الخاص للمكتبة والملفات الضرورية
ننشئ كيان جديد
  Entity (حتى نستفيد من خصائص التي تقدمها المكتبة) نحمل فيه مشهد الquake3
أول خطوة طبعا نضيف كلاس جديدة وليكن اسمها مثلا quake3 مووروثة من الفئة
Entity
طبعا يجب اضافة كود الانشاء للكلاس في New لكن مع مراعاة اسناده للفئة الأساسية التي تم توريثها منها باستعمال mybase

يجب أن تكون الكلاس الناتجة على الشكل التالي :
   كود PHP:
    
                 Imports Framework
Imports Framework
.Irrlicht
Public Class Quake3
    Inherits Entity

   
Public Sub New(ByVal myGame As Game)
       
MyBase.New(myGame)
       
Dim GameDevice As IrrlichtDevice = myGame.IrrlichtDevice
        GameDevice
.FileSystem.WorkingDirectory = "C:\irrlicht-1.3.1\media\"
        GameDevice.FileSystem.AddZipFileArchive("
map-20kdm2.pk3", True, True)
        Dim mesh As AnimatedMesh = GameDevice.SceneManager.GetMesh("
20kdm2.bsp")
        Dim node As SceneNode = GameDevice.SceneManager.AddOctTreeSceneNode(mesh.GetMesh(0), _
                                                                          Nothing, 0, 128)
    End Sub
End Class  
           

 ماقمنا به هو انشاء كيان جديد يقوم باضافة مشهد quake3 الموجود في الملف المضغوط map-20kdm2.pk3 باستعمال الدالة AddZipFileArchive

لتحميل المشهد نحتاج إلى كائن من النوع SceneNode الذي سنمرر له الmesh الذي حملناه ونستطيع عمل ذلك بطريقتين مختلفتين إما AddOctTreeSceneNode أو AddAnimatedMeshSceneNode
حسب الحاجة فالأولى تحمل المشهد جزئيا فقط يعني سيتم رسم فقط الأجزاء المرئية من الmesh والثانية تقوم بتحميل الكل وهنا نرى أن لنا الخيار فقط نحتاج فقط إلى تحميل الأجزاء المرئية داخل المشهد لتحسين الآداء في بعض المشاهد
لكن في البعض قد يجب تحميل الmesh كاملا خاصة إذا كان متحرك

بنفس الطريقة ننشئ كيان يقوم اضافة الكاميرا إلى المشهد ونسمي الكلاس المنشئة مثلا: GameCam
   كود PHP:
    
                 Imports Framework
Imports Framework
.Irrlicht
Public Class GameCam
    Inherits Entity
   
Public Sub New(ByVal myGame As Game)
       
MyBase.New(myGame)
       
Dim cam As CameraSceneNode = myGame.SceneManager.AddCameraSceneNodeFPS(Nothing _
                                                                                       
, 250, 250, False)
       
cam.Position = New Vector3D(200, 850, 0)
       
cam.Rotation = New Vector3D(30, 50, 0)

   
End Sub
End
Class  
           

 لاضافة الكائنين داخل اللعبة طبعا يجب أن تكون هناك فئة مووروثة من الكائن Game كما رأينا في
السابق
   كود PHP:
    
                 Public Class myGame
    Inherits Framework
.Game
   
Public Sub New()
       
IrrlichtDevice.WindowCaption = "Quake 3 Level Sample With IrrlichtFramework"
       
Dim quakeLevel As New Quake3(Me)
       
Dim myCamera As New GameCam(Me)
       
Entities.Add(quakeLevel)
       
Entities.Add(myCamera)
       
Run()
   
End Sub
End
Class  
           

  تحميل المثال

لا تنسوا نسخ ملف المشهد بعد فك ضغطه map-20kdm2.pk3 داخل مجلد bin\Debug للمثال


achraf.mouni

  • Hero Member
  • *****
    • مشاركة: 2439
    • مشاهدة الملف الشخصي
    • البريد الالكتروني
رد #4 في: كانون الثاني 15, 2009, 03:37:23 مسائاً
   
اليوم سنعمل على تطبيق حركة دوران على جسم ديركت اكس
الجسم هو عبارة عن مجسم للأرض نقوم بعرضه داخل المشهد المنشئ وتدويره






   
أول شئ يجب ذكره أن مجسم الأرض ملف directx اسمه earth.x إذا الخطوة الأولى هي تحميل هذا الملف داخل المشهد
بنفس الطريقة التي رأيناها في المثال السابق نعمل على تعريف mesh مربوط بالملف الذي ذكرناه
   كود PHP:
    
                 Dim mesh As AnimatedMesh = GameDevice.SceneManager.GetMesh("earth.x")  
           


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

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


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

     
   كود PHP:
    
                 node.SetMaterialFlag(MaterialFlag.Lighting, False)  
           


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

     
   كود PHP:
    
                 Dim anim As Animator = GameDevice.SceneManager.CreateRotationAnimator(New Vector3D(0, 0.2F, 0))  
           


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


     
   كود PHP:
    
                 node.AddAnimator(anim)  
           


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

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


achraf.mouni

  • Hero Member
  • *****
    • مشاركة: 2439
    • مشاهدة الملف الشخصي
    • البريد الالكتروني
رد #5 في: كانون الثاني 15, 2009, 03:37:47 مسائاً
    المكتبة كما قلنا توفر اطار متكامل لمن يريد برمجة لعبة فهي توفر كل وسائل الرسم الفيزياء والصوت
بعدما رأينا بعض الطرق للرسم نتطرق بشكا موجز لاستعمال الصوت اليوم

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

ننشئ Entity تحمل مكعب يدور ويمثل بالنسبة لنا مصدر الصوت  SoundSource
وننشئ Entity أخرى تحمل كاميرا وتمثل بالنسبة لنا العنصر المستمع Listener

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

الفئة الخاصة بكيان المكعب ستكون بالشكل التالي

     
                         كود PHP:
    
                 Imports Framework
Imports Framework
.Irrlicht
Imports Framework
.OpenAL
Public Class sBox
    Inherits Entity
   
Private m_cube As SceneNode = Nothing
   
Private m_sound As SoundSource = Nothing
    Sub
New(ByVal g As Game)
       
MyBase.New(g)
       
m_cube = g.SceneManager.AddCubeSceneNode(30, Nothing, -1)
       
m_cube.SetMaterialTexture(0, g.VideoDriver.GetTexture("box.png"))
       
m_cube.SetMaterialFlag(MaterialFlag.Lighting, False)
       
m_cube.AddAnimator(g.SceneManager.CreateFlyCircleAnimator(New Vector3D(), 200, 0.001))
       
m_sound = New SoundSource(New SoundBuffer("mono.wav"), 100, 2000)
       
m_sound.Looping = True
        m_sound
.Play()
   
End Sub
    Overrides Sub Update
(ByVal time As Single)
       
m_sound.Position = m_cube.Position
    End Sub
    Overrides Sub Dispose
()
       
m_cube.Dispose()
       
m_sound.Dispose()
   
End Sub
End
Class  
           

               

أما الكيان المستمع والذي يمثل الكاميرا تكون بالشكل    

     
                         كود PHP:
    
                 Imports Framework
Imports Framework
.Irrlicht
Imports Framework
.OpenAL
Public Class mCam
    Inherits Entity
   
Private cam As CameraSceneNode
    Sub
New(ByVal g As Game)
       
MyBase.New(g)
       
g.IrrlichtDevice.CursorControl.Visible = False
        g
.IrrlichtDevice.WindowCaption = "IrrlichtFramework Audio Test"
       
cam = g.SceneManager.AddCameraSceneNodeFPS(Nothing, 300, 300, False)
   
End Sub
    Overrides Sub Update
(ByVal time As Single)
       
Dim Listener As Listener = New Listener()
       
Listener.Position = cam.Position
        Listener
.Orientation = New Orientation(cam.Target - cam.Position, cam.UpVector)
   
End Sub
End
Class  
           

               

لو رجعنا إلى الكود قليلا سنجد أننا لانشاء مصدر صوت استعملنا الفئة SoundSource لتعريف متغير يقوم بتشغيل الملف الصوتي وربطنا مكانه بالمكعب في السطر

     
          كود PHP:
    
                 m_sound.Position = m_cube.Position  
           


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

نرجع إلى الفئة myGame ستتكلف باضافة الكيانين (الكاميرا والمكعب ) داخل اللعبة
   
     
                         كود PHP:
    
                 Imports Framework
Public Class myGame
    Inherits Game
   
Public Sub New()
       
Entities.Add(New mCam(Me))
       
Entities.Add(New sBox(Me))
       
Run()
   
End Sub
End
Class  
           


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


achraf.mouni

  • Hero Member
  • *****
    • مشاركة: 2439
    • مشاهدة الملف الشخصي
    • البريد الالكتروني
رد #6 في: كانون الثاني 15, 2009, 03:38:35 مسائاً
    في الألعاب يتم فقط رسم صندوق للسماء يكون ثابت وبما أنه صندق أي مكعب فهو يحتوي 6 أوجه
لذلك سنحتاج إلى 6 صور للسماء تربط لتكوين هذا الصندوق

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



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

الكلاس التي ستقوم بانشاء السماء نسميهل مثلا SkyBB وتكون كيان طبعا نضيفه داخل اللعبة
   
     
 
   كود PHP:
    
                 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  
           


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


achraf.mouni

  • Hero Member
  • *****
    • مشاركة: 2439
    • مشاهدة الملف الشخصي
    • البريد الالكتروني
رد #7 في: كانون الثاني 15, 2009, 03:39:37 مسائاً
    اليوم فسنتطرق إلى طريقة رسم الأرضية:



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



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

طبعا لتحديد الكساء هنا ننشئ كائن Material ندرج فيه الtexture للأرضية (هنا فقط سأدرج كساء واحد وليس متعدد ) وقد استعملت ككساء الملف الموجود مع المحرك وهو rockwall.bmp
  1- اسم السطح أو التل إذا صح التعبير (غير مهم الآن) 2-حجمه يعني هنا مساحته لانه سياخذ متغير من النوع  dimension2df  
                 كود PHP:
    
                 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 على الأقل لأنه بدون تحديد مكانها فسوف تظهر لأول مرة مع نفس مستوى الأرضية المنشئة يمكننا اضافة صندوق السماء كما رأينا في السابق للحصول على الشكل التالي


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


achraf.mouni

  • Hero Member
  • *****
    • مشاركة: 2439
    • مشاهدة الملف الشخصي
    • البريد الالكتروني
رد #8 في: كانون الثاني 15, 2009, 03:39:56 مسائاً
    تطبيق آخر





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

بكل بساطة يتم اضافة الأشكال التي تعمل حركات باستعمال متغير  AnimatedMeshSceneNode
باستعمال الدالة AddAnimatedMeshSceneNode الموجودة في الكائن SceneManager

نضيف كلاس نسميها m_dwarf للمشروع
        الرمز PHP:
     
            كود PHP:
    
                 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

تحميل الكيان مع اكسائها من هنا
لا تنسوا نسخ الملفات داخل المجلد الموجود فيه الملف التنفيذي debug