الكتاب الجديد في شرح التعامل مع الملفات وبرمجة الالعاب ثلاثية البعد Truevision انس ابراهيم انيس محفوظ
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
٢تمیز مع الفیجوال بیسك أنس إبراھیم أنیس محفوظ :المؤلف
لھا ومیسر مبسط وشرح المختلفة الملفات مع یتناول الكتاب التعامل الجدید الموضوع إلى ضافةباإل والمصفوفات المتغیرات إلى والتعرف
یشتمل كما مختلفة، محركات باستخدام لعاباأل برمجة وھو أال الممیز .الكتاب مع مرفقة للشروح مختلفة أمثلة على الكتاب
2014
األردن - عمان حقوق الطبع والنشر محفوظة للمؤلف
:اإلھداء
بجھدھا وعنایتھا أھدي كتابي ھذا إلى أمي الغالیة التي لم تبخل علي یوما
، وإلى شقیقي أحمد الذي طالما كما أھدیھ إلى أبي العزیز الذي یساندني دوما
.وقف إلى جانبي وقدم لي الكثیر من أفكاره وآرائھ الثریة والغنیة
من وال یفوتني أن أھدي ھذا الكتاب إلى كل طالب علم یسعى إلى االستفادة
، وإلى كل مصمم العالم الواسع الذي یفتحھ لھ برنامج الفیجوال بیسك
.وألعابھ برامجھیھدف إلى تطویر عملھ وومبرمج
تدقیــــق وفحــص
ابراھیـم انیس محفوظ.أ
المقدمة
البدء ومن ھذا الكتاب والحمد قررت العمل األولىبعد نجاح النسخة
من هللا أنبكتابة النسخة الثانیة كي تكون مكملة لسابقتھا تفید البعض راجیا
احترافھ إلىواالنتقال من عتبة الفیجوال بیسك األمورفي فھم بعض
.والتمیز فیھ
ن هللا تعالى مواضیع مھمة ومختلفة إذتناول بنسوف اإلصدارھذه في
سوف تجعل القارئ یشعر بمتعة التطبیق والبرمجة من جھة والتعلم من
.خرىأجھة
وشرح مبسط ،عن التعامل مع الملفات المختلفةھذا الكتاب في تحدث نس
باستخدام محركات مختلفة، كما لعاباألال وھو برمجة أالجدید الممیز
.مثلة مختلفة للشروح مرفقة مع الكتابأ یشتمل الكتاب على
ي .ذن هللا عزوجل بإ إعجابكمینال ھذا الكتاب أن أمل كل
القصدوهللا من وراء
الفھرس
ن نبدأ أقبل یلزمماذا :التمھید -
:الوحدة التاسعة
مھمةالمتفرقات الالتعامل مع الملفات و
)١(التعامل مع الملفات -١ )٢(التعامل مع الملفات -٢ جیدةالبدایة الوفات وفالمص -٣ )١(دوال متنوعة مھمة -٤ )٢(دوال متنوعة مھمة -٥
: العاشرة الوحدة
لعاباألالبدایة في برمجة
ومحركاتھا لعاباألنبذة عن برمجة -١ للعمل TrueVision3Dعداد محرك إ -٢ )HelloWorld(برمجة رسالة -٣ لتسھیل العمل Class Moduleعداد إ -٤ كسائھا وتعدیلھاإو Meshمجسمات إضافة -٥ وتعدیلھا Mdlمجسمات إضافة -٦ )Terrain( رضاأل إضافة -٧ )SkyBox(السماء مكعب إضافة -٨ )Camera Control 1(بالكامیرا التحكم -٩
)Camera Control 2(التحكم بالكامیرا -١٠ )Movement&Collision1(والتصادم الحركة -١١ )Movement&Collision2(والتصادم الحركة -١٢ Bspخرائط إضافة -١٣
)١(تطبیقات متنوعة -١٤ )٢(تطبیقات متنوعة -١٥ )١(عمل لعبة بسیطة -١٦ )٢(عمل لعبة بسیطة -١٧ )٣(عمل لعبة بسیطة -١٨ لتطبیقات مستقبلیة فكار متنوعة أ -١٩
:ن نبدأأ قبل ماذا یلزمنا
ذا إما أ ٦لمام البسیط بلغة الفیجوال بیسك إلال یتطلب منك الكثیر سوى ا
كنت ضعیف من األولىما في ھذه اللغة یمكنك القیام بتحمیل النسخة حد إلى ا ھذا الكتاب فھي تحمل شرح جید ا وكاف ا للغة یا
یمكنك التحمیل من ھنا و ،مثلةمدعم باألوالكتاب مجاني http://www.kutub.info/library/book/6493
نترنت إل یمكنك تحمیل الكتب المختلفة من مختلف المواقع على اأو
بزیارة الموقع التالي لتحمیل الكتب أنصح وشخصیاhttp://www.kutub.info/
اذا لم تكن االمثلة والبرامج المساعدة مرفقة مع الكتاب یجب ::مھم جدا .علیك القیام بتحمیلھا من الروابط التالیة
وف تھمنا بعد التقدم وتتناول موضوعات س ،جیدة في المصفوفاتكانت ھذه مقدمة .في ھذه المادة
.نترنت المختلفةإلكثر من خالل زیارة مواقع اأ یمكنك االطالع
)٣( ن المثال مرفق مع الكتاب باسم المثالأ تذكر
)١(دوال متنوعة ومھمة : الدرس الرابع
العملیات الریاضیة تؤدي وتلعب دورا مھم من التعرف على بد في البرمجة لذلك ال االدوال المتعلقة بھذه العملیات، لذلك ھذا الدرس سیكون مخصصا للحدیث عن ھذه
.لة حسابة تشمل ھذه الدوال كتطبیق على ھذا الدرسآوبعدھا عمل .الدوال
Sinدالة الجیب
استخدام جمیع إن ھذه الدالة تستخدم في الحصول على جیب زایة ما واستخدامھا بل :ویكون على النحو التالي ،ماالدوال الحسابیة سھل نوعا
X = sin(angle الزاویة)
Cosدالة جیب التمام
:یجاد جیب تمام الزاویة واالستخدامإمثل سابقتھا لكن تستخدم في
X = Cos(angle)
Tanدالة ظل الزاویة
یجاد ظل الزاویة كما یمكن إھذه الدالة فتقوم بأما حسابھ من خالل الدالتین أیضاویكون استخدام ھذه ،جیب التمام/الجیب= السابقتین باستخدام العالقة الریاضیة الظل
:الدالة على النحو التالي
X = tan(angle)
Absدالة القیمة المطلقة
مثال لو كان داخلھا ،عدد الذي یوجد داخلھالعطاء القیمة المطلقة لإھذه الدالة تقوم ب :استخدامھا فھو كباقي الدوالأما وھكذا، ٢٥سیكون ناتج القیمة المطلقة ٢٥ –العدد
X = abs(number)
Roundقرب منزلة عشریة أ إلىدالة التدویر
قرب منزلة عشریة یحددھا المبرمج مثال لو كان أ إلىھذه الدالة ستقوم بتدویر الرقم قرب منزلتین عشریتین سیكون ناتج أ إلىراد المبرمج تدویره أو 12.276الرقم
استخدام الدالة یختلف قلیال عن باقي الدوال فیكون على النحو . 12.28التدویر :التالي
X = round( الرقم المراد تدویره, لیھاإ رعدد المنازل المراد التدوی )
مالحظة مھمة النظام المستخدم في قیاس الزوایا في الدوال السابقة :جدا)tan,sin,cos ( ھو النظام الدائريRadian) (خدم قیم تن تسأ وعلیھ یجبPi
:النظام الستیني عن طریق العالقة التالیة إلىویمكنك التحویل ،لتحدید الزاویة
X= ang * pi / 180
كما سوف یوضح المثال التالي الفكرة
)٣(المثال
،قیم الجیب وجیب التمام وظل الزاویة إیجادفي ھذا المثال سنصنع االلة حاسبة تقوم بمنزلة عشریة إلىتقریب عدد ما إلى ضافةعداد باإلالقیمة المطلقة لأل إیجادقوم بنكما
.واحدة
.مشروع جدید علیھ إنشاءو ٦الفیجوال بیسك برنامجنقوم في البدایة بتشغیل
:كالتالي) Form(ج نجعل شكل النموذ
:ولیكن واألعداد،نقوم في البدایة بتعریف المتغیر الذي سوف یحمل قیمة الزاویة
Dim Xnumber(0 to 4)
وحدات لتخزین طبعا یمكننا استخدام متغیر ٥نھ على شكل مصفوفة تحمل أ نالحظباستخدام متغیر واحد لكل عملیة مورفضل الترتیب في مثل ھذه األأ واحد لكن
نھ تطبیق لما أ كما ،سوف یساعد في الرجوع وتطویر البرنامج الحقا ألنھمنفردة .تعلمناه في الدرس السابق
) pi(ن نقوم بتعریف المتغیر الذي سوف یحمل قیمة باي أ یجب ذلك وبعد
Dim Pi as single
مة باي وذلك لتحدید قیForm_Load نضع الكود التالي في
Pi = 22 / 7
) sin )Command1نقوم بوضع الكود التالي داخل الزر
Xnumber(0) = Sin(Val(Text1.Text) * Pi / 180)
MsgBox Xnumber(0)
مالحظة مھمة
لذلك ،ن یكون عددأ یجب) Sin,Cos,Tan,Abs,Round(داخل ھذه الدوال .عدادأ إلىلتحویل ما بداخلھا من سلسلة نصیة Valنستخدم دالة
:تفسیر الكود
نھ قمنا أ الحظ ،قیمة جیب الزاویة Xnumber(0)یحمل المتغیر : األولالسطر النظام الستیني عن طریق العالقة الواردة إلىبتحویل الزاویة من النظام الدائري
ن النظام الستیني یعتبر مفھومأذ إ ،سابقا .كثر من قرینھ الدائريأ لدى المستخدم ا
.رسال رسالة للمستخدم تحمل قیمة الجیب للزاویةإ :الثانيالسطر
ن قیم جیب الزاویة تكون دقیقة أ كما یمكنك المالحظة لكن یمكنك تقریب الزاویة جدا :وسوف یكون شكل الكود كالتالي Roundباستخدام الدالة
Xnumber(0) = Round(Sin(Val(Text1.Text) * Pi / 180), 2)
.قرب منزلتین عشریتین أ إلىریب نھ تم التقأ نالحظ
)Cos(نقوم بوضع الكود التالي في زر جیب التمام
Xnumber(1) = Round(Cos(Val(Text1.Text) * Pi / 180), 2)
MsgBox Xnumber(1)
.xnumber(1)ن المتغیر أ تفسیر الكود مثل سابقھ لكن الحظ
.الظل إیجادخرى في أ نقوم بتكرار العملیة مرة
Xnumber(2) = Round(Tan(Val(Text1.Text) * Pi / 180), 2)
MsgBox Xnumber(2)
نقوم .لقیمة المطلقة للعدد المدخلا یجادإل Absبوضع الكود التالي في زر أیضا
منزلتین عشریتین إلىنھ تم استخدام دالة التقریب أال إھذا الكود یشبھ سابقھ
:شكل الكود النھائي
.ن المثال مرافق مع الكتابأتذكر
)٢(دوال متنوعة :الثانيالدرس
استخدام دوال إلىنما قد یتعداه إو ،لن یكتفي المبرمج باستخدام الدوال الریاضیة .وھذا ما سنشرحھ في ھذا الدرس ،خرى مثل دوال مقارنة البیانات والبحث وغیرھاأ
Str سالسل نصیة إلى واألرقام األعداددالة تحویل
ھذه دالة مھمة قیمة نصیة إلىیجب تحویل قیمة رقمیة األحیانفي بعض ،جداسوف . األعدادھذه العملیات على إجراءیصح عملیات مختفلة علیھا ال إلجراء
شكلھا فیكون أما .تتعرف قیمة ھذه الدالة عن التقدم في الفیجوال بیسك بشكل عام :كالتالي
A = str(number)
Midدالة تأخذ جزءا من سلسة نصیة
ن تحدد مكان بدء السلسلة المراد أذ یجب علیك إھ عمل ھذه الدالة بعملیة القص شب أویكون شكلھا ،خر القیمةآخذ متغیر أوبعدھا سوف ی ،خذ قیمتھا وعدد الحروفأ
:كالتالي
A =mid(Text,startموقع البدایة,Length الطول(
ن ناخذ أردنا أال لو ن موقع البدایة یشمل رقم الحرف المراد البدایة من عنده مثأالحظ :سیكون الشكل كالتالي Ahmedخیرین من كلمة الحرفین األ
A = mid("ahmed",3,2)
Lenعدد الحروف في السلسلة النصیة إیجاددالة
دالة بسیطة وسیكون لھا فائدة كبیرة خاصة عند برمجة برامج تعمل على نقل بیانات :وشكلھا كالتالي ،تحویلھاأو
A = len(string)
Trimدالة حذف الفراغات
:شكلھا یكون كما یلي
A = trim(string)
Ucase & Lcaseتحویل شكل الحروف ادالت
:حیث ان یفترض معرفتھا من قبل المبرمج،دالت
:وشكلھا ،كبیرة إلىنجلیزیة من صغیرة إلتحول الحروف ا Ucase الدالة
A = ucase(string)
:وشكلھا ،صغیرة إلىنجلیزیة من كبیرة إلتحول الحروف ا Lcaseالدالة
a = lcase(string)
StrCompدالة المقارنة بین السالسل النصیة
دالة مھمة كلمات المرور و مثال مقارنة البیانات، ،مورتستخدم في مختلف األ جدا :شكلھا یكون كما یليو ،المقارنة في جداول البیانات وغیرھا
A = strComp(string1,string2, [ Comparison Type ])
الخیار أما string2و string1نھا تقوم بالمقارنة بین السلسلة النصیة أالحظ الثالث فھو نوع المقارنة وھو محدد من قبل لغة الفیجوال بیسك على
binarycompare ن لم تقم بتعدیلھ، إوال یوجد خطا ،لم یقوم المستخدم بتعدیلھ ماحیث بعد قیام binarycompareیكفینا الحدیث عن ، قارنةنوع المأ إلىلن نتطرق
لو وجد ھنالك string2و string1بالمقارنة بین ) compiler(مترجم اللغة ولكن لو لم یكن ھنالك تطابق سوف یعطي 0قیمة Aتطابق بینھما سوف یعطي
.وھكذا 1المستخدم قیمة
:كالتالينھ یمكنك تكوین شرط علیھا یكون أالحظ
If a = 0 then action ….. عند حدوث تطابق
If a = 1 then action ….. عند عدم وجود اي تطابق
)٣(المثال
ھذا المثال بتوضیح بعض الدوال عن طریق تجریبھا، نبدأ بتشغیل في سوف نقوم :ونجعل شكل النموذج كما یلي ٦برنامج الفیجوال بیسك
) len )Command1نقوم بوضع الكود التالي في زر
lennumber = Len(Text1.Text)
MsgBox lennumber
:تفسیر الكود
باستعمال text1خذ عدد الحروف من أب lennumberیقوم الثابت : األولالسطر .ن الفراغات تحسب حرفاأمع المالحظة lenالدالة
.على شكل رسالة للمستخدم lennumberطباعة الثابت :السطر الثاني
Midنقوم بوضع الكود التالي في زر
l1 = Val(InputBox("StartPosition"))
l2 = Val(InputBox("Length"))
MidString = Mid(Text1.Text, l1, l2)
MsgBox MidString
:تفسیر الكود
القیمة التي یدخلھا المستخدم التي تمثل موقع بدایة l1یحمل الثابت : األولالسطر .االقتطاع
.ت السابق لكنھ یمثل طول االقتطاعنفس الثاب: السطر الثاني
قد تواجھك مع التقدم في نھأل ،بوضع الدالة أنصح، لكن أنا لتھاازإیمكنك Valدالة .طةتعود سوى بسلسلة نصیة مثال فضعھا دائما للحی البرمجة متغیرات ال
.midstringیخزن قیمة االقتطاع في الثابت :السطر الثالث
.midstringطباعة الثابت : السطر الرابع
ucaseنقوم بوضع الكود التالي في زر
utext = UCase(Text1.Text)
MsgBox utext
:تفسیر الكود
text1كبیرة في إلىحرف بعد تحویلھا األ utextیحمل الثابت : األولالسطر
utextطباعة قیمة : السطر الثاني
strcompنقوم بوضع الكود التالي في زر
a = StrComp(LCase(Text1.Text), "end")
If a = 0 Then End
:تفسیر الكود
نھ قد أالحظ "end"ویقارنھا مع قیمة text1قیمة aیحمل الثابت : األولالسطر صغیرة لتطابق مع إلىوذلك لتحویل الحروف Lcaseفي دالة text1قمنا بوضع
end
.ذا كانت نتیجة المقارنة صحیحة سوف یغلق البرنامجإ: السطر الثاني
:شكل الكود النھائي یكون كالتالي
المثال مرفق مع الكتاب أن تذكر
الوحدة العاشرة
فرعصبحت أنھا أحد أوال ینكر ،تتقدم بشكل دائم ومستمر لعاببرمجة األ ا
مھم والتطبیقات لعاببل وال یستھان بھ من البرمجة، فقد بدأت األ االھواتف الذكیة إلىوتعدتھا ،جھزة الحاسبأالرسومیة المختلفة تغزو
.وغیرھا
فقد سلكت مداخل مختلفة مع تطور لعابتختلف طرق تصمیم وبرمجة األ ألعابعلى محرك لعابفي ھذه الوحدة سوف نبدأ بتعلم برمجة األأما ،العلم
عتبره محركأوھو محرك Truevision3D )مكتبة دوال برمجیة ( جید ا ا،وقوی C#،C++،Delphi،visualbasic.netویدعم لغات مختلفة وكثیرة مثل ا
. visualbasic نھ یدعم لغةأ واألھم
لكن توجد دروس ،قلیلة نوعا ما Truevision3dالدروس العربیة على مكتبة ن ھذا الوحدة سوف تجعل متمكنأكما األجنبیة،جیدة لھذه المكتبة باللغات منھا ا
.حب الشئ نجح فیھ أا وحدة ممتعة وتختلف عن سابقتھا فمن أنھمن ذلك واألھم
فھم جید لبرمجة إلى الىن هللا تعإذدروس سوف تنقلك ب إلىھذه الوحدة مقسمة سوف نتحدث في ھذه الوحدة عن ، ثالثیة البعد كاملة تقریبا ألعاب إنشاءو ،لعاباأل
ن محرك أمع العلم 2D إلىولن نتطرق 3D ثالثیة البعد لعاببرمجة األTrueVision یملك عدد كبیر ا .2dفي مجال ) Functions( من الدوال ا
نبدأ بتوفیق هللا
ومحركاتھا لعابنبذة عن برمجة األ :األولالدرس
لكن OpenGlأو DirectX مكتبتي باستعمال لعاباأل ببرمجة یبدأون الكثیرون وقرینھ DirectX ألن مشھور ألعاب بمحرك یبدأ نأ ءالبد یرید من أنصح ناأ
OpenGl جمیع محركات . ئالمبتد للمبرمج خصیصا الصعوبة غایة في ھما لعابفمكتبة األ DirectX & OpenGlتم برمجتھا باستخدام باألساسھي لعاباأل
.التطبیق الرسوميأو الف الدوال التي تسھل على المبرمج صنع اللعبةآ إالماھي
ھا بتقوم في البدایة بصنع محرك خاص لعابغلب شركات صناعة وبرمجة األأ .Rageصاحبة المحرك RockStarمثال ھذه الشركات أومن ،ھاألعابلتطویر
ل العم علیھ بل ،وصنع محرك لھ ،البدایة من الصفرلیس بالضروري على المبرمج ن المحرك الذي سوف ینتجھ لن أخرى كما أ على محركات قامت ببرمجتھا شركات
.ن لم یكن یملك الدعم الفكري والماليإیكون بكفاءة باقي المحركات
موجودة ألعابیمكن على المبرمج المتقدم تطویر محركات مختلفة ومفتوحة و سابقا .ووضع الدوال التي یرید) OpenSource(المصدر
البرمجة في صناعة اللعبة مثل + مختلفة تستخدم التصمیم ألعابھنالك محركات unity وunreal إلىخرى تستخدم البرمجة للوصول أ ألعابكما توجد محركات
.OgreSdkو Xnaاللعبة مثل
ھو من الصنف الثاني ) TrueVision3d6.2(المحرك الذي سوف نستخدمھ أما .وھو محرك سھل التعلم سلس االستعمال
عدد TrueVisionیحوي محرك كبیر ا و 3dمن الدوال المتخصصة في اودوال للبرمجة ) Scenes(والمشاھد ) Effects( ثیراتأوالت واإلدخالالتصادم
. لعابثنائیة البعد وغیرھا لذلك سوف یسھل علینا صنع األ
المجسمات والخرائط على برامج خارجیة مثل إنشاءھذه المادة یمكنك بعد التقدم في . TrueVision إلىومن ثم تصدیرھا 3dmaxبرنامج
والملفات التي ) Texture(والخامات ) Models(والمجسمات األمثلةجمیع :تذكر .ن شاء هللا إسوف تحتاجھا ستكون مرفقة مع الكتاب
للعمل TrueVision3Dمحرك إعداد :الثاني الدرس
ملفات، المكتبة 6.2 اإلصدار true vision 3dفي البدایة سنستعمل محرك الفیجوال إلىالمكتبة إضافةن نشرح أمرفقة مع الكتاب في مجلد برامج مساعدة قبل
:أموربیسك یجب مالحظة عدة
إنما الملفات التي سوف و ،المكتبة الملحقة مع الجھاز لیست المكتبة الكاملة لھ .تضمنھا المكتبة الكاملة التي نحتاجھا
المساعدة یمكنك تحمیلھا من مورالمكتبة الكاملة تحوي مجموعة من البرامج واأل :الموقع التالي
٦.٢ صدارنحن سوف نقوم بالشرح والعمل والتطبیق على اإل
:دناهأات قد تحتاج الیھا من الموقع تأثیریمكنك تحمیل مجسمات وخامات و
والخامات والمجسمات والبرامج المختلفة والمساعدة وكل ما مثلةن جمیع األأ :تذكر سوف نتطرق لھ في ھذا الكتاب یكون مرفق .معھ ا
المكتبة وتعریفھا على الجھاز الخاص بك قم بفتح الملفات المساعدة ضافةإل اآلناالمتداد إلى DLLوقم بنسخ الملفات ذات االمتداد TrueVision3Dواختر ملف
\c:\windows\system32التالي
الذي سوف یقوم بتعریفھا في مسجل setup.batوبعد ذلك قم بتشغیل ملف .النظام
او اعلى windows 7اذا كان نظام التشغیل الخاص بك من نوع :مالحظة مھمة Run asواختر الخیار setup.batملف قم بالنقر بزر الفأرة االیمن على
administrator.
التي سوف لعابمع األ TrueVision3dیفضل وضع الملفات الموجودة في مجلد یتسنى أخرىجھزة حاسوب أ إلى لعابردت نقل األأتقوم ببرمجتھا وذلك النك لو
.لھا العمل بالشكل المطلوب
:الفیجوال بیسك إلىالمكتبة إضافةكیفیة
.٢نقوم بتشغیل برنامج الفیجوال بیسك -١ Referencesومن ثم ننقر على Projectsبعد ذلك نقوم باختیار الئحة -٢ونختار الملف TrueVision3Dونفتح مجلد Browseومن ثم ننقر على -٣
Truevision3D.dll كما یلي:
.بالطریقة نفسھا tvmedia.dllو dx8vb.dllالملفین إضافةنقوم ب -٤ :باختیار المكتبة عن طریق تحدیدھا كما یلي نقوم -٥
یتوجب أنھي أعمل مشروع جدید دنقوم بتكریر العملیة عن :مالحظة مھمة
تقوم بتكرار أن الملفات في كل مشروع لكن لیس بالضروري إضافةعلیك .refrencesالفیجوال سوف یحفظھا في ألن ٤-٢الخطوات من
)HelloWorld( برمجة رسالة: الدرس الثالث
معرفة إنمافقط و helloworldجملة إلىالمغزى من ھذا الدرس لیس الوصول ي المثال یتضح فسوف نبدأ بالمثال مباشرة ف. عداد ھذا المحركإكیفیة البرمجة و
.المقال
)١(المثال
ملفات المكتبة إضافةو ٦دعنا نقوم في البدایة بتشغیل برنامج الفیجوال بیسك )sdk ( تعلمنا في الدرس السابقكما.
:كما یلي Generalفي البدایة نقوم بتعریف المتغیرات الخاصة بالمكتبة في
Public V8 As TVEngine
Public Scene As TVScene
Public Inp As TVInputEngine
:نبدأ بشرح المتغیرات
V8 as tvengine: إنشاءھذا المتغیر االساسي في ھذا المحرك فھو الذي یقوم ب سوف نتناولھا التي راتبالشاشة وتكوین العالم االفتراضي ویحوي العدید من الخ
.مع التقدم في المادة
Scene as tvscene: ھذا المتغیر الخاص بالمشاھد والعرض على الشاشة .وعرض الكائنات علیھا
Inp as tvinputengine: وامردخال الخاص بتنفیذ األھذا المتغیر ھو متغیر اإل .عند الضغط على زر ما
.سماء المتغیرات على ھواك أیمكنك تغیر أنھتذكر :مالحظة مھمة
truevisionمحرك ب اإلدخال ألنمع الدروس اإلدخالیتم شرح س :مالحظة مھمة .ن یحتاجان لدرس خاص بھمایاللذ DirectXو OpenGlعكس بسھل
Load_Formنقوم بكتابة الكود التالي في
Set V8 = New TVEngine
Set Scene = New TVScene
Set Inp = New TVInputEngine
V8.Init3DWindowedMode Me.hWnd
Scene.SetSceneBackGround 0, 0, 0
Me.Show
Do
DoEvents
If Inp.IsKeyPressed(TV_KEY_ESCAPE) = True Then End
سوف یكون شكل ) FullScreen(ن تجعل الشاشة كاملة أردت أ ذاإ :مالحظة مھمة :الكود كالتالي
V8.Init3DFullscreen 1024, 768, 32
.بعاد الشاشة الخاصة بكأیرھا حسب یتغ ال تنس فبعاد الشاشة أھي األرقامھذه
RGBلوان أیقوم ھذا الكود بتحدید لون خلفیة الشاشة لكن بنظام : السطر الخامس .من ھذا الكتاب األول صدارالذي تحدثنا عنھ في اإل
لن یتم عرض مرلو لم تضع ھذا األ أنھوھو لعرض الفورم الحظ :السطر السادس لو حددنا الشاشة فال یوجد داع أما حددنا النموذج مكانا للعرض ألنناالنموذج ولذلك
.مرلكتابة ھذا األ
في كل أمر أھمھذا Doالسطر السابع ھو لعمل التكرار :الثامن+ السطر السابع ألنر وذلك تمتوضع متغیرات الرسم في العالم داخل تكرار مس أن یجب نھماسبق أل
متكرر یتم مسحھ باستمرار وھكذا یتم Frameعرض اللعبة یكون على شكل یكون موجود أن حبذأزلتھ لكن أالسطر الثامن فال ضیر لو أما .العرض في كل ا .مشروع
ولن ة،ح ما ھو موجود على الشاشة وھي مھممسھذه الدالة تقوم ب: السطرالتاسعتكون اللعبة لعبة دون ھذه الدالة مثال لو قمنا بعمل صندوق یتحرك ولم نقم بكتابة
لكن في محرك فسیقوم المحرك برسم الصندوق على طول فترة حركتھ ،مرھذا األTrueVision مرلعرض دون كتابة ھذا األلن تتم عملیة ا.
على الشاشة HelloWorldسوف تقوم بكتابة التي ھذه الدالة : السطر العاشر
الثالث فھو أما ي السیني لھا حداثاسم الكلمة والثاني ھو اإل األولحیث الخیار ).X,Yي لنقاطإحداثیتم الرسم على شكل (ي الصادي حداثاإل
لیسھذا السطر :السطر الحادي عشر في الوقت الحاضر فھو خاص ضروریان أفضل ألكن ) X/.3DS.(ذات االمتدادات Meshبعرض المجسمات من النوع
.تعتاد على كتابتھ
مھم لعمل البرنامج لھ عالقة في سواقة المحرك أمروھو : السطر الثاني عشر .رئیسي ولن یعمل البرنامج من دونھ أمركتابتھ فھو ،التنس
do + events + loopوھو لتكرار : خیرالسطر األ
:یكون شكل الكود كما یلي
:شكل البرنامج بعد العمل كالتاليأما
لتسھیل العمل ClassModuleعداد إ:: الرابع الدرس
ھذا الدرس مھم فعلى سبیل ،لعابخصوصا عند التطور في برمجة وتطویر األ جدامجسم سیارة نشاءإل وامرواأل األسطرنقوم بكتابة عدد كبیر من أن المثال بدل من
في ھذا ، دخال البیانات الكافیةإنقوم بكتابة دالة تقوم بدورھا بعمل المجسم بعد ،مثال truevisionعداد إالدرس سوف نقوم بعمل كائن ووضع دالة بداخلھ تقوم ب
.خرىأفي برامج )ClassModule(بسرعة ویمكنك استغالل ال
)٢(المثال
المكتبة كما تعلمنا في إضافةالفیجوال بیسك و برنامجنقوم بتشغیل .سابقا
سمیھ أا سوف أن كما في الشكل وقم بتسمیتھ كما ترید ClassModule إنشاءنقوم بWorld3D مثال:
ووضع متغیرات المحرك فیھ Module إنشاءومن ثم نقوم ب
كما یلي
متغیرات المكتبة كما یلينقوم بتعریف
Public V8 As TVEngine
Public Scene As TVScene
Public Inp As TVInputEngine
تم شرحھا .مسبقا
.نقوم في البدایة بكتابة دالة لتعریف المتغیرات
Public Sub Set_Dims()
Set V8 = New TVEngine
Set Scene = New TVScene
Set Inp = New TVInputEngine
End Sub
تم شرحھ .مسبقا
ClassModuleونقوم بكتابة الدالة التالیة في
Public Sub Create_Handl(FullScreen As Boolean, Handle As Long, Width As Long, Height As Long, Bpp As Long)
If FullScreen = True Then
V8.Init3DFullscreen Width, Height, Bpp
Else
V8.Init3DWindowedMode Handle
End If
End Sub
السواقة ویحوي على عدت بارامترات إنشاء أمروھو ): ٢+١(األولالسطر )parameters( وھي ،ھا لتعمل الدالةإدخالالتي یتوجب مور ما عدد من األأو:
Fullscreen as boolean: أما منطقي،وھي خیارtrue أوfalse وھي لتحدید .نافذةأو كان العرض شاشة كاملة ا ماإذ
Handle as long : ا كانت قیمة إذلیس لھ عالقةfullscreen =true أنھ إذ .مثال pictureفي صندوق أو fromفي نموذج أما یختص لتحدید نوع العرض
width: ولیس لھ عالقة عندما یكون العرض على نافذة .وھو لتحدید عرض الشاشة
Height :ولیس لھ عالقة عندما یكون العرض على النافذة . وھو لتحدید طول الشاشةعطاء قیمة وھمیة إلكن الحظ عند استخدام الدالة وكان العرض في نافذة یجب علینا
.أكثروذلك لتفادي الخطأ ال
Bpp: ولیس لھ عالقة عندما یكون العرض على نافذة .وعرضھا لوانخیارات األ.
فقد تحقق fullscreen = trueا كانت إذوھو لتحدید نوع العرض ف: السطر الثالث .شرط العرض في شاشة كاملة
تم شرحھ :السطر الرابع .ندخلھا في البارامترات التي ھي بعاداأل أن لكن الحظ مسبقا
تم شرحھ :خیراأل إلىالسطر الخامس .مسبقا
:مثال ویكون كما یلي escapeالبرنامج عند الضغط على إلغالق دالة إضافةویمكنك
Public Sub EndWhenPressEscape()
If Inp.IsKeyPressed(TV_KEY_ESCAPE) = True Then End
End Sub
تم شرحھ .مسبقا
الذي قمنا بعملھ ونضع الكود في class moduleنقوم بتعریف متغیر خاص ل اآلنmodule في أوgeneral في الفورم كما یلي:
Public Vworld As New World3D
Class module (as newاسم ( أنھالحظ
نقوم بكتابة الكود التالي في الفور اآلن
With Vworld
.Set_Dims
.Create_Handl True, Me.hWnd, 1024, 768, 32
End With
Me.Show
Do
DoEvents
Vworld.EndWhenPressEscape
V8.Clear
V8.RenderToScreen
Loop
العرض في شاشة كاملة لو + قمنا باستخدام المتغیر الذي عرفناه أنھنالحظ .العرض یصبح في نافذة falseجعلنا القیمة
شكل البرنامج
المجسمات واالضاءة إنشاءیمكنك استخدام البرمجة الكائنیة في :مالحظات مھمةا في الدروس القادمة فلن أن أما .ات لتسھیل العمل علیكتأثیروال صواتواأل
ستخدمھا أ كل مبرمج ألنیفضل على القارئ عملھا وذلك أمور ا نھوذلك أل ،كثیرایختلف في تفكیره عن غیره لذلك سوف نسیر على الطریقة القدیمة لكن مع التقدم
.والممارسة سوف تجد نفسك تسخدم البرمجة الكائنیة في مختلف برامجك
المثال مرفق مع الكتاب أن تذكر**
كسائھا وتعدیلھاإو Meshمجسمات إضافة :الدرس الخامس
ومن ثم سوف Xو 3DSمجسمات من نوع إضافةسوف نقوم في ھذا الدرس ب . بإكسائھانقوم
)٣(المثال
المكتبة علیھ كما یمكنك إضافةل برنامج الفیجوال بیسك وفي البدایة نقوم بتشغی .استخدام الكالس الذي قمنا بعملھ في الدرس السابق
:لوضع المتغیرات كما یلي Moduleإنشاءنقوم ب
Public V8 As TVEngine
Public Scene As TVScene
Public Inp As TVInputEngine
Public Texture as TvTextureFactory
Public Box As TVMesh
Public Car As TVMesh
جمیع المتغیرات نعرفھا .ةخیرعدا المتغیرات الثالث األما سابقا
Texture as TvTextureFactory: وھو المتغیر الخاص بالتعامل مع .ات والصور والتعدیل المختلف علیھاكساءاإل
As tvmesh : 3وھو المختص بالتعامل مع المجسمات من نوعDs وX .
نقوم بتجھیز المحرك للعمل كما تعلمنا .سابقا
بعادالمجسم ثالثي األ بأننعرف أن المجسم ال بد من إنشاءنقوم بكتابة كود أن قبل yوالمحور Xالمحور يوھ) Axises(یوجد على ثالث محاور أنھوھذا یعني
.)X,y,z(ولذلك عند تحدید موقعھ یجب تحدید نقطة من المحاور الثالث zوالمحور : الشكل التالي إلىوحتى تفھم ما یجري انظر
نحدد أن نقوم بتحدید حجم الصندوق یجب أن وعندما نرید على ثالث محاور أیضاأو وكذلك الدوران یكون على المحاور الثالث) الطول،العرض،االرتفاع(وھي
.على محورأو محورین
Load_Formالصندوق في نشاءنقوم بكتابة الكود التالي إل
Set Box = New TVMesh
Set Box = Scene.CreateMeshBuilder
Box.CreateBox 10, 10, 10
Box.SetPosition 20, 0, 50
Box.SetRotation 45, 20, 80
Box.SetColor RGBA(0.3, 0.8, 0.8, 0.1)
:تفسیر الكود
. Boxوھو لتعریف المتغیر :الثاني+ األولالسطر
ومن ثم تحدید CreateBoxصندوق باستخدام الدالة نشاءوھو إل :طر الثالثالس) Width(و العرض ) Depthالعمق (حجم ھذا الصندوق من خالل الطول
).Height( واالرتفاع
وھو لتحدید موقع المكعب كما بینا : السطر الرابع .سابقا
Xیدور على محور أنھاتجاه دوران الجسم نالحظ أو وھو لدوران :السطر الخامسدرجة عن محور ٨٠درجة وبمقدار ٢٠بمقدار Yدرجة و عن محور ٤٥بمقدار
z .
لذك ) Radian(النظام التلقائي للمحرك ھو النظام الدائري أن تذكر: مالحظة مھمة شرحنا ذلك . النظام الستیني إلىال تنسى التحویل الكود التالي إضافةویكون ب سابقا
V8.SetAngleSystem TV_ANGLE_DEGREE
تعرفنا بالسابق rgbaالدالة أن وھو لتحدید لون المكعب الحظ: السطر السادسذه الدالة یعني في ھ aرمز أما RGBتحدد ب TrueVisionفي لوانن األإعلى
غیر شفاف على ( ١ إلى) شفاف غیر مرئي ( 0من الرقم شفافیة المجسم وھو .0.2وھنا كانت الشفافیة ) اإلطالق
یمكنك اخذ المجسم .والذي سوف یحمل مجسم سیارة Carمجسم إضافةنقوم ب اآلن .في مجلد المثال المرفق Carمن مجلد كساءواإل
Load_Formنقوم بكتابة ھذا الكود في نا أن ىوھو ال یختلف عن سابقھ سو أیضا .سوف نقوم باستیراد المجسم
upحیث ٦بتحمیلھا تمثل وجوه المكعب قمنا التي ٦الصور :مالحظة مھمة إلىانظر حبوضو مرالسفلي وھكذا ولتفھم األ downیمثل الوجھ العلوي لھ و
الصورة التالیة
.فھو خاص بالمسافة وبعد مربع السماء skybox_setdistance. مراألأما
.لمربع السماء renderوھو خاص لعمل doضع الكود التالي في التكرار
Sky.Skybox_Render
الشكل النھائي للبرنامج
)CameraControl 1( التحكم بالكامیرا: التاسع الدرس
ل ءفقد یتسا ،المتعلقة بالكامیرا وامرفي الدروس السابقة قمنا بتأجیل شرح بعض األ .لعابما وظیفتھا ببرمجة األأو البعض ما ھي الكامیرا
تختلف عن المفھوم الذي نعرفھ لعابالكامیرا في برمجة األ فھي بمثابة العین ،مسبقا التي یرى منھا المستخدم المجسمات والتأثیرات وغیرھا لذلك حتى نتمكن من تطبیق
.وكیفیتھ) الكامیرا(لعبة ما ثالثي البعد یتحتم علینا ضبط مكان العرضأو
في التي مور ألشرح مبسط لبعض ا إنمامثال جدید و إنشاءفي ھذا الدرس لن نقوم ب .ا كنت على درایة كافیة بالدروس السابقةإذالغالب ستكون مفھومة بالنسبة لك
سوف یكون sceneالمتغیر فإنین متغیر خاص للكامیرا یفي حال عدم تع أوال :ات الكامیرا من الخیار كالتاليإعدادالمسؤول عن العرض فیمكن ضبط
Scene.SetCamera PosX,PosY,PosZ,RotX,RotY,RotZ
تعاملنا معھا التي الكامیرا تشبھ المجسمات أن نالحظ حیث سابقا
posx :ي السیني حداثاإل
Posy: ي الصادي حداثاإل
Posz: ي حداثاإلZ
RotationX: الدوران على المحور السیني.
RotationY :الدوران على المحور الصادي.
RotationZ: الدوران على المحورZ
ھنالك مكتبة متغیر خاص في التحكم بالكامیرا TrueVision ألعابلكن في محرك .وھو سلس االستخدام ویحوي العدید من الدوال المساعدة والمفیدة
المتغیر یكون على الشكل التالي
Public اسم المتغیر As TVCamera
:وتعریف المتغیر یكون على الشكل التالي
Set اسم المتغیر = New Tvcamera
و tvengineو sceneیمكن تعریف جمیع المتغیرات السابقة مثل :مالحظة مھمةinputengine و حتىtvcamera بوضع كلمةNew بعد اسم المتغیر كالتالي:
Public Camera As New TVCamera
من ناحیة التحكم فعلى سبیل المثال قد أفضلى األوللكن من جھة نظري الطریقة تضبط نوع المتغیرات الذي تم تعریفھ وعندھا یمكنك أن حدى التطبیقاتإتحتاج في
وھو ،وھذا یسھل علیك التحكم بھا) Function(وضع تعاریف المتغیرات في دالة .لعابمفید من ناحیة برمجة محركات األ
:المتغیر نقوم بوضع الكود التاليیات الكامیرا من خالل إحداثلتحكم بل
Camera.SetPosition posx,posy,posz
:لتحكم بالدورانلو
Camera.SetRotation RotX,RotY,RotZ
تشتمل الدروس القادمة على والمھمة في الكامیرا، مورتممنا األأوھكذا نكون قد .تطبیق لما تعلمناه في ھذا الدرس
) 2CameraControl( بالكامیراالتحكم : الدرس العاشر
وھو مثال مكعب –خر مثال قمنا بعملھ آفي ھذا الدرس سوف نقوم بالتعدیل على یة وسوف نجعلھا تدور رضالكرة األ إكساءكرة تحمل إضافةحیث سنقوم ب –سماء ال
.ثناء دورانھاأالكامیرا سوف تكون مرافقة لھا أما
)٧(المثال
وسوف نقوم بتعریف ) ٦المثال رقم (خیریل المثال األشغفي البدایة سوف نقوم بت :كما یلي Moduleالكرة وكتابتھا في ئمتغیر الكامیرا والمتغیر الذي سینش
Public Camera As TVCamera
Public Earth As TVMesh
كما تعلمنا Load_Formومن ثم سوف نقوم بتعریف المتغیرین في :سابقا
Set Camera = New TVCamera
Set Earth = New TVMesh
Set Earth = Scene.CreateMeshBuilder
صورة أن الحظ(لھا رضاأل إكساء إضافةالكرة و إنشاءفي البدایة سوف نقوم ب ).مرفقة مع المثال كساءاإل
قد تم شرح مثل ھذا الكود أنھالحظ .Meshالمجسمات من نوع إنشاءراجع سابقا
یات حداثقیم وھي تمثل اإل ٣متغیر جدید ھذا المتغیر یحمل إنشاءسوف نقوم ب اآلن .وسوف نستخدمھ في دالة ملحقة بمتغیر الكامیر) نقطة(الثالث
لذلك ال DirectX 8مكتبة وھو من متغیرات D3dVectorھذا المتغیر من نوع :المكتبة كالتالي إضافةبد من
.لتعریف المتغیر وتحدید قیمھ Load_Formومن ثم نضع الكود التالي في
Dim Pos As D3DVECTOR
Pos.x = 0
Pos.Y = 0
Pos.Z = 20
).یةرضالكرة األ(وھي تمثل موقع الكامیرا من المجسم
.وھو لحركة المجسم والكامیرا Doنضع الكود التالي في التكرار
Earth.RotateY V8.TimeElapsed * 0.01
Camera.SimpleFollowing Earth, Pos
:تفسیر الكود
مراألأما وھو یتحكم بدوران الكرة على المحور الصادي األولالسطر v8.timeelapsed علیھ مع التقدم بالبرمجة وھو موجود في مختلف تعتادسوف ).تھدئة الحركة(لتحكم بالحركة النسبیة لوھو لعابمحركات برمجة األ
وھي دالة تجعل SimpleFollowingنا استخدمنا الدالة أن الحظ :السطر الثانيتبقي المنظر بین المجسم والكامیرا ثابت ال ( اللحاق بھمرافقة للمجسم المراد الكامیرا
موقع أو فھو یمثل بعد Posأما ،فھو المجسم المراد لحاقھ earthأما ، )یتغیر .الكامیرا بالنسبة للمجسم
مالحظة ھامة ا إذأما meshمع المجسمات من نوع إالھذه الدالة ال تستخدم :جدافھذا لن یفلح، لكن یمكنك استخدام حل بدیل tvactorاستخدمھا مع المتغیر أردتحدائي المجسم من نوع إي الخاص بھ نفس حداثصندوق صغیر وجعل اإل إنشاءوھو
MDL ومن ثم نجعل شفافیة الصندوق صفر، كما تعلمنا ا وبعدھا نجعل الكامیرا سابقا .تلحق بالصندوق المختفي
.كوادشكل األ
شكل البرنامج النھائي
.مرفقة مع الكتاب مثلةجمیع األ :تذكر
Movement&Collision(الحركة والتصادم : عشر الحادي الدرس1(
ھنالك أن عتقدأوال األحداث، أھمحدث الحركة وحدث التصادم ھما من أن كما نعلم شخص تطبیق بسیط على إجراءسوف نقوم في ھذا الدرس ب ،ال یعرف السبب ا
.الحركة ونجعل التصادم للدرس الثاني
)٨(المثال
.األربعةاالتجاھات في صندوق وتحریكھ إنشاءفي ھذا المثال سوف نقوم ب
إضافةمشروع جدید و إنشاءفي البدایة سوف نقوم بفتح برنامج الفیجوال بیسك و كما تعلمنا أخرىمكتبة المحرك مرة .سابقا
:ونضع فیھ المتغیرات المطلوبة وھي كالتالي Module إنشاءومن ثم نقوم ب
Public V8 As TVEngine
Public Inp As TVInputEngine
Public Scene As TVScene
Public Box As TVMesh
Public Camera As TVCamera
Public Texture As TVTextureFactory
Public sky As TVAtmosphere
Public PositionX As Single, PositionZ As Single
جمیع المتغیرات مفھومة سوف نھن ھما لموقع المكعب ألاخیرالمتغیران األو ،مسبقا .یتغیر مع الضغط على الزر
:نقوم بتعریف المتغیرات كالتالي
Set V8 = New TVEngine
Set Inp = New TVInputEngine
Set Scene = New TVScene
Set Camera = New TVCamera
Set Box = New TVMesh
Set Box = Scene.CreateMeshBuilder
Set Texture = New TVTextureFactory
Set sky = New TVAtmosphere
معنا تقد مر وامرجمیع ھذه األ .لذلك الداعي لشرحھا سابقا
شاشة العرض أوامرونضع كما تعلمنا Load_Formفي أیضا :سابقا
V8.Init3DFullscreen 1366, 768, 32
Scene.SetSceneBackGround 0, 0, 0
أبعادعاله شاشة حاسوبك لذلك یمكنك تعدلیھا حسب أ بعادقد ال تناسب األ :تذكر . Pictureعلى اداة أو جعل العرض على النموذجأو الشاشة الخاصة بك
:اتكساءوھو لتحمیل اإل Load_Formنضع الكود التالي في
:نشائھا في الدرس السابقإقمنا ب التينضع الكود التالي في دالة الحركة
If GetDistance3D(Wall.GetPosition.x, 0, Wall.GetPosition.Z, PositionX, 0, PositionZ) < 3 Then End
:تفسیر الكود
المسؤول عن التصادم من خالل مراألأو ھذا ھو الكود أن الحظ . GetDistance3Dالدالة
:GetDistance3Dالدالة
من أكثر إجراءبدالة تقوم ب اھویمكن تشبیھ TrueVision3Dھذه الدالة من دوال األولیینن ییحداثواحد حیث یمثل اإل ن آشرط في
wall.getposition.x,wall.getposition.z یا الجسم المراد بحث إحداثیا الجسم المراد بحث إحداث PositionZو PositionXیان حداثواإل .التصادم عنده ).الجسم المتحرك(التصادم معھ
المقارنة التالیة من خالل ھذه الدالة اءجرإحیث یقوم المحرك ب
If positionx < wall.getposition.x + المسافة الفاصلة
And If positionz < wall.getposition.z + المسافة الفاصلة
من أخرىشكال أھذه الدالة لتحدید نقاط التصادم سوف نتعرف على أي أن
. ن شاء هللاإالتصادم في الدروس القادمة
:شكل البرنامج بعد التنفیذ كالتالي
.مرفقة مع الكتاب مثلةجمیع األ :تذكر
Bspخرائط إضافة : الدرس الثالث عشر
كثیرة من ألعابیستخدم ھذا النوع من الخرائط في Bspمراحل أو Bspخرائط محدود وغیر أنھلكن مشكلة ھذا النوع من الخرائط CounterStrikeمثال أ
و تطبیق Bspخریطة إضافةعلى العموم سوف یشتمل ھذا على ،مرغوب نوعا ما .على الحركة
)١٠(المثال
لوضع المتغیرات فیھ Module إضافةمشروع جدید و إنشاءفي البدایة دعنا نبدأ ب كما تعلمنا .سابقا
:Moduleنضع المتغیرات في
Public V8 As TVEngine
Public Scene As TVScene
Public Inp As TVInputEngine
Public Bsp As TVBSPTree
Public Camera As TVCamera
حیث TvBspTreeمن نوع bspنا نعرف جمیع المتغیرات عدا المتغیر أن الحظ .اتھاإعدادالخریطة والتحكم ب إضافةب) Object(یقوم ھذا الكائن
bsp.*من نوع ) Levels(المراحل أو یشتمل على الخرائط أنھالحظ
كما تعلمنا Load_Formبتعریف المتغیرات في اآلننقوم :سابقا
Set V8 = New TVEngine
Set Scene = New TVScene
Set Inp = New TVInputEngine
Set Bsp = New TVBSPTree
Set Camera = New TVCamera
یشبھ بشكل كلي تعریف باقي المتغیرات ویمكنك تعریفھ Bspتعریف أن الحظ وقد بینا ذللك .Bsp as new tvbsptreeكالتالي أخرىبطریقة وشرحنا سابقا
. Set یة التعریف باستخدام أفضل
شاشة العرض وقد سبق فھمھ عدادوھو إل Load_Formضع الكود التالي في ن :وشرحھ
Mdlالمجسم من نوع إضافةمربع السماء و نشاءھذا الكود وھو إل
:السابقة كالتالي وامرلم یتبق فقط سوى وضع التكرار الظھار األ اآلن
Do
DoEvents
If Inp.IsKeyPressed(TV_KEY_ESCAPE) = True Then End
V8.Clear
Sky.Skybox_Render
Monster.Render
Scene.RenderAllMeshes True
V8.RenderToScreen
Loop
تم شرحھا وامرجمیع األ أن الحظ .سابقا
:شكل الكود كالتالي
Moduleكود
Load_Formكود
.مرفقة مع الكتاب مثلةجمیع األ :تذكر
)٢(تطبیقات متنوعة : الدرس الرابع عشر
أمورقد تعلمنا في الدروس الماضیة دیھیات برمجة ساسیات وبأمھمة وتعتبر من اال وھي أالدرس سوف نضیف فكرة تختلف عما سبق نوعا ما في ھذا ،لعاباأل
ذ ال یمكن تخیل لعبة كاملة دون إیتھا أھموال داعي لشرح ،صواتالتحكم باأل .صوات والكمال عزوجلأ
)١٢(المثال
إضافةمشروع جدید و إنشاءو ٦في البدایة دعنا نبدأ بتشغیل برنامج الفیجوال بیسك مكتبة دوال جدیدة وھي المكتبة الصوتیة إضافةالمحرك ولكن ھنا سوف نقوم ب
TvMedia ویكون ذلك كالتالي:
):تذكر لو لم تجدھا فھي مرفقة مع الكتاب(ومن ثم نختار المكتبة
: Moduleنقوم بكتابة المتغیرات في اآلن
Public V8 As TVEngine
Public Scene As TVScene
Public Inp As TVInputEngine
Public Sound_Engine As New TVSoundEngine
Public Listener As TVListener
Public Sounds(0 To 3) As New TVSoundWave3D
جمیع المتغیرات نعرفھا خر ثالث وھي المتغیرات الخاصة في باستثناء آ سابقا :وتكون كالتالي ،الصوت
التي صواتمتغیر الرئیسي لمحرك األالوھو TvSoundEngineالمتغیر من نوع .المتغیر الرئیسي للمحرك TvEngineتشبھ المتغیر
صواتوھو یحوي العدید من الخیارات الخاصة باأل TvListenerالمتغیر من نوع .وغیرھا إضافةمن تقطیع و
صواتھذا المتغیر المسؤول عن تحمیل األ TvSoundWave3Dالمتغیر من نوع في ھذا Mp3 من نوع صواتال یمكن تحمیل األ أنھفقط الحظ Waveمن نوع واالثنان نفس المبدأ في TVSoundMP3ذ یوجد لھا متغیر خاص بھا وھو إالمتغیر .فقط قم بتغیر نوع المتغیر Mp3تحمیل صوت من نوع أردت ا إذالعمل ف
مع أصوات 4نا سوف نقوم بتحمیل أي أن 3 إلى 0من خیرن عدد المتغیر األأالحظ .حساب الصفر
NEWباستخدام Sound_Engine و Soundsننا قمنا بتعریف المتغیرین الحظ أ
.جمیع المتغیرات مرفقة في مجلد المثال
:Moduleبوضع الكود التالي في صواتدالة خاصة لتحمیل األ إنشاءنقوم ب اآلن
Public Sub Input_Sound(Hwnd As Long)
Sound_Engine.Init Hwnd
Set Listener = Sound_Engine.Get3DListener
Sounds(0).Load App.Path + "\sounds\0.wav"
Sounds(1).Load App.Path + "\sounds\1.wav"
Sounds(2).Load App.Path + "\sounds\2.wav"
Sounds(3).Load App.Path + "\sounds\3.wav"
End Sub
Load_Formنك االستغناء عن الدالة بوضع الكود بشكل مباشر في في البدایة یمكلكن من وجھة ،تریدھا أو التي me.hwnd مع عدم نسیان تحدید السواقي وھي
.كثرأترتیب ال لفضل وضع دالة وذلك لأنظري
:تفسیر الكود
وھو خاص لتحدید سواقة عرض الصوت ونضع فیھا :داخل الدالة األولالسطر .ا Hwndالمتغیر الذي قمنا بتحدیده في الدالة وھو
. Listenerوھو لتعریف المتغیر :السطر الثاني داخل الدالة
یجب وضع التعریف TvListener عند تعریف المتغیر من نوع :مالحظة ھامة .تحدید السواقة أمربعد
:سوف تكون كالتالي التيجزاء أ ٣ إلىتم تقسیم ھذا الدرس
سوف نقوم فیھ بتجھیز مجلد اللعبة وتجھیز الملفات والخامات >>>> ١الجزء ن نسمي أالمشروع قبل البدء ویمكن إنشاءوشرح لمنھج وفكرة اللعبة و ،المطلوبة
.بدء البرمجةھذه المرحلة بالخطة قبل
سوف نتحدث (سوف نقوم فیھ ببرمجة الخریطة والكائن الرئیس >>>> ٢الجزء .وكتابة المتغیرات وتعریفھا) عنھ بعد قلیل
حداث والحركات ألبوضع اھذا الجزء سوف نقوم فیھ >>>> ٣الجزء .مور والتصادمات وغیرھا من األ
.بالمحاولة بنفسكك أنصحالحظ المشروع مرفق كامل مع الكتاب لكن
سلوب المتبع ألالفكرة والمنھج وا :)١(الخطوة
الشخصیة وف تكون عبارة عن مجسم لشخصیة ھذهھذه اللعبة س :تحدید منھج اللعبةسوف یالحقھا مجموعة من الوحوش مثال في شارع مزدحم بالسیارات التي بدورھا تسیر بعكس اتجاه حركة الشخصیة لذلك یجب على الشخصیة الھرب من الوحوش
.طبعا السیاراتتدھسھا أن مان دونألبر ا إلى
ھي التي سوف تكون الشاشة على نحو مقطع عرضي من المدینة :كیفیة العرض .المنطقة التي سوف یھرب فیھا بطل اللعبة
سوف یمثل الئحة األولن ینموذج إنشاءفي البدایة سوف نقوم ب ،حسنا :كیفیة العملالثاني سوف یشمل الواجھة الرئیسیة أما Exitو Aboutو Startالخیارات مثل
)MainForm (وحدات ٣ إنشاءوسوف نقوم ب)Modules (ى سوف تحتفظ األول أوامرالفرعیة والثانیة سوف تخصص لوضع وامربالمتغیرات وغیرھا من األ
مثل حدث الحركة والتصادم وسوف نقوم حداثألالخریطة والثالثة ل إنشاء أیضا
Public Sub Create_House_D3D(ID As Integer, TypeHouse As String, PositionX As Single, PositionY As Single, PositionZ As Single, RotationX As Single, RotationY As Single, RotationZ As Single, ScaleX As Single, ScaleY As Single, ScaleZ As Single)
المباني في اللعبة وھي سوف تسھل على المبرمج إنشاءھذه الدالة مسؤولة عن أن الحظواع من المباني ویمكنك التعدیل علیھا وزیادة عدد أن ثالثة إنشاءا تقوم بأنھتصمیھا ونالحظ
.المباني
Public Sub Create_Floor_D3D(ID As Integer, Width As Single, Height As Single, Depth As Single, PositionX As Single, PositionY As Single, PositionZ As Single, RotationX As Single, RotationY As Single, RotationZ As Single)
Set Floor(ID) = New TVMesh
Set Floor(ID) = Scene.CreateMeshBuilder
With Floor(ID)
.CreateBox Width, Height, Depth
.SetPosition PositionX, PositionY, PositionZ
.SetRotation RotationX, RotationY, RotationZ
.SetTexture GetTex("floortexture")
End With
End Sub
:تفسیر الكود
.تمثل الرصیف أو التي یةرضاأل نشاءھذه الدالة فھي إلأما
Public Sub Create_Tree_D3D(ID As Integer, TypeTree As String, ScaleX As Single, ScaleY As Single, ScaleZ As Single, PositionX As Single, PositionY As Single, PositionZ As Single, RotationX As Single, RotationY As Single, RotationZ As Single)
تم تحدید عددھا في أنھمجسم الفتة التحذیر تذكر نشاءفھو إل مرھذا األأما .٨المتغیرات ب
Public Sub Create_Monsters(ID As Integer, TypeMonster As String, PositionX As Single, PositionY As Single, PositionZ As Single, RotationX As Single, RotationY As Single, RotationZ As Single, ScaleX As Single, ScaleY As Single, ScaleZ As Single)
Set MonsterS(ID) = New TVActor2
Select Case LCase(TypeMonster)
Case Is = "monstera"
V8.OpenPAKFile App.Path + "\data\data.pak"
MonsterS(ID).Load "\monstera.mdl"
With MonsterS(ID)
.SetPosition PositionX, PositionY, PositionZ
.SetRotation RotationX, RotationY, RotationZ
.SetScale ScaleX, ScaleY, ScaleZ
End With
End Select
End Sub
:تفسیر الكود
إضافةوھم نوع واحد یمكنك التعدیل علیھا و ،الوحوش في اللعبة نشاءإل مرھذا األ .أخرىمجسمات
Public Sub Create_Cars(ID As Integer, TypeCars As String, PositionX As Single, PositionY As Single, PositionZ As Single, RotationX As Single, RotationY As Single, RotationZ As Single, ScaleX As Single, ScaleY As Single, ScaleZ As Single)
Set Cars(ID) = New TVMesh
Set Cars(ID) = Scene.CreateMeshBuilder
V8.OpenPAKFile App.Path + "\data\data.pak"
Cars(ID).Load3DSMesh "\carsa\car.3ds"
V8.ClosePAKFile
Select Case LCase(TypeCars)
Case Is = "cara"
With Cars(ID)
.ScaleMesh ScaleX, ScaleY, ScaleZ
.SetPosition PositionX, PositionY, PositionZ
.SetRotation RotationX, RotationY, RotationZ
.SetTexture GetTex("Car1")
End With
Case Is = "carb"
With Cars(ID)
.ScaleMesh ScaleX, ScaleY, ScaleZ
.SetPosition PositionX, PositionY, PositionZ
.SetRotation RotationX, RotationY, RotationZ
.SetTexture GetTex("Car2")
End With
Case Is = "carc"
With Cars(ID)
.ScaleMesh ScaleX, ScaleY, ScaleZ
.SetPosition PositionX, PositionY, PositionZ
.SetRotation RotationX, RotationY, RotationZ
.SetTexture GetTex("Car3")
End With
Case Is = "casd"
With Cars(ID)
.ScaleMesh ScaleX, ScaleY, ScaleZ
.SetPosition PositionX, PositionY, PositionZ
.SetRotation RotationX, RotationY, RotationZ
.SetTexture GetTex("Car5")
End With
Case Is = "care"
With Cars(ID)
.ScaleMesh ScaleX, ScaleY, ScaleZ
.SetPosition PositionX, PositionY, PositionZ
.SetRotation RotationX, RotationY, RotationZ
.SetTexture GetTex("Car5")
End With
End Select
End Sub
:تفسیر الكود
موجود 3dsا مجسم واحد من نوع أنھالسیارات والحظ ھنا نشاءإل مراألھذا أما .ولكن الذي یفرقھا ھو نوع الخامات Data.pakفي ملف أیضا
ى األولالمرحلة إنشاءب اآلنقمنا بتجھیز الكائن الرئیس سوف نقوم أن وبعد اآلن .VirtualLevelsفي DownTownضع الكود التالي في دالة
من مرة لكن أكثرالكود سھل وال داعي لشرحھ فقد تم الحدیث عن فكرتھ الخاص بحركة السیارات والوحوش اقصر مرتجعل األ أن الحظ ھنا یمكنك
.forالتكرار عن طریق استخدام
لیس من دوال مرھذا األ SetCollisionD3dوھو خیراأل مرالحظ األTrueVision نشائھا بعد قلیل وھي تخص إھي دالة سوف نقوم ب إنماو
.التصادم مع السیارات
:نقوم بكتابة دالة التصادم سابقة الذكر اآلن
If PlayerPositionX > CarsPositionX(0) - 40 And PlayerPositionX < CarsPositionX(0) + 60 And PlayerPositionZ < CarsPositionZ(0) + 10 And PlayerPositionZ > CarsPositionZ(0) - 10 Then End
:تفسیر الكود
صاحبة السیارةھذا ھو مقطع من الدالة وھو یخص التصادم مع أن الحظلسیارة Xي حداثلالعب یقع ضمن مجال اإل Xي إحداثا كان إذحیث 0الرقم
0للسیارة Zي حداثلالعب یقع في مجال اإل Zي حداثوفي نفس الوقت اإل 0ومن ثم یحدث حدث True= یكون التصادم قد تم ) عرض السیارة(
.التصادم
باستخدام التكرار أو اتلكافة السیار مرالحظ ھنا یجب علیك كتابة األFor.
الحظ تعرفنا التي خر للتصادم وھي الدالة یمكنك استخدام الشكل اآل أیضا علیھا . GetDistance3Dوھي سابقا
:الدالة الخاصة بالكامیرا في نھایة اللعبة إنشاءنقوم ب