الإعــلام الآلي والرياضيــات يشتمل على جميع مبادئ الإعلام الآلي والرياضيــات

قديم 15-01-2009, 04:34 PM
  #1
achraf.mouni
مشرف قسم
الكمبيوتر وتطوير المواقع والانترنت
مشرف قسم
الرياضيات والإعلام الآلي
 الصورة الرمزية achraf.mouni
 
تاريخ التسجيل: 08-09-2008
الدولة: الجزائر
المشاركات: 2,439
achraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداع
06 هل تريد أن تبرمج لعبة ثلاثية الأبعاد على الدوت نت



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

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

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

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

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


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

هذا كل شئ فقط هناك ملاحظة
عند تشغيل اللعبة باستدعاء الأجراء New في الفئة
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 ; 15-01-2009 الساعة 04:45 PM
achraf.mouni غير متواجد حالياً  
قديم 15-01-2009, 04:35 PM
  #2
achraf.mouni
مشرف قسم
الكمبيوتر وتطوير المواقع والانترنت
مشرف قسم
الرياضيات والإعلام الآلي
 الصورة الرمزية achraf.mouni
 
تاريخ التسجيل: 08-09-2008
الدولة: الجزائر
المشاركات: 2,439
achraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداع
افتراضي

نفتح مشروع جديد ونختار مشروع من النوع Console



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




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





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





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

وفي كود التشغيل في الmain نكتب


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

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

يمكنكم بعد تنفيذ المثال المرفق في المشاركة الأولى أن تحصلو على النتيجة التالية :
achraf.mouni غير متواجد حالياً  
قديم 15-01-2009, 04:35 PM
  #3
achraf.mouni
مشرف قسم
الكمبيوتر وتطوير المواقع والانترنت
مشرف قسم
الرياضيات والإعلام الآلي
 الصورة الرمزية achraf.mouni
 
تاريخ التسجيل: 08-09-2008
الدولة: الجزائر
المشاركات: 2,439
achraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداع
افتراضي

التعامل مع أحداث المحرك :
كل الأحداث داخل اللعبة يمكننا التقاطها من الحدث 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 غير متواجد حالياً  
قديم 15-01-2009, 04:36 PM
  #4
achraf.mouni
مشرف قسم
الكمبيوتر وتطوير المواقع والانترنت
مشرف قسم
الرياضيات والإعلام الآلي
 الصورة الرمزية achraf.mouni
 
تاريخ التسجيل: 08-09-2008
الدولة: الجزائر
المشاركات: 2,439
achraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداع
افتراضي




بعدما رأينا في التطبيق السابق كيفية تحضير المحرك للعمل وبعض الإضافات الصغيرة جدا
سنرى كيف نطبق بشكل مبسط المثال الموجود في ال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.AddZipFi leArchive("
map-20kdm2.pk3", True, True)
Dim mesh As AnimatedMesh = GameDevice.SceneManager.GetMes h("
20kdm2.bsp")
Dim node As SceneNode = GameDevice.SceneManager.AddOct TreeSceneNode(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 غير متواجد حالياً  
قديم 15-01-2009, 04:37 PM
  #5
achraf.mouni
مشرف قسم
الكمبيوتر وتطوير المواقع والانترنت
مشرف قسم
الرياضيات والإعلام الآلي
 الصورة الرمزية achraf.mouni
 
تاريخ التسجيل: 08-09-2008
الدولة: الجزائر
المشاركات: 2,439
achraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداع
افتراضي

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






أول شئ يجب ذكره أن مجسم الأرض ملف 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 غير متواجد حالياً  
قديم 15-01-2009, 04:37 PM
  #6
achraf.mouni
مشرف قسم
الكمبيوتر وتطوير المواقع والانترنت
مشرف قسم
الرياضيات والإعلام الآلي
 الصورة الرمزية achraf.mouni
 
تاريخ التسجيل: 08-09-2008
الدولة: الجزائر
المشاركات: 2,439
achraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداع
افتراضي

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

مثل ما رأينا في السابق نبدأ بانشاء كلاس للعبة أو المثال والتي تكون موروثة من الفئة 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 غير متواجد حالياً  
قديم 15-01-2009, 04:38 PM
  #7
achraf.mouni
مشرف قسم
الكمبيوتر وتطوير المواقع والانترنت
مشرف قسم
الرياضيات والإعلام الآلي
 الصورة الرمزية achraf.mouni
 
تاريخ التسجيل: 08-09-2008
الدولة: الجزائر
المشاركات: 2,439
achraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداع
افتراضي

في الألعاب يتم فقط رسم صندوق للسماء يكون ثابت وبما أنه صندق أي مكعب فهو يحتوي 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 غير متواجد حالياً  
قديم 15-01-2009, 04:39 PM
  #8
achraf.mouni
مشرف قسم
الكمبيوتر وتطوير المواقع والانترنت
مشرف قسم
الرياضيات والإعلام الآلي
 الصورة الرمزية achraf.mouni
 
تاريخ التسجيل: 08-09-2008
الدولة: الجزائر
المشاركات: 2,439
achraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداع
افتراضي

اليوم فسنتطرق إلى طريقة رسم الأرضية:



نلاحظ في الصورة أننا أنشأنا سطح أو لأرضية وعملنا له كساء ووضعنا مكعب فوقها
يعني العملية ستكون بسيطة والشئ الجديد عنا في هذا التطبيق هو كيف نعمل سطح أرضية
باستعمال 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 غير متواجد حالياً  
قديم 15-01-2009, 04:39 PM
  #9
achraf.mouni
مشرف قسم
الكمبيوتر وتطوير المواقع والانترنت
مشرف قسم
الرياضيات والإعلام الآلي
 الصورة الرمزية achraf.mouni
 
تاريخ التسجيل: 08-09-2008
الدولة: الجزائر
المشاركات: 2,439
achraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداعachraf.mouni عضو محترف الابداع
افتراضي

تطبيق آخر





نريد الآن أن نتعلم كيف نضيف كيان متحرك من أجل ذلك نستمعل الكيان المعروف 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
achraf.mouni غير متواجد حالياً  

الكلمات الدلالية (Tags)
لعبة, الأبعاد, الجنة, ثلاثية, تبرمج, تريد

أدوات الموضوع
انواع عرض الموضوع

تعليمات المشاركة
لا تستطيع إضافة مواضيع جديدة
لا تستطيع الرد على المواضيع
لا تستطيع إرفاق ملفات
لا تستطيع تعديل مشاركاتك

BB code is متاحة
كود [IMG] متاحة
كود HTML معطلة

الانتقال السريع

المواضيع المتشابهه
الموضوع كاتب الموضوع المنتدى مشاركات آخر مشاركة
رسومات ثلاثية الأبعاد على الرصيف رااائعة آلاء الرحمن منتدى الهوايات والمواهب الفنية 20 23-08-2012 05:28 AM
لعبة الشطرنج ثلاثية الأبعاد للتحميل مجانا WADDAH الألعاب Games 28 27-05-2012 08:20 PM
الجزيرة تبث كأس العالم بتكنولوجيا ثلاثية الأبعاد WADDAH قنــاة المهـندس الرياضيــة 3 17-02-2010 03:12 PM
درس عمل قطرات ماء ثلاثية الأبعاد Cinema 4D SOLDIER_DZ التصميم و الجرافيكس 1 06-10-2008 06:45 AM
للتصميمات ثلاثية الأبعاد Google SketchUp 5.0.305 زنيني منتدى البرامج العام 4 26-07-2008 10:31 AM


الساعة الآن 12:47 AM.
Powered by vBulletin® Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. , TranZ By Almuhajir