السلام عليكم ورحمة الله وبركاته
في البداية الموضوع المنفول الطويل بعض الشئ وسأحاول قدر المستطاع اختصاره لذى قد يجد بعض الاخوة بعض النقاط الكثيرة الغير مشار إليها بالتفصيل في هذا الموضوع
فقط أردت أن أوجه المهتمين ببرمجة الألعاب لاختيار الطرق الأسهل بغض النظر عن معرفة مسبقة ودقيقة عن عالم برمجة الألعاب ومهما كانت لغة البرمجة المستعملة (هنا طبعا على الدوت نت أقصد )
الحديث الأساسي سيدور حول مكتبة تعتمد في الأساس على المحرك المشهور 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)
مرفق مثال لتطبيق الدرس
تحميل