155
ﺗﻤﯿﺰ ﻣﻊ اﻟﻔﯿﺠﻮال ﺑﯿﺴﻚ٢ اﻟﻤﺆﻟﻒ: أﻧﺲ إﺑﺮاھﯿﻢ أﻧﯿﺲ ﻣﺤﻔﻮظ ﯾﺘﻨﺎول اﻟﻜﺘﺎب اﻟﺘﻌﺎﻣﻞ ﻣﻊ اﻟﻤﻠﻔﺎت اﻟﻤﺨﺘﻠﻔﺔ وﺷﺮح ﻣﺒﺴﻂّ وﻣﯿﺴ ﻟﮭﺎ واﻟﺘﻌﺮف إﻟﻰ اﻟﻤﺘﻐﯿﺮات واﻟﻤﺼﻔﻮﻓﺎت ﺑﺎﻹ ﺿﺎﻓﺔ إﻟﻰ اﻟﻤﻮﺿﻮع اﻟﺠﺪﯾﺪ اﻟﻤﻤﯿﺰ أﻻ وھﻮ ﺑﺮﻣﺠﺔ اﻷ ﻟﻌﺎب ﺑﺎﺳﺘﺨﺪام ﻣﺤﺮﻛﺎت ﻣﺨﺘﻠﻔﺔ، ﻛﻤﺎ ﯾﺸﺘﻤﻞ اﻟﻜﺘﺎب ﻋﻠﻰ أﻣﺜﻠﺔ ﻣﺨﺘﻠﻔﺔ ﻟﻠﺸﺮوح ﻣﺮﻓﻘﺔ ﻣﻊ اﻟﻜﺘﺎب. 2014 ﻋﻤﺎن- اﻷردن ﺣﻘﻮق اﻟﻄﺒﻊ واﻟﻨﺸﺮ ﻣﺤﻔﻮظﺔ ﻟﻠﻤﺆﻟﻒ

تميز مع اليجوال بيسك 6 الاصدار 2

Embed Size (px)

DESCRIPTION

الكتاب الجديد في شرح التعامل مع الملفات وبرمجة الالعاب ثلاثية البعد Truevision انس ابراهيم انيس محفوظ

Citation preview

Page 1: تميز مع اليجوال بيسك 6 الاصدار 2

٢تمیز مع الفیجوال بیسك أنس إبراھیم أنیس محفوظ :المؤلف

لھا ومیسر مبسط وشرح المختلفة الملفات مع یتناول الكتاب التعامل الجدید الموضوع إلى ضافةباإل والمصفوفات المتغیرات إلى والتعرف

یشتمل كما مختلفة، محركات باستخدام لعاباأل برمجة وھو أال الممیز .الكتاب مع مرفقة للشروح مختلفة أمثلة على الكتاب

2014

األردن - عمان حقوق الطبع والنشر محفوظة للمؤلف

Page 2: تميز مع اليجوال بيسك 6 الاصدار 2

:اإلھداء

بجھدھا وعنایتھا أھدي كتابي ھذا إلى أمي الغالیة التي لم تبخل علي یوما

، وإلى شقیقي أحمد الذي طالما كما أھدیھ إلى أبي العزیز الذي یساندني دوما

.وقف إلى جانبي وقدم لي الكثیر من أفكاره وآرائھ الثریة والغنیة

من وال یفوتني أن أھدي ھذا الكتاب إلى كل طالب علم یسعى إلى االستفادة

، وإلى كل مصمم العالم الواسع الذي یفتحھ لھ برنامج الفیجوال بیسك

.وألعابھ برامجھیھدف إلى تطویر عملھ وومبرمج

تدقیــــق وفحــص

ابراھیـم انیس محفوظ.أ

Page 3: تميز مع اليجوال بيسك 6 الاصدار 2

المقدمة

البدء ومن ھذا الكتاب والحمد قررت العمل األولىبعد نجاح النسخة

من هللا أنبكتابة النسخة الثانیة كي تكون مكملة لسابقتھا تفید البعض راجیا

احترافھ إلىواالنتقال من عتبة الفیجوال بیسك األمورفي فھم بعض

.والتمیز فیھ

ن هللا تعالى مواضیع مھمة ومختلفة إذتناول بنسوف اإلصدارھذه في

سوف تجعل القارئ یشعر بمتعة التطبیق والبرمجة من جھة والتعلم من

.خرىأجھة

وشرح مبسط ،عن التعامل مع الملفات المختلفةھذا الكتاب في تحدث نس

لى الموضوع إ ضافةإللى المتغیرات والمصفوفات باإوالتعرف ،لھا ومیسر

باستخدام محركات مختلفة، كما لعاباألال وھو برمجة أالجدید الممیز

.مثلة مختلفة للشروح مرفقة مع الكتابأ یشتمل الكتاب على

ي .ذن هللا عزوجل بإ إعجابكمینال ھذا الكتاب أن أمل كل

القصدوهللا من وراء

Page 4: تميز مع اليجوال بيسك 6 الاصدار 2

الفھرس

ن نبدأ أقبل یلزمماذا :التمھید -

:الوحدة التاسعة

مھمةالمتفرقات الالتعامل مع الملفات و

)١(التعامل مع الملفات -١ )٢(التعامل مع الملفات -٢ جیدةالبدایة الوفات وفالمص -٣ )١(دوال متنوعة مھمة -٤ )٢(دوال متنوعة مھمة -٥

: العاشرة الوحدة

لعاباألالبدایة في برمجة

ومحركاتھا لعاباألنبذة عن برمجة -١ للعمل TrueVision3Dعداد محرك إ -٢ )HelloWorld(برمجة رسالة -٣ لتسھیل العمل Class Moduleعداد إ -٤ كسائھا وتعدیلھاإو Meshمجسمات إضافة -٥ وتعدیلھا Mdlمجسمات إضافة -٦ )Terrain( رضاأل إضافة -٧ )SkyBox(السماء مكعب إضافة -٨ )Camera Control 1(بالكامیرا التحكم -٩

)Camera Control 2(التحكم بالكامیرا -١٠ )Movement&Collision1(والتصادم الحركة -١١ )Movement&Collision2(والتصادم الحركة -١٢ Bspخرائط إضافة -١٣

Page 5: تميز مع اليجوال بيسك 6 الاصدار 2

)١(تطبیقات متنوعة -١٤ )٢(تطبیقات متنوعة -١٥ )١(عمل لعبة بسیطة -١٦ )٢(عمل لعبة بسیطة -١٧ )٣(عمل لعبة بسیطة -١٨ لتطبیقات مستقبلیة فكار متنوعة أ -١٩

Page 6: تميز مع اليجوال بيسك 6 الاصدار 2

:ن نبدأأ قبل ماذا یلزمنا

ذا إما أ ٦لمام البسیط بلغة الفیجوال بیسك إلال یتطلب منك الكثیر سوى ا

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

یمكنك التحمیل من ھنا و ،مثلةمدعم باألوالكتاب مجاني http://www.kutub.info/library/book/6493

نترنت إل یمكنك تحمیل الكتب المختلفة من مختلف المواقع على اأو

بزیارة الموقع التالي لتحمیل الكتب أنصح وشخصیاhttp://www.kutub.info/

اذا لم تكن االمثلة والبرامج المساعدة مرفقة مع الكتاب یجب ::مھم جدا .علیك القیام بتحمیلھا من الروابط التالیة

http://www.4shared.com/rar/4wao9A-Oba/_online.html

وبرامج سوف نستخدمھا sdkتشمل ملفات ( لتحمیل البرامج المساعدة :وھي من الرابط التالیـ ) الحقا ویجب علیك امتالكھا قبل البدأ

http://www.4shared.com/rar/MJHwZIqMba/__online.html

Page 7: تميز مع اليجوال بيسك 6 الاصدار 2

الوحدة التاسعة

سوف تتناول ھذه الوحدة موضوعات مھمة في التعامل مع الملفات من فتح مصفوفاتبدایة جیدة في ال إلى ضافةملف والكتابة والتعدیل علیھ باإل

كما تحتوي على شروح لبعض الدوال التي لم یرد ذكرھا في ،والمتغیراتالمتنوعة والشاملة األمثلةمن ھذا الكتاب مع العدید من األولصدار إلا

. األكوادلمختلف الدروس والشرح المفصل لكامل

ما بالنسبة ألھمیة ھذا الوحدة فھي مھمة أ قد یحتاج المبرمج في كثیر و ،جداقد أو استخدام معلومات معینة مخزنة ومحفوظة في ملف إلىمن االحیان

تلك إلىتخزین معلومات في ملف اخر لكي یتسنى لھ الرجوع إلىیحتاج لغة من استخدام بأيقد ال یخلو برنامج مصنوع أو وقد نحتاج. المعلومات

ین لذلك ینبغي على المبرمج مر معأ استخدام دوال لعملأو المصفوفات .المعرفة بھا ولو معرفة بسیطة

كما أو مثلةسلوب األأ وكما تعودنا في الوحدات السابقة فسوف نستخدم ) .بالمثال یتضح المقال(یقال

Page 8: تميز مع اليجوال بيسك 6 الاصدار 2
Page 9: تميز مع اليجوال بيسك 6 الاصدار 2

)١(التعامل مع الملفات :األولالدرس

المشروع وحفظھ في إنشاءفي البدایة نقوم بتشغیل برنامج الفیجوال بیسك ونقوم ب . مجلد مسبق

ولي كالتاليأ بكتابة الكود سوف یكون بشكل أعندما نبد :مالحظة

Open FilePath for Action as #1

………

Close #1

سوف یكون امتداد filepath مرمر فتح الملف واألأ open مرحیث یمثل األأو دخال للبیاناتإالفعل الذي سوف یتم وسوف یكون actionالملف المراد فتحھ و

.غالق للملف إ closeخراج لھا والفعل إ

فرضا والكتابة بداخلھ \:dالموجود على قرص ali.txtردنا فتح الملف أ نھ لوأ يأ :كما یلي) مراأل(مثال سوف یكون شكل الكود khaldكلمة

Open "d:\ali.txt" for output as #1

Print #1,"khald"

Close #1

:تفسیر الكود

ھو لفتح الملف كما ورد open أمر أمرامتداد الملف الكامل و d:\ali.txtو سابقاoutput أمرو الكتابة على الملف أمرھو print#1 الطباعة و أمرھوdekhal

غالق الملفإل close#1الكلمة المراد طباعتھا على الملف و

لو كان امتداد الملف غیر موجود سوف outputالكتابة أمر في : مالحظة مھمة .االمتداد إنشاءیقوم جھاز الحاسوب ب

Page 10: تميز مع اليجوال بيسك 6 الاصدار 2

)١(المثال

)مجلد البرنامج داخللیكن الملف (ملف والكتابة بداخلھ إنشاءسنقوم بھذا المثال ب

كما ترید أو كما یلي) from(قم بجعل شكل النموذج :أوال

التي تمثل اسم text1سوف یحمل قیمة األولفي البدایة نقوم بتعریف متغیرین ییره احببت تغ إذاال إ) txt.(ن امتداد الملف سوف یكون فرضا أ الملف مع العلم

:كما یلي text2خر سوف یحمل قیمة آمتغیر ب

Dim filename as string, filetext as string

كما تعلمنا ... سابقا

نھ عند النقر یاخذ القیمةأ ثیمة المتغیرین في الزر حیتعریف قنقوم ب

Filename = text1.text

Filetext = text2.text

نضع ھذا الكود في الزر أیضا

If filename <> "" then

Open app.path + "\" + ilename + ".txt" for output as #1

Page 11: تميز مع اليجوال بيسك 6 الاصدار 2

Print #1, iletext

Close #1

Else: msgbox ("err in name") , vbexclamation

End if

:تفسیر الكود

أیبد) الفراغ(قیمة filenameنھ لو لم تساوي قیمة أ يأ وھو شرط األولالسطر في حال كان صندوق اسم الملف یحوي مرجل تنفیذ األأ وھذا الكود من ،تنفیذ الشرط

.على اسم

:لكن انتبھ ،لفتح الملف أمر السطر الثاني

امتداد البرنامج سوف ینتھي باسم وألن ،امتداد البرنامج إلىیشیر app.path مراألیضاح النقطة إویمكن "\"شارة إولن یحتوي على ،المجلد الحاوي على البرنامج

حمد لكن نحن أن ھذا امتداد لمجلد اسمھ أسوف نالحظ c:\ahmedبالمثال التالي وحتى یكون المسار صحیح ،الملف داخل المجلد إنشاءنرید ن یكون على أیجب ا

"\" إضافةولذلك قمنا في السطر ب :ahmed\c\الشكل التالي

ھي امتداد الملف "txt."ن أو الحظ text1.textفھي قیمة filenameما أ .الكتابة أمر ھي outputتریده و الذيویمكنك تغیره حسب االمتداد

على الملف filetextلكتابة ما ھو موجود في المتغیر أمر ما السطر الثالث فھوأ

.غالق لقراءة الملفإما السطر الرابع فھو أ

ما السطر الخامس فھو في حالة عدم تحقق الشرط سوف تظھر رسالة تحذیر أ)exclamation (تخبر المستخدم بوجود خطأ في اسم الملف.

.الشرط ألنھاالسطر السادس

:شكل الكود كما یلي

Page 12: تميز مع اليجوال بيسك 6 الاصدار 2

كثر من سطر أ یمكنك من الكتابة في صندوق النص ال إضافةنھ عند أ الحظ :تذكیر trueواجعلھا ) MultiLine(لذلك قم فقط بتعدیل خاصیة السطر المتعدد

المثال مرفق مع الكتاب ر تذكی

Page 13: تميز مع اليجوال بيسك 6 الاصدار 2

:)٢(التعامل مع الملفات :الدرس الثاني

وسنتعرف في ھذا الدرس ،الكتابة على الملفاتفي الدرس السابق تعرفنا على طریقة على كیفیة استعراض معلومات مخزنة على ملفات موجودة - ن شاء هللا تعالىإ -

.مسبقا

)٢(مثال

زر حفظ لھ كما في الشكل إضافةسنقوم بھذا المثال بالتعدیل على المثال السابق و

المتغیر على نص الملف في البدایة نقوم بتعریف متغیر نصي سوف یحتوي ھذا :المراد قراءتھ كما یلي

Dim DataText as string

OpenFileنقوم بكتابة الكود التالي داخل الزر المسمى

FileName = Text1.Text

Open app.path + "\" + ilename + "txt" for input as #1

Input #1,datatext

Close #1

Text2.text = datatext

Page 14: تميز مع اليجوال بيسك 6 الاصدار 2

. Input أمر ن الفرق كان فيأ إلىن الكود یشبھ كود الكتابة أ نالحظ

:تفسیر الكود

التي ھي اسم text1.textیحمل قیمة filenameلجعل المتغیر األولالسطر .الملف

.ما السطر الثاني فھو واضح، الكود لفتح الملف للقراءةأ

سوف یقرأ البیانات أنھالحظ األولالسطر والسطر الثالث لقراءة البیانات في والثاني األولردنا قراءة السطر أ ذاإما أ فقط من الملف األولالموجودة في السطر

تحمل قیمة البیانات –كما سوف نتعلم الحقا –مصفوفة أو متغیر إنشاءمثال نقوم ب ونقوم بالتالي

Input #1,datatext(0) - األولللسطر

Input #1,datatext(1) - للسطر الثاني

.....وھكذا

.غالق الملف من القراءةإلما السطر الرابع فھو أ

٢) TextBox(السطر الخامس فھو لعرض المحتوى في صندوق النص

كانت ھذه مقدمة بسیطة للتعامل مع الملفات فقد یحتاج المبرمج من حین :مالحظةلیھا في وقت إتخزین الملفات على ملف خارجي عن البرنامج للعودة إلىخر آ إلى

بالبحث في اإلضافیةیمكنك الحصول على المزید من الدروس والمعلومات . خر آ .... اإلنترنتشبكة

...ن المثال مرفق مع الكتاب أتذكر ا أخیرو

Page 15: تميز مع اليجوال بيسك 6 الاصدار 2

المصفوفات وبدایة جیدة: الدرس الثالث

تخزین كمیات إلىالمصفوفات مھمة بشكل عام في البرمجة فقد یحتاج المبرمج كبیرة من البیانات والطریق السلیمة في تخزینھا لتسھیل الرجوع علیھا ھي تخزینھا

أو والمصفوفة ھي سلسلة تحتوي مجموعة من البیاناتحفظھا في مصفوفة، أو حد ما إلىلغات البرمجة تشبھ والمصفوفة فيالعناصر مرتبة فیھا بشكل منتظم،

.المصفوفات في الریاضیات

ببساطة وجدیة معا لكي مور مور كثیرة منھا بل سوف ناخذ األأ إلىتطرق نلن . مورالنزید تعقید األ

:شكل المصفوفة یكون كما یلي

A11=9 || A12=8 || A13 = 6

A21 =1|| A22=2 || A23 = 7

A31 =4|| A32=9 || A33 = 2

:وھكذا حیث یكون الترتیب كما یلي

.نواع المصفوفات سوف ندرس شكلین فقطألن ندخل في تصنیف و اآلن

Data(0 to N) األولالشكل

Data = array("n1","n2",…..)الشكل الثاني

Page 16: تميز مع اليجوال بيسك 6 الاصدار 2

)٣(المثال

وفات، نبدأ بشتغیل برنامج الفیجوال ففي ھذا المثال سوف نوضح استخدام المص . ٦بیسك

:یمكنك تعدیلھ حسب رغبتكأو كما یلي) Form(نقوم بعمل شكل النموذج

) على شكل مصفوفة(الھدف من البرنامج تخزین قیم الصنادیق الثالث في متغیر وطباعة جمعھا، وعلیھ نقوم بتعریف المتغیر الذي سیحمل القیم

Dim Data(0 to 2) as string

یعد data(0)ن الصفر محسوب حیث أ يأ ماكن تخزینأ ٣ن المتغیر یحمل أ الحظ نھ لوأ يأ ،ھو المتغیر الثالث data(2)ھو المتغیر الثاني و data(1)متغیر و

.data(0to8)قیم مثال سوف یكون شكل المتغیر كالتالي ٨ردنا تخزین أ

:األولنقوم بوضع الكود التالي داخل الزر

data(0) = text1.text

data(1) = text2.text

data(2) = text3.text

msgbox data(0) + data(1) + data

:تفسیر الكود

والثاني والثالث یجعل المتغیرات تحمل قیم الصنادیق الثالثة على األولالسطر ).حادیةألنھا كالمصفوفة اأ نالحظ(الترتیب

Page 17: تميز مع اليجوال بيسك 6 الاصدار 2

ن المتغیر ھو نصي أ رسال رسالة بحاصل جمعھم، طبعا بماالسطر الرابع وھو إل عرفناه كما نما تكون إو ،لن تكون عملیة الجمع عملیة عددیة as string سابقا

:كالتالي

"anas" + "anis" = "anasanis"

"a" + "b" + "c" = "abc"

"102" + "a" + "5*%" = "102a5*%"

لكن لو كان متغیر عددی ا رقامأال إلن یقبل as singleمثال ا وسیكون الجمع عددی ا ا :كالتالي

120 – 5 = 115

ضع ھذا الكود في ،واستخدام مصفوفة خاصة بھا arrayدالة إضافةسنقوم ب اآلن ) .Command2( ٢الزر

Data2 = array("a","b","c","d")

Msgbox data2(3) + data2(1) + data2(2) + data2(0)

ھذه الدالة نالحظ أن . 0من الرقم تخزن القیم ابتداء أیضا

:الكودتفسیر

:نأ یخزن البیانات داخل المصفوفة حیث األولالسطر

Data2(0) = "a"

Data2(1) = "b"

.وھكذا

السطر الثاني یقوم بجمع البیانات كما بینا ماھیة الجمع :سابقا

.كما یمكن بالطبع تعدیل الكود aثم cثم bثم dیبدأ بجمع

Page 18: تميز مع اليجوال بيسك 6 الاصدار 2

:الشكل النھائي للكود

وف تھمنا بعد التقدم وتتناول موضوعات س ،جیدة في المصفوفاتكانت ھذه مقدمة .في ھذه المادة

.نترنت المختلفةإلكثر من خالل زیارة مواقع اأ یمكنك االطالع

)٣( ن المثال مرفق مع الكتاب باسم المثالأ تذكر

Page 19: تميز مع اليجوال بيسك 6 الاصدار 2

)١(دوال متنوعة ومھمة : الدرس الرابع

العملیات الریاضیة تؤدي وتلعب دورا مھم من التعرف على بد في البرمجة لذلك ال االدوال المتعلقة بھذه العملیات، لذلك ھذا الدرس سیكون مخصصا للحدیث عن ھذه

.لة حسابة تشمل ھذه الدوال كتطبیق على ھذا الدرسآوبعدھا عمل .الدوال

Sinدالة الجیب

استخدام جمیع إن ھذه الدالة تستخدم في الحصول على جیب زایة ما واستخدامھا بل :ویكون على النحو التالي ،ماالدوال الحسابیة سھل نوعا

X = sin(angle الزاویة)

Cosدالة جیب التمام

:یجاد جیب تمام الزاویة واالستخدامإمثل سابقتھا لكن تستخدم في

X = Cos(angle)

Tanدالة ظل الزاویة

یجاد ظل الزاویة كما یمكن إھذه الدالة فتقوم بأما حسابھ من خالل الدالتین أیضاویكون استخدام ھذه ،جیب التمام/الجیب= السابقتین باستخدام العالقة الریاضیة الظل

:الدالة على النحو التالي

X = tan(angle)

Absدالة القیمة المطلقة

مثال لو كان داخلھا ،عدد الذي یوجد داخلھالعطاء القیمة المطلقة لإھذه الدالة تقوم ب :استخدامھا فھو كباقي الدوالأما وھكذا، ٢٥سیكون ناتج القیمة المطلقة ٢٥ –العدد

X = abs(number)

Roundقرب منزلة عشریة أ إلىدالة التدویر

Page 20: تميز مع اليجوال بيسك 6 الاصدار 2

قرب منزلة عشریة یحددھا المبرمج مثال لو كان أ إلىھذه الدالة ستقوم بتدویر الرقم قرب منزلتین عشریتین سیكون ناتج أ إلىراد المبرمج تدویره أو 12.276الرقم

استخدام الدالة یختلف قلیال عن باقي الدوال فیكون على النحو . 12.28التدویر :التالي

X = round( الرقم المراد تدویره, لیھاإ رعدد المنازل المراد التدوی )

مالحظة مھمة النظام المستخدم في قیاس الزوایا في الدوال السابقة :جدا)tan,sin,cos ( ھو النظام الدائريRadian) (خدم قیم تن تسأ وعلیھ یجبPi

:النظام الستیني عن طریق العالقة التالیة إلىویمكنك التحویل ،لتحدید الزاویة

X= ang * pi / 180

كما سوف یوضح المثال التالي الفكرة

)٣(المثال

،قیم الجیب وجیب التمام وظل الزاویة إیجادفي ھذا المثال سنصنع االلة حاسبة تقوم بمنزلة عشریة إلىتقریب عدد ما إلى ضافةعداد باإلالقیمة المطلقة لأل إیجادقوم بنكما

.واحدة

.مشروع جدید علیھ إنشاءو ٦الفیجوال بیسك برنامجنقوم في البدایة بتشغیل

:كالتالي) Form(ج نجعل شكل النموذ

Page 21: تميز مع اليجوال بيسك 6 الاصدار 2

:ولیكن واألعداد،نقوم في البدایة بتعریف المتغیر الذي سوف یحمل قیمة الزاویة

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)یحمل المتغیر : األولالسطر النظام الستیني عن طریق العالقة الواردة إلىبتحویل الزاویة من النظام الدائري

ن النظام الستیني یعتبر مفھومأذ إ ،سابقا .كثر من قرینھ الدائريأ لدى المستخدم ا

.رسال رسالة للمستخدم تحمل قیمة الجیب للزاویةإ :الثانيالسطر

Page 22: تميز مع اليجوال بيسك 6 الاصدار 2

ن قیم جیب الزاویة تكون دقیقة أ كما یمكنك المالحظة لكن یمكنك تقریب الزاویة جدا :وسوف یكون شكل الكود كالتالي 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بوضع الكود التالي في زر أیضا

Xnumber(3) = Abs(Val(InputBox("Number::", "Abs")))

MsgBox Xnumber(3)

اإلدخالذ ھنا یتم عرض صندوق إھ ن ھذا الكود یختلف عن سابقأ نالحظ أوال InputBox دخال القیمة داخلھ ومن ثم عرض القیمة المطلقة لھ على شكل إوتتم

.رسالة نصیة

:تفسیر الكود

سوف یحمل القیمة المطلقة لما یوجد داخل Xnumber(3)المتغیر : األولالسطر عدد لذلك ھناك یكونن أ ال بد absن داخل أ ، ونالحظ absقواس القیمة المطلقة أ

ظھار إلفھي InputBoxدالة أما عدد، إلىالنص لوھي لتحوی Valاستخدمنا دالة .القیمة المطلقة لھ إیجاددخال العدد المراد إدخال للمستخدم یقوم المستخدم بإصندوق

Page 23: تميز مع اليجوال بيسك 6 الاصدار 2

ظھار رسالة للمستخدم تحمل قیمة المتغیر إلبسیط وھو : السطر الثانيXnumber(3).

Roundنقوم بكتابة الكود التالي داخل زر

Xnumber(4) = Round(Val(InputBox("Number::", "Round")),2)

MsgBox Xnumber(4)

منزلتین عشریتین إلىنھ تم استخدام دالة التقریب أال إھذا الكود یشبھ سابقھ

:شكل الكود النھائي

.ن المثال مرافق مع الكتابأتذكر

)٢(دوال متنوعة :الثانيالدرس

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

Str سالسل نصیة إلى واألرقام األعداددالة تحویل

ھذه دالة مھمة قیمة نصیة إلىیجب تحویل قیمة رقمیة األحیانفي بعض ،جداسوف . األعدادھذه العملیات على إجراءیصح عملیات مختفلة علیھا ال إلجراء

Page 24: تميز مع اليجوال بيسك 6 الاصدار 2

شكلھا فیكون أما .تتعرف قیمة ھذه الدالة عن التقدم في الفیجوال بیسك بشكل عام :كالتالي

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 الدالة

Page 25: تميز مع اليجوال بيسك 6 الاصدار 2

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 ….. عند عدم وجود اي تطابق

)٣(المثال

ھذا المثال بتوضیح بعض الدوال عن طریق تجریبھا، نبدأ بتشغیل في سوف نقوم :ونجعل شكل النموذج كما یلي ٦برنامج الفیجوال بیسك

Page 26: تميز مع اليجوال بيسك 6 الاصدار 2

) 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یخزن قیمة االقتطاع في الثابت :السطر الثالث

Page 27: تميز مع اليجوال بيسك 6 الاصدار 2

.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

.ذا كانت نتیجة المقارنة صحیحة سوف یغلق البرنامجإ: السطر الثاني

:شكل الكود النھائي یكون كالتالي

Page 28: تميز مع اليجوال بيسك 6 الاصدار 2

المثال مرفق مع الكتاب أن تذكر

Page 29: تميز مع اليجوال بيسك 6 الاصدار 2

الوحدة العاشرة

فرعصبحت أنھا أحد أوال ینكر ،تتقدم بشكل دائم ومستمر لعاببرمجة األ ا

مھم والتطبیقات لعاببل وال یستھان بھ من البرمجة، فقد بدأت األ االھواتف الذكیة إلىوتعدتھا ،جھزة الحاسبأالرسومیة المختلفة تغزو

.وغیرھا

فقد سلكت مداخل مختلفة مع تطور لعابتختلف طرق تصمیم وبرمجة األ ألعابعلى محرك لعابفي ھذه الوحدة سوف نبدأ بتعلم برمجة األأما ،العلم

عتبره محركأوھو محرك Truevision3D )مكتبة دوال برمجیة ( جید ا ا،وقوی C#،C++،Delphi،visualbasic.netویدعم لغات مختلفة وكثیرة مثل ا

. visualbasic نھ یدعم لغةأ واألھم

لكن توجد دروس ،قلیلة نوعا ما Truevision3dالدروس العربیة على مكتبة ن ھذا الوحدة سوف تجعل متمكنأكما األجنبیة،جیدة لھذه المكتبة باللغات منھا ا

.حب الشئ نجح فیھ أا وحدة ممتعة وتختلف عن سابقتھا فمن أنھمن ذلك واألھم

فھم جید لبرمجة إلى الىن هللا تعإذدروس سوف تنقلك ب إلىھذه الوحدة مقسمة سوف نتحدث في ھذه الوحدة عن ، ثالثیة البعد كاملة تقریبا ألعاب إنشاءو ،لعاباأل

ن محرك أمع العلم 2D إلىولن نتطرق 3D ثالثیة البعد لعاببرمجة األTrueVision یملك عدد كبیر ا .2dفي مجال ) Functions( من الدوال ا

نبدأ بتوفیق هللا

Page 30: تميز مع اليجوال بيسك 6 الاصدار 2

ومحركاتھا لعابنبذة عن برمجة األ :األولالدرس

لكن OpenGlأو DirectX مكتبتي باستعمال لعاباأل ببرمجة یبدأون الكثیرون وقرینھ DirectX ألن مشھور ألعاب بمحرك یبدأ نأ ءالبد یرید من أنصح ناأ

OpenGl جمیع محركات . ئالمبتد للمبرمج خصیصا الصعوبة غایة في ھما لعابفمكتبة األ DirectX & OpenGlتم برمجتھا باستخدام باألساسھي لعاباأل

.التطبیق الرسوميأو الف الدوال التي تسھل على المبرمج صنع اللعبةآ إالماھي

ھا بتقوم في البدایة بصنع محرك خاص لعابغلب شركات صناعة وبرمجة األأ .Rageصاحبة المحرك RockStarمثال ھذه الشركات أومن ،ھاألعابلتطویر

ل العم علیھ بل ،وصنع محرك لھ ،البدایة من الصفرلیس بالضروري على المبرمج ن المحرك الذي سوف ینتجھ لن أخرى كما أ على محركات قامت ببرمجتھا شركات

.ن لم یكن یملك الدعم الفكري والماليإیكون بكفاءة باقي المحركات

موجودة ألعابیمكن على المبرمج المتقدم تطویر محركات مختلفة ومفتوحة و سابقا .ووضع الدوال التي یرید) OpenSource(المصدر

البرمجة في صناعة اللعبة مثل + مختلفة تستخدم التصمیم ألعابھنالك محركات unity وunreal إلىخرى تستخدم البرمجة للوصول أ ألعابكما توجد محركات

.OgreSdkو Xnaاللعبة مثل

ھو من الصنف الثاني ) TrueVision3d6.2(المحرك الذي سوف نستخدمھ أما .وھو محرك سھل التعلم سلس االستعمال

عدد TrueVisionیحوي محرك كبیر ا و 3dمن الدوال المتخصصة في اودوال للبرمجة ) Scenes(والمشاھد ) Effects( ثیراتأوالت واإلدخالالتصادم

. لعابثنائیة البعد وغیرھا لذلك سوف یسھل علینا صنع األ

المجسمات والخرائط على برامج خارجیة مثل إنشاءھذه المادة یمكنك بعد التقدم في . TrueVision إلىومن ثم تصدیرھا 3dmaxبرنامج

والملفات التي ) Texture(والخامات ) Models(والمجسمات األمثلةجمیع :تذكر .ن شاء هللا إسوف تحتاجھا ستكون مرفقة مع الكتاب

للعمل TrueVision3Dمحرك إعداد :الثاني الدرس

Page 31: تميز مع اليجوال بيسك 6 الاصدار 2

ملفات، المكتبة 6.2 اإلصدار true vision 3dفي البدایة سنستعمل محرك الفیجوال إلىالمكتبة إضافةن نشرح أمرفقة مع الكتاب في مجلد برامج مساعدة قبل

:أموربیسك یجب مالحظة عدة

إنما الملفات التي سوف و ،المكتبة الملحقة مع الجھاز لیست المكتبة الكاملة لھ .تضمنھا المكتبة الكاملة التي نحتاجھا

المساعدة یمكنك تحمیلھا من مورالمكتبة الكاملة تحوي مجموعة من البرامج واأل :الموقع التالي

٦.٢ صدارنحن سوف نقوم بالشرح والعمل والتطبیق على اإل

:دناهأات قد تحتاج الیھا من الموقع تأثیریمكنك تحمیل مجسمات وخامات و

والخامات والمجسمات والبرامج المختلفة والمساعدة وكل ما مثلةن جمیع األأ :تذكر سوف نتطرق لھ في ھذا الكتاب یكون مرفق .معھ ا

المكتبة وتعریفھا على الجھاز الخاص بك قم بفتح الملفات المساعدة ضافةإل اآلناالمتداد إلى DLLوقم بنسخ الملفات ذات االمتداد TrueVision3Dواختر ملف

\c:\windows\system32التالي

الذي سوف یقوم بتعریفھا في مسجل setup.batوبعد ذلك قم بتشغیل ملف .النظام

او اعلى windows 7اذا كان نظام التشغیل الخاص بك من نوع :مالحظة مھمة Run asواختر الخیار setup.batملف قم بالنقر بزر الفأرة االیمن على

administrator.

التي سوف لعابمع األ TrueVision3dیفضل وضع الملفات الموجودة في مجلد یتسنى أخرىجھزة حاسوب أ إلى لعابردت نقل األأتقوم ببرمجتھا وذلك النك لو

.لھا العمل بالشكل المطلوب

Page 32: تميز مع اليجوال بيسك 6 الاصدار 2

:الفیجوال بیسك إلىالمكتبة إضافةكیفیة

.٢نقوم بتشغیل برنامج الفیجوال بیسك -١ Referencesومن ثم ننقر على Projectsبعد ذلك نقوم باختیار الئحة -٢ونختار الملف TrueVision3Dونفتح مجلد Browseومن ثم ننقر على -٣

Truevision3D.dll كما یلي:

.بالطریقة نفسھا tvmedia.dllو dx8vb.dllالملفین إضافةنقوم ب -٤ :باختیار المكتبة عن طریق تحدیدھا كما یلي نقوم -٥

یتوجب أنھي أعمل مشروع جدید دنقوم بتكریر العملیة عن :مالحظة مھمة

تقوم بتكرار أن الملفات في كل مشروع لكن لیس بالضروري إضافةعلیك .refrencesالفیجوال سوف یحفظھا في ألن ٤-٢الخطوات من

Page 33: تميز مع اليجوال بيسك 6 الاصدار 2

)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: وامردخال الخاص بتنفیذ األھذا المتغیر ھو متغیر اإل .عند الضغط على زر ما

.سماء المتغیرات على ھواك أیمكنك تغیر أنھتذكر :مالحظة مھمة

Page 34: تميز مع اليجوال بيسك 6 الاصدار 2

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

V8.Clear

Scene.DrawText "HelloWorld", 0, 20

Scene.RenderAllMeshes

V8.RenderToScreen

Page 35: تميز مع اليجوال بيسك 6 الاصدار 2

Loop

:تفسیر الكود

فیجب ،ن جمیع ھذه المتغیرات ھي كائنیةأبما :الثالث+ الثاني + األولالسطر .علینا تعریف المتغیرات

وھنا اخترنا لیكون ) ي یحدد مكان العرضأ(ھذا الكود یحدد السواقة : السطرالرابع .مكانا للعرض) form( النموذج

سوف یكون شكل ) FullScreen(ن تجعل الشاشة كاملة أردت أ ذاإ :مالحظة مھمة :الكود كالتالي

V8.Init3DFullscreen 1024, 768, 32

.بعاد الشاشة الخاصة بكأیرھا حسب یتغ ال تنس فبعاد الشاشة أھي األرقامھذه

RGBلوان أیقوم ھذا الكود بتحدید لون خلفیة الشاشة لكن بنظام : السطر الخامس .من ھذا الكتاب األول صدارالذي تحدثنا عنھ في اإل

لن یتم عرض مرلو لم تضع ھذا األ أنھوھو لعرض الفورم الحظ :السطر السادس لو حددنا الشاشة فال یوجد داع أما حددنا النموذج مكانا للعرض ألنناالنموذج ولذلك

.مرلكتابة ھذا األ

في كل أمر أھمھذا Doالسطر السابع ھو لعمل التكرار :الثامن+ السطر السابع ألنر وذلك تمتوضع متغیرات الرسم في العالم داخل تكرار مس أن یجب نھماسبق أل

متكرر یتم مسحھ باستمرار وھكذا یتم Frameعرض اللعبة یكون على شكل یكون موجود أن حبذأزلتھ لكن أالسطر الثامن فال ضیر لو أما .العرض في كل ا .مشروع

ولن ة،ح ما ھو موجود على الشاشة وھي مھممسھذه الدالة تقوم ب: السطرالتاسعتكون اللعبة لعبة دون ھذه الدالة مثال لو قمنا بعمل صندوق یتحرك ولم نقم بكتابة

لكن في محرك فسیقوم المحرك برسم الصندوق على طول فترة حركتھ ،مرھذا األTrueVision مرلعرض دون كتابة ھذا األلن تتم عملیة ا.

على الشاشة HelloWorldسوف تقوم بكتابة التي ھذه الدالة : السطر العاشر

الثالث فھو أما ي السیني لھا حداثاسم الكلمة والثاني ھو اإل األولحیث الخیار ).X,Yي لنقاطإحداثیتم الرسم على شكل (ي الصادي حداثاإل

Page 36: تميز مع اليجوال بيسك 6 الاصدار 2

لیسھذا السطر :السطر الحادي عشر في الوقت الحاضر فھو خاص ضروریان أفضل ألكن ) X/.3DS.(ذات االمتدادات Meshبعرض المجسمات من النوع

.تعتاد على كتابتھ

مھم لعمل البرنامج لھ عالقة في سواقة المحرك أمروھو : السطر الثاني عشر .رئیسي ولن یعمل البرنامج من دونھ أمركتابتھ فھو ،التنس

do + events + loopوھو لتكرار : خیرالسطر األ

:یكون شكل الكود كما یلي

:شكل البرنامج بعد العمل كالتاليأما

Page 37: تميز مع اليجوال بيسك 6 الاصدار 2

لتسھیل العمل ClassModuleعداد إ:: الرابع الدرس

ھذا الدرس مھم فعلى سبیل ،لعابخصوصا عند التطور في برمجة وتطویر األ جدامجسم سیارة نشاءإل وامرواأل األسطرنقوم بكتابة عدد كبیر من أن المثال بدل من

في ھذا ، دخال البیانات الكافیةإنقوم بكتابة دالة تقوم بدورھا بعمل المجسم بعد ،مثال truevisionعداد إالدرس سوف نقوم بعمل كائن ووضع دالة بداخلھ تقوم ب

.خرىأفي برامج )ClassModule(بسرعة ویمكنك استغالل ال

)٢(المثال

المكتبة كما تعلمنا في إضافةالفیجوال بیسك و برنامجنقوم بتشغیل .سابقا

سمیھ أا سوف أن كما في الشكل وقم بتسمیتھ كما ترید ClassModule إنشاءنقوم بWorld3D مثال:

Page 38: تميز مع اليجوال بيسك 6 الاصدار 2

ووضع متغیرات المحرك فیھ Module إنشاءومن ثم نقوم ب

كما یلي

متغیرات المكتبة كما یلينقوم بتعریف

Public V8 As TVEngine

Public Scene As TVScene

Public Inp As TVInputEngine

تم شرحھا .مسبقا

Page 39: تميز مع اليجوال بيسك 6 الاصدار 2

.نقوم في البدایة بكتابة دالة لتعریف المتغیرات

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 وھي لتحدید .نافذةأو كان العرض شاشة كاملة ا ماإذ

Page 40: تميز مع اليجوال بيسك 6 الاصدار 2

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

Page 41: تميز مع اليجوال بيسك 6 الاصدار 2

.Create_Handl True, Me.hWnd, 1024, 768, 32

End With

Me.Show

Do

DoEvents

Vworld.EndWhenPressEscape

V8.Clear

V8.RenderToScreen

Loop

العرض في شاشة كاملة لو + قمنا باستخدام المتغیر الذي عرفناه أنھنالحظ .العرض یصبح في نافذة falseجعلنا القیمة

شكل البرنامج

Page 42: تميز مع اليجوال بيسك 6 الاصدار 2

المجسمات واالضاءة إنشاءیمكنك استخدام البرمجة الكائنیة في :مالحظات مھمةا في الدروس القادمة فلن أن أما .ات لتسھیل العمل علیكتأثیروال صواتواأل

ستخدمھا أ كل مبرمج ألنیفضل على القارئ عملھا وذلك أمور ا نھوذلك أل ،كثیرایختلف في تفكیره عن غیره لذلك سوف نسیر على الطریقة القدیمة لكن مع التقدم

.والممارسة سوف تجد نفسك تسخدم البرمجة الكائنیة في مختلف برامجك

المثال مرفق مع الكتاب أن تذكر**

Page 43: تميز مع اليجوال بيسك 6 الاصدار 2

كسائھا وتعدیلھاإو 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والمحور : الشكل التالي إلىوحتى تفھم ما یجري انظر

Page 44: تميز مع اليجوال بيسك 6 الاصدار 2

نحدد أن نقوم بتحدید حجم الصندوق یجب أن وعندما نرید على ثالث محاور أیضاأو وكذلك الدوران یكون على المحاور الثالث) الطول،العرض،االرتفاع(وھي

.على محورأو محورین

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( واالرتفاع

وھو لتحدید موقع المكعب كما بینا : السطر الرابع .سابقا

Page 45: تميز مع اليجوال بيسك 6 الاصدار 2

Xیدور على محور أنھاتجاه دوران الجسم نالحظ أو وھو لدوران :السطر الخامسدرجة عن محور ٨٠درجة وبمقدار ٢٠بمقدار Yدرجة و عن محور ٤٥بمقدار

z .

لذك ) Radian(النظام التلقائي للمحرك ھو النظام الدائري أن تذكر: مالحظة مھمة شرحنا ذلك . النظام الستیني إلىال تنسى التحویل الكود التالي إضافةویكون ب سابقا

V8.SetAngleSystem TV_ANGLE_DEGREE

تعرفنا بالسابق rgbaالدالة أن وھو لتحدید لون المكعب الحظ: السطر السادسذه الدالة یعني في ھ aرمز أما RGBتحدد ب TrueVisionفي لوانن األإعلى

غیر شفاف على ( ١ إلى) شفاف غیر مرئي ( 0من الرقم شفافیة المجسم وھو .0.2وھنا كانت الشفافیة ) اإلطالق

یمكنك اخذ المجسم .والذي سوف یحمل مجسم سیارة Carمجسم إضافةنقوم ب اآلن .في مجلد المثال المرفق Carمن مجلد كساءواإل

Load_Formنقوم بكتابة ھذا الكود في نا أن ىوھو ال یختلف عن سابقھ سو أیضا .سوف نقوم باستیراد المجسم

Set Car = New TVMesh

Set Car = Scene.CreateMeshBuilder

Set Texture = New TVTextureFactory

Texture.LoadTexture App.Path + "\car\1.jpg", "CarTexture"

Page 46: تميز مع اليجوال بيسك 6 الاصدار 2

Car.Load3DSMesh App.Path + "\car\car.3ds"

Car.ScaleMesh 0.1, 0.1, 0.1

Car.SetPosition -20, 0, 50

Car.SetRotation 0, 45, 0

Car.SetTexture GetTex("cartexture")

carو textureلتعریف المتغیرات :الثالث+ الثاني + األولالسطر

یمثل app.pathحیث jpg.1 كساءصورة اإل ضافةھذا السطر إل: السطر الرابع+ و ) بعد تحویلھ exeامتداد الملف التنفیذي(امتداد ملف المشروع

"\car\1.jpg" فھو خیرالبارامتر األأما .داد الصورة في مجلد المشروعوھو امت .الذي سوف نستخدمھ الستدعاء الصورة ضع االسم الذي یناسبك كساءالسم اإل

).3DS(المجسم وھو من نوع ضافةوھو إل :السطر الخامس

تم شرحھم :الثامن + السابع + السطر السادس الحجم والموقع (لضبط يوھ مسبقا ).و الدوران

gettexباستخدام دالة كساءوھو لتحدید اإل: السطر التاسع

المھمة وھي خاصة TrueVisionھي دالة من دوال مكتبة :GetTex دالة .یكون شكل استخدامھا كالتالي .كساءباستدعاء اإل

GetTex("اسم االستدعاء الخاص بالصورة")

مالحظة مھمة لن تظھر في شاشة Meshعند استخدام مجسمات من نوع :جدا :Doالتالي داخل التكرار مرالعرض حتى نضع األ

Scene.RenderAllMeshes

:یكون شكل كود المتغیرات كالتالي

Page 47: تميز مع اليجوال بيسك 6 الاصدار 2

:وكود البرنامج كالتالي

:ویكون شكل البرنامج النھائي

Page 48: تميز مع اليجوال بيسك 6 الاصدار 2

مع اإلنترنتیمكنك تحمیل مجسمات مختلفة من المواقع المختصة بذلك على .اتھاإكساء

.مرفقة مع الكتاب مثلةجمیع األ :تذكر

Page 49: تميز مع اليجوال بيسك 6 الاصدار 2

وتعدیلھا MDlمجسمات إضافة :الدرس السادس

مجسم من إضافةفي ھذا الدرس سوف نقوم بفتح المشروع السابق والتعدیل علیھ و . mdlنوع

داء حركات مختلفة من قبل اي أ animationھي mdlھم میزات مجسمات أمن المجسم تكون مسجلة علیھ .مسبقا

)٤(المثال

في البدایة دعنا نقوم بفتح المشروع الخاص بالدرس السابق ونقوم بالتعدیل علیھ . mdlمجسم اخر من نوع إضافةب

moduleالمتغیر الذي سیحمل المجسم في إضافةنقوم ب

Public Animal As TVActor2

.المجسم وتحدید مسارهنقوم بكتابة الكود التالي في الفورم من اجل تعدیل خصائص

Set Animal = New TVActor2

Animal.Load App.Path + "\models\animal.mdl"

Animal.SetPosition 0, 0, 50

Animal.SetScale 0.1, 0.1, 0.1

:تفسیر الكود

وھو لتعریف المتغیر كما تعلمنا األولالسطر :الثاني+ األولالسطر أما ، سابقایمكنك أو الحظ المجسم موجود مع المثال المرفق( لتحدید المجسمالسطر الثاني فھو

.)نترنتتحمیل المزید من اإل

تم شرحھما :الرابع+ السطر الثالث .مسبقا

ال لن یظھر ویكون ذلك عن طریق إللمجسم و renderیجب علینا عمل اآلن Do animal.renderوضع الكود التالي في التكرار

Page 50: تميز مع اليجوال بيسك 6 الاصدار 2

یجب كي تظھر وضع الكود as tvmeshالمتغیرات من نوع :مالحظة مھمة Doالتالي في التكرار

Scene.RenderAllMeshes

یجب وضع الكود التالي في tvactor + tvactor2لكن المتغیرات من نوع .التكرار لظھورھا

Object.render

شكل البرنامج بعد التنفیذ

.مرفقة مع الكتاب مثلةجمیع األ :تذكر

Page 51: تميز مع اليجوال بيسك 6 الاصدار 2

)Terrian( رضاأل إضافة :الدرس السابع

أھمیتھا، فھذا ألن أفسرطبعا الداعي رضاأل إنشاءفي ھذا الدرس سوف نقوم ب الدرس مھم .ساسیاتألمن اوبسیط و جدا

)٥(المثال

في ھذا المثال دعنا نقوم بعمل مشروع جدید سوف نستعملھ في عدة دروس قادمة لحفظ module إنشاءالمكتبة لھ كما تعلمنا و إضافةالمشروع و إنشاءیجب علینا

.المتغیرات فیھ

:نقوم بتعریف المتغیرات الضروریة كالتالي أوال

Public V8 As TVEngine

Public Scene As TVScene

Public Inp As TVInputEngine

Public Land As TVLandscape

Public Texture As TVTextureFactory

جمیع المتغیرات تم الحدیث عنھا فھو المتغیر LandScapeباستثناء سابقا Land إنشاءالمختص في

نقوم بوضع الكود التالي في الفورم وھو لتعریف المتغیرات وضبط المحرك كما .تعلمنا في الدروس السابقة

Set V8 = New TVEngine

Set Scene = New TVScene

Set Inp = New TVInputEngine

Set Land = New TVLandscape

Set Texture = New TVTextureFactory

Page 52: تميز مع اليجوال بيسك 6 الاصدار 2

With V8

.Init3DFullscreen 1366, 768, 32

.SetAngleSystem TV_ANGLE_DEGREE

End With

Scene.SetCamera -500, 400, -340, 270, 45, 0

Scene.SetSceneBackGround 0, 0, 0

تعرفنا علیھا وامرجمیع األ مرما عدا األ سابقا

Scene.SetCamera -500, 400, -340, 270, 45, 0

سوف نتحدث عنھ بشكل مفصل في درس اآلندعنا نتركھ Cameraوھو لضبط .خاص لھ

الموضوعة بعادقد ال تتناسب األ FullScreenأو الحظ العرض في شاشة كاملة اجعل العرض في نافذة كما تعلمنا أو شاشتك أبعادمع شاشتك لذا قم بوضع . سابقا

نضع الكود التالي .رضاأل نشاءفي الفورم وھو إل أیضا

Texture.LoadTexture App.Path + "\data\earth.bmp", "LandTexture"

Land.GenerateHugeTerrain App.Path + "\data\landmap.jpg", TV_PRECISION_LOW, 10, 10, 0, 0, True

Land.SetTerrainScale 1, 0.3, 0

Land.SetTexture GetTex("landtexture")

Page 53: تميز مع اليجوال بيسك 6 الاصدار 2

:تفسیر الكود

تحدثنا عنھ :األولالسطر .رضاأل إكساءوھو لتحمیل سابقا

ھذا السطر مھم : السطر الثاني ما أو HeightMapوھو یقوم بتحمیل صورة جدایمكنك تحمیل العدید .رضباأل تعرف باسم صورة المرتفعات والتضاریس الخاصة

.استعمال الصورة المحلقة بالمثالأو نترنتمن الصور من اإل

واإلحداثي رضوھو تحدید طول وعرض األ مرالجزء الثاني من ھذا األأما مرتجعل األ أن أفضللن نخوض فیھ لكن خیرالجزء األأما .السینیني والصادي لھا

=True .

وھو لضبط المساحة حیث :السطر الثالث

Scalex: ي السیني حداثاإل

ScaleY: رضي الصادي وھو یمثل ارتفاع األحداثاإل

ScaleZ: ي حداثوھو یمثل اإل z

)الطول ،االرتفاع ،العرض(یمكن التعبیر عنھم على اساس

قیمتھ تمثل ارتفاع التضاریس من الصورة scaleyي حداثالحظ اإل :مالحظة مھمةHeightMap ا إذسوف تختفي التضاریس و الصفر إلىا جعلنا قیمتھ تؤول إذو

زاد ازداد وكلماالتضاریس سوف تظھر على الوضع الطبیعي ٠= كانت قیمتھ .ارتفاع التضاریس

تم الحدیث عن مثلھ ) رضصورة األ( كساءوھو لإل: خیرالسطر األ .سابقا

كود التكرار في الفورم كما تعلمنا اآلننضع .بسیطة إضافةلكن مع سابقا

Page 54: تميز مع اليجوال بيسك 6 الاصدار 2

Do

DoEvents

If Inp.IsKeyPressed(TV_KEY_ESCAPE) = True Then End

V8.Clear

Land.Render

V8.RenderToScreen

Loop

تعرفنا علیھا وامرجمیع األ مرعدا األ ما سابقا

Land.Render

دون ھذا رضولن تظھر األ) للمتغیر Renderعمل ( رضوھو خاص لعرض األ .السطر

:یكون كالشكل التالي األكوادشكل

:كود الفورم فیكون كما یلي أما

Page 55: تميز مع اليجوال بيسك 6 الاصدار 2

.مرفقة مع الكتاب مثلةجمیع األ :تذكر

SkyBoxالسماء مكعب إضافة: الثامن الدرس

Page 56: تميز مع اليجوال بيسك 6 الاصدار 2

العالم، ولن نقوم بعمل مثال إلىھا إضافتالسماء و إنشاءفي ھذا الدرس سوف نقوم ب .جدید بل بالتعدیل على المثال السابق

)٦(المثال

في البدایة دعنا نقوم بفتح المشروع ومن ثم تعریف المتغیر الخاص بالسماء كما :یلي

Public Sky As TVAtmosphere

الغالف إنشاءالمسؤول عن ) Object(ھو الكائن tvatmospere أن الحظ .الجوي والسماء والتحكم بالمطر وتساقط الثلج وحركة الغیوم وغیره

لتعریف المتغیر Load_Formنقوم بوضع الكود التالي في

Set Sky = New TVAtmosphere

.ات السماءإكساءوالذي سوف یحمل load_formالكود في إضافةنقوم ب

Texture.LoadTexture App.Path + "\data\sky\back.jpg", "BackTexture"

Texture.LoadTexture App.Path + "\data\sky\down.jpg", "downtexture"

Texture.LoadTexture App.Path + "\data\sky\front.jpg", "fronttexture"

Texture.LoadTexture App.Path + "\data\sky\left.jpg", "lefttexture"

Texture.LoadTexture App.Path + "\data\sky\right.jpg", "righttexture"

Texture.LoadTexture App.Path + "\data\sky\up.jpg", "'uptexture"

ات موجودة ومرفقة مع الكتاب في مجلد المثالكساءاإل أن الحظ

Page 57: تميز مع اليجوال بيسك 6 الاصدار 2

.تحدثنا عنھ أن ات سبقكساءبالنسبة للكود فھو تحمیل لإلأما

وھو لتفعیل مربع السماء وتحدید بعض الخواص Load_formنضع في

With Sky

.SkyBox_Enable True

.SkyBox_SetTexture GetTex("fronttexture"), GetTex("backtexture"), GetTex("lefttexture"), GetTex("righttexture"), GetTex("uptexture"), GetTex("downtexture")

.SkyBox_SetDistance 1000

End With

یكون شكل الكود كما یلي

** تفسیر الكود **

.وھو لتفعیل مربع السماء skybox_enable.مراأل

ات التي كساءالسماء ونقوم بوضع اإل إكساءوھو لتحدید skybox_texture.مراأل حملناھا .بالترتیب مسبقا

upحیث ٦بتحمیلھا تمثل وجوه المكعب قمنا التي ٦الصور :مالحظة مھمة إلىانظر حبوضو مرالسفلي وھكذا ولتفھم األ downیمثل الوجھ العلوي لھ و

الصورة التالیة

Page 58: تميز مع اليجوال بيسك 6 الاصدار 2

.فھو خاص بالمسافة وبعد مربع السماء skybox_setdistance. مراألأما

.لمربع السماء renderوھو خاص لعمل doضع الكود التالي في التكرار

Sky.Skybox_Render

الشكل النھائي للبرنامج

)CameraControl 1( التحكم بالكامیرا: التاسع الدرس

ل ءفقد یتسا ،المتعلقة بالكامیرا وامرفي الدروس السابقة قمنا بتأجیل شرح بعض األ .لعابما وظیفتھا ببرمجة األأو البعض ما ھي الكامیرا

Page 59: تميز مع اليجوال بيسك 6 الاصدار 2

تختلف عن المفھوم الذي نعرفھ لعابالكامیرا في برمجة األ فھي بمثابة العین ،مسبقا التي یرى منھا المستخدم المجسمات والتأثیرات وغیرھا لذلك حتى نتمكن من تطبیق

.وكیفیتھ) الكامیرا(لعبة ما ثالثي البعد یتحتم علینا ضبط مكان العرضأو

في التي مور ألشرح مبسط لبعض ا إنمامثال جدید و إنشاءفي ھذا الدرس لن نقوم ب .ا كنت على درایة كافیة بالدروس السابقةإذالغالب ستكون مفھومة بالنسبة لك

سوف یكون sceneالمتغیر فإنین متغیر خاص للكامیرا یفي حال عدم تع أوال :ات الكامیرا من الخیار كالتاليإعدادالمسؤول عن العرض فیمكن ضبط

Scene.SetCamera PosX,PosY,PosZ,RotX,RotY,RotZ

تعاملنا معھا التي الكامیرا تشبھ المجسمات أن نالحظ حیث سابقا

posx :ي السیني حداثاإل

Posy: ي الصادي حداثاإل

Posz: ي حداثاإلZ

RotationX: الدوران على المحور السیني.

RotationY :الدوران على المحور الصادي.

RotationZ: الدوران على المحورZ

ھنالك مكتبة متغیر خاص في التحكم بالكامیرا TrueVision ألعابلكن في محرك .وھو سلس االستخدام ویحوي العدید من الدوال المساعدة والمفیدة

المتغیر یكون على الشكل التالي

Public اسم المتغیر As TVCamera

:وتعریف المتغیر یكون على الشكل التالي

Set اسم المتغیر = New Tvcamera

Page 60: تميز مع اليجوال بيسك 6 الاصدار 2

و tvengineو sceneیمكن تعریف جمیع المتغیرات السابقة مثل :مالحظة مھمةinputengine و حتىtvcamera بوضع كلمةNew بعد اسم المتغیر كالتالي:

Public Camera As New TVCamera

من ناحیة التحكم فعلى سبیل المثال قد أفضلى األوللكن من جھة نظري الطریقة تضبط نوع المتغیرات الذي تم تعریفھ وعندھا یمكنك أن حدى التطبیقاتإتحتاج في

وھو ،وھذا یسھل علیك التحكم بھا) Function(وضع تعاریف المتغیرات في دالة .لعابمفید من ناحیة برمجة محركات األ

:المتغیر نقوم بوضع الكود التاليیات الكامیرا من خالل إحداثلتحكم بل

Camera.SetPosition posx,posy,posz

:لتحكم بالدورانلو

Camera.SetRotation RotX,RotY,RotZ

تشتمل الدروس القادمة على والمھمة في الكامیرا، مورتممنا األأوھكذا نكون قد .تطبیق لما تعلمناه في ھذا الدرس

Page 61: تميز مع اليجوال بيسك 6 الاصدار 2

) 2CameraControl( بالكامیراالتحكم : الدرس العاشر

وھو مثال مكعب –خر مثال قمنا بعملھ آفي ھذا الدرس سوف نقوم بالتعدیل على یة وسوف نجعلھا تدور رضالكرة األ إكساءكرة تحمل إضافةحیث سنقوم ب –سماء ال

.ثناء دورانھاأالكامیرا سوف تكون مرافقة لھا أما

)٧(المثال

وسوف نقوم بتعریف ) ٦المثال رقم (خیریل المثال األشغفي البدایة سوف نقوم بت :كما یلي Moduleالكرة وكتابتھا في ئمتغیر الكامیرا والمتغیر الذي سینش

Public Camera As TVCamera

Public Earth As TVMesh

كما تعلمنا Load_Formومن ثم سوف نقوم بتعریف المتغیرین في :سابقا

Set Camera = New TVCamera

Set Earth = New TVMesh

Set Earth = Scene.CreateMeshBuilder

صورة أن الحظ(لھا رضاأل إكساء إضافةالكرة و إنشاءفي البدایة سوف نقوم ب ).مرفقة مع المثال كساءاإل

Texture.LoadTexture App.Path + "\data\earth.jpg", "EarthTexture"

With Earth

.CreateSphere GetTex("EarthTexture"), 4, 100, 100

.SetPosition -200, 200, 10

.SetRotation 180, 0, 0

End With

Page 62: تميز مع اليجوال بيسك 6 الاصدار 2

:تفسیر الكود

قد تم شرح مثل ھذا الكود أنھالحظ .Meshالمجسمات من نوع إنشاءراجع سابقا

یات حداثقیم وھي تمثل اإل ٣متغیر جدید ھذا المتغیر یحمل إنشاءسوف نقوم ب اآلن .وسوف نستخدمھ في دالة ملحقة بمتغیر الكامیر) نقطة(الثالث

لذلك ال DirectX 8مكتبة وھو من متغیرات D3dVectorھذا المتغیر من نوع :المكتبة كالتالي إضافةبد من

Page 63: تميز مع اليجوال بيسك 6 الاصدار 2

.لتعریف المتغیر وتحدید قیمھ Load_Formومن ثم نضع الكود التالي في

Dim Pos As D3DVECTOR

Pos.x = 0

Pos.Y = 0

Pos.Z = 20

).یةرضالكرة األ(وھي تمثل موقع الكامیرا من المجسم

.وھو لحركة المجسم والكامیرا Doنضع الكود التالي في التكرار

Page 64: تميز مع اليجوال بيسك 6 الاصدار 2

Earth.RotateY V8.TimeElapsed * 0.01

Camera.SimpleFollowing Earth, Pos

:تفسیر الكود

مراألأما وھو یتحكم بدوران الكرة على المحور الصادي األولالسطر v8.timeelapsed علیھ مع التقدم بالبرمجة وھو موجود في مختلف تعتادسوف ).تھدئة الحركة(لتحكم بالحركة النسبیة لوھو لعابمحركات برمجة األ

وھي دالة تجعل SimpleFollowingنا استخدمنا الدالة أن الحظ :السطر الثانيتبقي المنظر بین المجسم والكامیرا ثابت ال ( اللحاق بھمرافقة للمجسم المراد الكامیرا

موقع أو فھو یمثل بعد Posأما ،فھو المجسم المراد لحاقھ earthأما ، )یتغیر .الكامیرا بالنسبة للمجسم

مالحظة ھامة ا إذأما meshمع المجسمات من نوع إالھذه الدالة ال تستخدم :جدافھذا لن یفلح، لكن یمكنك استخدام حل بدیل tvactorاستخدمھا مع المتغیر أردتحدائي المجسم من نوع إي الخاص بھ نفس حداثصندوق صغیر وجعل اإل إنشاءوھو

MDL ومن ثم نجعل شفافیة الصندوق صفر، كما تعلمنا ا وبعدھا نجعل الكامیرا سابقا .تلحق بالصندوق المختفي

.كوادشكل األ

Page 65: تميز مع اليجوال بيسك 6 الاصدار 2

شكل البرنامج النھائي

.مرفقة مع الكتاب مثلةجمیع األ :تذكر

Page 66: تميز مع اليجوال بيسك 6 الاصدار 2

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

Page 67: تميز مع اليجوال بيسك 6 الاصدار 2

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نضع الكود التالي في

Texture.LoadTexture App.Path + "\data\water.jpg", "water"

الخامات مرفقة مع المثال أن تذكر

نضع الكود التالي اآلن Load_Formفي أیضا

PositionX = 0

PositionZ = 10

With Box

.CreateBox 6, 6, 6

.EnableSphereMapping True, 0

Page 68: تميز مع اليجوال بيسك 6 الاصدار 2

.SetTexture GetTex("water")

.SetPosition PositionX, 0, PositionZ

End With

:تفسیر الكود

یة للمتغیرین األولول سطرین ھما لتحدید القیم أ أن الحظ)PositionX,Positionz(.

وقد تعرفنا علیھ ،مكعب نشاءوھو إل CreateBox أمر .سابقا

أمروھو EnableSphereMapping أمر نوع من ضافةوھو إل ،ما جدید نوعااختیار لتفعیل تأثیر معین اي یمكنك االستغناء أمرالحظ ھو (على الخامة تأثیرال

).عنھ

.وھو لتحدید الموقع االبتدائي للمكعب setPosition مراأل

:مكعب السماء نشاءوھو إل) اختیار( Load_Formنقوم بوضع الكود التالي في

Texture.LoadTexture App.Path + "\data\sky\back.jpg", "BackTexture"

Texture.LoadTexture App.Path + "\data\sky\down.jpg", "downtexture"

Texture.LoadTexture App.Path + "\data\sky\front.jpg", "fronttexture"

Texture.LoadTexture App.Path + "\data\sky\left.jpg", "lefttexture"

Texture.LoadTexture App.Path + "\data\sky\right.jpg", "righttexture"

Texture.LoadTexture App.Path + "\data\sky\up.jpg", "'uptexture"

Page 69: تميز مع اليجوال بيسك 6 الاصدار 2

With sky

.SkyBox_Enable True

.SkyBox_SetTexture GetTex("fronttexture"), GetTex("backtexture"), GetTex("lefttexture"), GetTex("righttexture"), GetTex("uptexture"), GetTex("downtexture")

.SkyBox_SetDistance 1000

End With

.لقد تحدثنا عن ھذا الكود في دروس سابقة وھو لتكوین مكعب السماء

:االبتدائي للكامیراوھو لتحدید الموقع Load_Formالكود التالي في

Camera.SetPosition 0, 5, -10

:كالتالي) Load_Formفي (نضع كود التكرار اآلن

Do

DoEvents

V8.Clear

sky.Skybox_Render

Scene.RenderAllMeshes True

V8.RenderToScreen

Loop

Moduleالمتغیرات في

Page 70: تميز مع اليجوال بيسك 6 الاصدار 2

Load_Formفي وامراأل

Page 71: تميز مع اليجوال بيسك 6 الاصدار 2

:للبرنامجالشكل المبدئي

Page 72: تميز مع اليجوال بيسك 6 الاصدار 2

ه سوف نقوم بعمل حدث الحركة حیث لو إعدادقمنا بتجھیز البرنامج و أن وبعد اآلن .قمنا بالضغط على زر الیمین مثال یتحرك المكعب للیمین وھكذا

:دالة ووضع الكود التالي فیھا إنشاءنقوم ب

Public Sub Input_Key()

If Inp.IsKeyPressed(TV_KEY_ESCAPE) = True Then End

If Inp.IsKeyPressed(TV_KEY_UP) = True Then

PositionZ = PositionZ + V8.TimeElapsed * 0.05

End If

If Inp.IsKeyPressed(TV_KEY_DOWN) = True Then

PositionZ = PositionZ - V8.TimeElapsed * 0.05

End If

If Inp.IsKeyPressed(TV_KEY_LEFT) = True Then

PositionX = PositionX - V8.TimeElapsed * 0.05

End If

If Inp.IsKeyPressed(TV_KEY_RIGHT) = True Then

PositionX = PositionX + V8.TimeElapsed * 0.05

End If

Box.SetPosition PositionX, 0, PositionZ

End Sub

الصعب مرالموضوع سھل ولیس باأل أن الحظ

Page 73: تميز مع اليجوال بيسك 6 الاصدار 2

:تفسیر الكود

قمنا باعالن عن الدالة كما یلي أوال

Public sub + االسم

وقد مر Escapeالبرنامج عند الضغط على الزر إلغالق السطر الثاني فھو أما معنا .في الدروس السابقة كثیرا

سوف یقوم بتنفیذ الحدث الذي upعند الضغط على الزر أنھیعني : السطر الثالثي عند حصول حداثكل فكرة الحركة ھو تغیر اإل أن الحظالحركة یلیھ وھو ھنا

.حدث ما

ما دام الضغط مستمر PositionZوھو لتحدیث قیمة المتغیر : السطر الرابع على ا فقد تحدثنا عنھا TimeElapsedأما .Upالزر .سابقا

الباقیة ما ھي اال تكرار لھذه العملیة لكن بتحدیث مختلف للمتغیر ونوع األسطرأما .متغیر مختلف

عند أما على نحو موجب Z اإلحداثيیتغیر أن یجب upالضغط على الزر : حیثسوف Zیجب على الصندوق التراجع للخلف وعلیھ فان Downالضغط على زر

Rightضغط على الزر فعند ال تتغیر على نحو سالب وبالنسبة للمحور السینيسوف Leftعلى نحو موجب وعند الضغط على الزر X اإلحداثيسوف یتغیر

.على نحور سالب وھكذا Xیتغیر

لمتغیر إلعطاء الصندوق االحداثیات لفھو SetPosition مربالنسبة الى األأما لھ Zي حداثاإل PositionZي السیني لھ والمتغیر حداثاإل PositionXحیث یمثل

).االرتفاع(ي السیني حداثلإل 0وقیمة

تذكر ال یشترط بك عمل دالة فیمكنك وضع الكود في التكرار :مالحظة ھامة لیكون البرنامج منظم األفكاربعملھا وذلك لعدم تشتیت أنصحمباشرة لكن .ا

ة وھي بسیطة خیرسوى الخطوة األ یتبقلم اآلن فیجب علینا وضع الدالة في جدا .اسم الدالة فقط أنھالحظ Doنضع الكود التالي في التكرار .التكرار لكي تنفذ

Input_Key

Page 74: تميز مع اليجوال بيسك 6 الاصدار 2

:كود دالة الحركة

:البرنامج النھائي

.مرفقة مع الكتاب مثلةجمیع األ :تذكر

Page 75: تميز مع اليجوال بيسك 6 الاصدار 2

Movement&Collision(الحركة والتصادم : الدرس الثاني عشر2(

لیھا بشكل كبیر بل سوف إشكالھا ولن نتطرق أوعھا وأن التصادمات فيتختلف نتحدث عنھا بشكل مبسط وذلك الن الحركة والتصادم بشكل عام ال یصلح الحدیث

في ھذا الدرس أما ،عنھما في درس ودرسین بل ھما بحاجة لكتاب خاص بھما .بق وتضمین تصادم فیھاسوف نقوم بالتعدیل على المثال الس

)٩(المثال

في ھذا المثال سنضیف مكعب خر یمثل حائطآ ا وسوف نقوم باستكشاف تصادم ،ما ا .سوف یطفئ البرنامج ثن حدبالحائط وإ األولالمكعب

.في البدایة لنقم بتشغیل المثال السابق

:وھو لتعریف المتغیر الذي سیحمل الحائط Moduleضع الكود التالي في

Public Wall As TVMesh

نقوم بوضع الكود التالي وھو لتعریف المتغیر وسوف نضعھ في اآلنLoad_Form:

Set Wall = New TVMesh

Set Wall = Scene.CreateMeshBuilder

تم شرح مثلھ .مسبقا

ه وتعدیل إكساءالحائط و نشاءوھو إل Load_Formنضع الكود التالي في :خصائصھ

Texture.LoadTexture App.Path + "\data\wood.bmp", "wood"

Page 76: تميز مع اليجوال بيسك 6 الاصدار 2

With Wall

.CreateBox 200, 50, 6

.SetTexture GetTex("wood")

.SetPosition 0, 0, 100

End With

تم شرح مثلھ .مسبقا

:نشائھا في الدرس السابقإقمنا ب التينضع الكود التالي في دالة الحركة

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 + المسافة الفاصلة

Page 77: تميز مع اليجوال بيسك 6 الاصدار 2

And If positionz < wall.getposition.z + المسافة الفاصلة

من أخرىشكال أھذه الدالة لتحدید نقاط التصادم سوف نتعرف على أي أن

. ن شاء هللاإالتصادم في الدروس القادمة

:شكل البرنامج بعد التنفیذ كالتالي

.مرفقة مع الكتاب مثلةجمیع األ :تذكر

Page 78: تميز مع اليجوال بيسك 6 الاصدار 2

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

Page 79: تميز مع اليجوال بيسك 6 الاصدار 2

Set Bsp = New TVBSPTree

Set Camera = New TVCamera

یشبھ بشكل كلي تعریف باقي المتغیرات ویمكنك تعریفھ Bspتعریف أن الحظ وقد بینا ذللك .Bsp as new tvbsptreeكالتالي أخرىبطریقة وشرحنا سابقا

. Set یة التعریف باستخدام أفضل

شاشة العرض وقد سبق فھمھ عدادوھو إل Load_Formضع الكود التالي في ن :وشرحھ

V8.Init3DFullscreen 1366, 768, 32

Scene.SetSceneBackGround 0, 0, 0

:التالي مرالخریطة عن طریق األ إضافةنقوم ب اآلن

V8.OpenPAKFile App.Path + "\data\texture.pak"

Bsp.Load App.Path + "\data\SimpleRoom.bsp", , , True

V8.ClosePAKFile

Texture.pakالملف أن تذكر وامرنخوض في شرح األ أن في البدایة قبلن مع املف الخریطة مرفق SimpleRoom.bspات والملف كساءالخاص باإل

.المثال

:تفسیر الكود

وھو ملف یمكن Texture.pakنعرف ما ھو الملف أن في البدایة یجب علینایحوي الصور فقط أنھالحظ –بملف مضغوط یحوي مجموعة من الصور ھتشبیھ

بمثابة ملف جامع لمجموعة من الخامات ھأي أن –ي ال یضغطھا ویقلل حجمھا أھذا الملف یحوي صور .بدل من وضعھا في مجلد قمنا بوضعھا داخل ھذا الملف

Page 80: تميز مع اليجوال بيسك 6 الاصدار 2

المرحلة بضبطھا مع ملف الخامات أو مم الخریطةالخریطة حیث قام مص)Texture.pak(.

.الملف الثاني فھو ملف مجسمات الخریطةأما

حیث قمنا بفتح ملف Pakوھو لفتح ملف من نوع األولالسطر أن الحظTexture.Pak.

فھي لتفعیل البحث عن Trueكلمة أما للخریطة Loadالثاني فھو لعمل مرواأل IDرقام لتكون ألمصمم الخریطة اعتمد على ا ألنرقام وسبب ذلك ألالخامات با .لكل صورة

. Pakالملف من نوع إلغالق خیراأل مرواأل

ال لن إو ClosePakو Openpakفتح الخریطة بین أمریجب وضع أنھالحظ .ات للمجلدكساءیعطي اإل

:حیث

V8.openpak ile ….

ھنا مراأل

V8.closepak ile

دخالاحداث الحركة واإل نشاءھو إلو Moduleنقوم بوضع الكود التالي في اآلنPublic Sub Input_Keys()

If Inp.IsKeyPressed(TV_KEY_ESCAPE) = True Then End

If Inp.IsKeyPressed(TV_KEY_UP) = True Then Camera.MoveRelative 1, 0, 0

If Inp.IsKeyPressed(TV_KEY_DOWN) = True Then Camera.MoveRelative -1, 0, 0

If Inp.IsKeyPressed(TV_KEY_W) = True Then Camera.MoveRelative 0, 1, 0

If Inp.IsKeyPressed(TV_KEY_S) = True Then Camera.MoveRelative 0, -1, 0

If Inp.IsKeyPressed(TV_KEY_RIGHT) = True Then Camera.RotateY V8.TimeElapsed * 0.0005

If Inp.IsKeyPressed(TV_KEY_LEFT) = True Then Camera.RotateY V8.TimeElapsed * 0.0005 * -1

End Sub

Page 81: تميز مع اليجوال بيسك 6 الاصدار 2

:فسیرالكودت

.الحدث كما تریدأو في البدایة یمكنك تسمیة الدالة

ھذا الكود سھل :وبسیط لكنھ طویل حیث جدا

وقد سبق Escapeغالق البرنامج عند الضغط على زر إلوھو :األول مراأل .شرحھ والتعرف علیھ

.upمام عند الضغط على الزر ألل Cameraوھو لتحریك ال :الثاني مراأل

مالحظة ھامة وھو من مرھذا األ Camera.MoveRelative :مرحول األ جداوھو TvCameraمتغیر أو مساعدة في كائن أمرالجدیدة بالنسبة لنا وھو وامراأل

Xال یمثل المحور األولالبارامتر أن لكن الحظ .لتحریك الكامیرا بطریقة سھلةي محور ألالخلف بالنسبة للكامیرا ولیس أو ماملألما إیمثل الحركة النسبیة إنماو

.وكذلك باقي المحاور یتحرك مع الزاویة للكامیرا، أنھ أيمعین

ننا نؤثر بقوة أي أھي حركة نسبیة Camera.MoveRelative أمرالحركة في أو القوة ذهھي اتجاه حسب المحصلة لأوفي للخلفأو لألمامما على الجسم فیدفعھ

نیوتن ١یمثل وحدة قوة وقدرھا ١لذلك فالرقم ،نیوتن الثانيما یعرف بقانون .وھكذا

. Down كامیرا للخلف عند الضغط على زر لتحریك ال :الثالث مراأل

.Wعند الضغط على زر ) +y(اعلى إلىوھو لتحریك الكامیرا :الرابع مراأل

الیمین عند الضغط على زر الیمین إلىوھو لتحریك الكامیرا :الخامس مراألفي تحدید المقدار بدال من فرض متغیر TimeElapsedنا استخدمنا أن والحظ

.جدید

.الیسار عند الضغط على زر الیسار إلىالسادس وھو لتحریك الكامیرا مراأل

. Load_Formیتبق لنا سوى كود التكرار نضع الكود التالي في لم اآلن

Do

DoEvents

Page 82: تميز مع اليجوال بيسك 6 الاصدار 2

Input_Keys

V8.Clear

Bsp.Render

Scene.RenderAllMeshes True

V8.RenderToScreen

Loop

. Bspلمتغیر Renderوھو لعمل bsp.render أمرالجدید ھو مراأل

Moduleشكل كود

Page 83: تميز مع اليجوال بيسك 6 الاصدار 2

النموذج شكل كود

شكل ابرنامج بعد العمل

Page 84: تميز مع اليجوال بيسك 6 الاصدار 2

.مرفقة مع الكتاب مثلةجمیع األ :تذكر

)١(تطبیقات متنوعة : الرابع عشر الدرس

الذي قد تعرفنا علیھ Pakملف من نوع إنشاءفي ھذا الدرس سوف نقوم ب سابقا .سوف نستعملھا التي ات والمجسمات كساءوسوف نضع فیھ مجموعة من اإل

فائدة ھذا الدرس تكمن في ترتیب البرنامج المصنوع من جھة ومنع المستخدمین من .أخرىالعبث في الصور والملفات من جھة

)١١(المثال

وھو من البرامج PakExplorerفي البدایة سوف نستخدم في ھذا الدرس برنامج ا إذوھذا البرنامج مرفق مع ھذا الكتاب و TrueVision3Dالمساعدة في محرك

.ال بأس بذلك أخرىاستخدام برامج أردت

استخدمھا ستجدھا مرفقة في مجلد المثال باسم سوف التي الصور والخاماتTextureFiles.

:كالتالي Pakملف إنشاءفي البدایة نقوم بتشغیل البرنامج ومن ثم نقوم ب

Page 85: تميز مع اليجوال بيسك 6 الاصدار 2

:كالتالي Dataا ساسمیھ أن نقوم بتسمیة وحفظھ في مجلد المشروع

Page 86: تميز مع اليجوال بيسك 6 الاصدار 2

داخل إلى TextureFilesسوف نقوم بسحب الملفات الموجودة في مجلد اآلن :البرنامج كالتالي

Page 87: تميز مع اليجوال بيسك 6 الاصدار 2

مالحظة ھامة ھا وھي عدم إدخالسماء الملفات الواجب ألیوجد عدة شروط :جداا كان إذواسم الملف بحرف صغیر و ، )_(تضمن االسم على رموز خاصة مثل

حرف كبیر ا .صغیر إلىسوف یتم تحویلھ بشكل تلقائي ا

مشروع جدید إنشاءالبرنامج وفتح برنامج الفیجوال وبیسك و إغالقومن ثم نقوم ب كما تعلمنا :سابقا

:كالتالي Moduleنضع المتغیرات في

Public V8 As TVEngine

Public Scene As TVScene

Public Inp As TVInputEngine

Public Monster As TVActor2

Public Texture As TVTextureFactory

Public Sky As TVAtmosphere

الشاشة إنشاءو وھو لتعریف المتغیرات Load_Formنضع الكود التالي في

Set V8 = New TVEngine

Set Scene = New TVScene

Set Inp = New TVInputEngine

Set Monster = New TVActor2

Set Texture = New TVTextureFactory

Page 88: تميز مع اليجوال بيسك 6 الاصدار 2

Set Sky = New TVAtmosphere

V8.Init3DFullscreen 1366, 768, 32

Scene.SetSceneBackGround 0, 0, 0

تحمیل المجسم + Pakات من ملف كساءنضع الكود التالي وھو لتحمیل اإل اآلن :وھو كالتالي

V8.OpenPAKFile App.Path + "\data.pak"

Texture.LoadTexture "\up.jpg", "Up"

Texture.LoadTexture "\right.jpg", "Right"

Texture.LoadTexture "\left.jpg", "left"

Texture.LoadTexture "\front.jpg", "front"

Texture.LoadTexture "\down.jpg", "down"

Texture.LoadTexture "\back.jpg", "Back"

Monster.Load "\monster.mdl"

V8.ClosePAKFile

:تفسیر الكود

وقد تعرفنا علیھ Pakیمثل فتح ملف األول مراأل أن الكود سھل الفھم وبسیط حیث للمفات لكن الحظ ھنا Loadھي لعمل خیرعدا األ ما وامرباقي األأما ،في السابق

خیراأل مراألأما . Pakننا فعال داخل ملف ألوذلك App.path أمرنضع نا الأن . Pakملف إلغالقفھو

Page 89: تميز مع اليجوال بيسك 6 الاصدار 2

مالحظة ھامة وقبل Openpakfileالتحمیل بعد أوامرتكون أن یجب :جداClosePakFile .

Load_Formنضع الكود التالي في اآلن

With Sky

.SkyBox_SetTexture GetTex("front"), GetTex("back"), GetTex("left"), GetTex("right"), GetTex("up"), GetTex("down")

.SkyBox_Enable True

.SkyBox_SetDistance 1000

End With

With Monster

.SetPosition 0, 0, 100

End With

Mdlالمجسم من نوع إضافةمربع السماء و نشاءھذا الكود وھو إل

:السابقة كالتالي وامرلم یتبق فقط سوى وضع التكرار الظھار األ اآلن

Do

DoEvents

If Inp.IsKeyPressed(TV_KEY_ESCAPE) = True Then End

V8.Clear

Sky.Skybox_Render

Monster.Render

Page 90: تميز مع اليجوال بيسك 6 الاصدار 2

Scene.RenderAllMeshes True

V8.RenderToScreen

Loop

تم شرحھا وامرجمیع األ أن الحظ .سابقا

:شكل الكود كالتالي

Moduleكود

Load_Formكود

Page 91: تميز مع اليجوال بيسك 6 الاصدار 2

.مرفقة مع الكتاب مثلةجمیع األ :تذكر

Page 92: تميز مع اليجوال بيسك 6 الاصدار 2

)٢(تطبیقات متنوعة : الدرس الرابع عشر

أمورقد تعلمنا في الدروس الماضیة دیھیات برمجة ساسیات وبأمھمة وتعتبر من اال وھي أالدرس سوف نضیف فكرة تختلف عما سبق نوعا ما في ھذا ،لعاباأل

ذ ال یمكن تخیل لعبة كاملة دون إیتھا أھموال داعي لشرح ،صواتالتحكم باأل .صوات والكمال عزوجلأ

)١٢(المثال

إضافةمشروع جدید و إنشاءو ٦في البدایة دعنا نبدأ بتشغیل برنامج الفیجوال بیسك مكتبة دوال جدیدة وھي المكتبة الصوتیة إضافةالمحرك ولكن ھنا سوف نقوم ب

TvMedia ویكون ذلك كالتالي:

):تذكر لو لم تجدھا فھي مرفقة مع الكتاب(ومن ثم نختار المكتبة

Page 93: تميز مع اليجوال بيسك 6 الاصدار 2

: 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المتغیر من نوع .وغیرھا إضافةمن تقطیع و

Page 94: تميز مع اليجوال بيسك 6 الاصدار 2

صواتھذا المتغیر المسؤول عن تحمیل األ 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 مع عدم نسیان تحدید السواقي وھي

.كثرأترتیب ال لفضل وضع دالة وذلك لأنظري

Page 95: تميز مع اليجوال بيسك 6 الاصدار 2

:تفسیر الكود

وھو خاص لتحدید سواقة عرض الصوت ونضع فیھا :داخل الدالة األولالسطر .ا Hwndالمتغیر الذي قمنا بتحدیده في الدالة وھو

. Listenerوھو لتعریف المتغیر :السطر الثاني داخل الدالة

یجب وضع التعریف TvListener عند تعریف المتغیر من نوع :مالحظة ھامة .تحدید السواقة أمربعد

المرفق Soundsمن مجلد صواتفھي بسیطة وھي لتحمیل األ ةخیراأل وامراألأما .في المثال

الشاشة إنشاءوھو لتعریف المتغیرات و Load_Formنضع الكود التالي في :صواتواأل

Set V8 = New TVEngine

Set Scene = New TVScene

Set Inp = New TVInputEngine

V8.Init3DWindowedMode Me.Hwnd

Scene.SetSceneBackGround 0, 0, 0

Input_Sound Me.Hwnd

Me.Show

حیث قمنا بتحدید بعملھا،قمنا التي الحظ الدالة ،السابقفي نعرفھا وامرجمیع األ .Me.Hwndالنموذج لیكون السواقة من خالل

العرض إنماو) FullScreen( ن شاشة العرض لم نجعلھا شاشة كاملةأالحظ ال لن یظھر إو Me.Showأمرسیكون على النموذج وعلیھ یجب علینا وضع

.عند تشغیل البرنامج) Form(النموذج

:صواتالتكرار وتشغیل األ نشاءوھو إل Load_Formفي نضع الكود التالي

Page 96: تميز مع اليجوال بيسك 6 الاصدار 2

Do

DoEvents

If Inp.IsKeyPressed(TV_KEY_ESCAPE) = True Then End

If Inp.IsKeyPressed(TV_KEY_f1) = True Then Sounds(0).Play

If Inp.IsKeyPressed(TV_KEY_f2) = True Then Sounds(1).Play

If Inp.IsKeyPressed(TV_KEY_f3) = True Then Sounds(2).Play

If Inp.IsKeyPressed(TV_KEY_f4) = True Then Sounds(3).Play

V8.Clear

Scene.DrawText "PressF1", 0, 10

Scene.DrawText "PressF2", 0, 30

Scene.DrawText "PressF3", 0, 50

Scene.DrawText "PressF4", 0, 70

V8.RenderToScreen

Loop

سوف یقوم البرنامج f1عند الضغط على الزر أنھحیث نالحظ ،سھل وبسیط مراأل .وھكذا 0 بتشغیل الصوت

الطباعة على الشاشة فقد تعرفنا علیھا أما أوامر .سابقا

:Moduleشكل الكود النھائي

Page 97: تميز مع اليجوال بيسك 6 الاصدار 2

:Load_Formشكل

Page 98: تميز مع اليجوال بيسك 6 الاصدار 2

:شكل البرنامج بعد العمل یكون كالتالي

.لعابفي برمجة األ األساسیاتتممنا بحمد هللا أھكذا نكون قد

.مرفقة مع الكتاب مثلةجمیع األ :تذكر

Page 99: تميز مع اليجوال بيسك 6 الاصدار 2

)١(عمل لعبة بسیطة :الدرس الخامس عشر

ن هللا عزوجل بعمل لعبة بسیطة نطبق فیھا ما تعلمناه إذفي ھذا الدرس سوف نقوم ب ن ھذا الدرس سوف یكون جامعأي أ ،لعابفي الدروس السابقة في برمجة األ لما ا

تعلمناه .سابقا

المشـــــــروع النــــھائي

:الرحمـــــن الرحــــیـــــــــمفي البدایة دعنا نبدأ بقول بســـم هللا

:سوف تكون كالتالي التيجزاء أ ٣ إلىتم تقسیم ھذا الدرس

سوف نقوم فیھ بتجھیز مجلد اللعبة وتجھیز الملفات والخامات >>>> ١الجزء ن نسمي أالمشروع قبل البدء ویمكن إنشاءوشرح لمنھج وفكرة اللعبة و ،المطلوبة

.بدء البرمجةھذه المرحلة بالخطة قبل

سوف نتحدث (سوف نقوم فیھ ببرمجة الخریطة والكائن الرئیس >>>> ٢الجزء .وكتابة المتغیرات وتعریفھا) عنھ بعد قلیل

حداث والحركات ألبوضع اھذا الجزء سوف نقوم فیھ >>>> ٣الجزء .مور والتصادمات وغیرھا من األ

.بالمحاولة بنفسكك أنصحالحظ المشروع مرفق كامل مع الكتاب لكن

سلوب المتبع ألالفكرة والمنھج وا :)١(الخطوة

الشخصیة وف تكون عبارة عن مجسم لشخصیة ھذهھذه اللعبة س :تحدید منھج اللعبةسوف یالحقھا مجموعة من الوحوش مثال في شارع مزدحم بالسیارات التي بدورھا تسیر بعكس اتجاه حركة الشخصیة لذلك یجب على الشخصیة الھرب من الوحوش

.طبعا السیاراتتدھسھا أن مان دونألبر ا إلى

ھي التي سوف تكون الشاشة على نحو مقطع عرضي من المدینة :كیفیة العرض .المنطقة التي سوف یھرب فیھا بطل اللعبة

سوف یمثل الئحة األولن ینموذج إنشاءفي البدایة سوف نقوم ب ،حسنا :كیفیة العملالثاني سوف یشمل الواجھة الرئیسیة أما Exitو Aboutو Startالخیارات مثل

)MainForm (وحدات ٣ إنشاءوسوف نقوم ب)Modules (ى سوف تحتفظ األول أوامرالفرعیة والثانیة سوف تخصص لوضع وامربالمتغیرات وغیرھا من األ

مثل حدث الحركة والتصادم وسوف نقوم حداثألالخریطة والثالثة ل إنشاء أیضا

Page 100: تميز مع اليجوال بيسك 6 الاصدار 2

الشوارع والمباني والسیارات والوحوش إنشاءیقوم بدوره ب) Class(كائن إنشاءب .مور وغیره من ھذه األ

یحوي بدوره على Data األول فسوف یحوي على مجلدین بالنسبة لمجلد اللعبةأما یقونة أوھو غیر مھم یحوي على Iconوالخامات وغیرھا والمجلد االخر صواتاأل

.اللعبة

ه في إنشاءالذي تعلمنا Pakالخامات والصور سوف نضعھا في ملف من نوع تطبیقا على الدرس السابق والثاني ترتیبا األولین مرالدروس السابقة وذلك أل

.قبوال أكثرللمشروع لیصبح

بتجھیز المجلد والمشروع ءالبد :)٢(الخطوة

:في البدایة لنجعل شكل مجلد المشروع كما یلي

:كالتالي Dataوملف

وھي الشخصیة التي سوف تكون في اللعبة لذلك قم بنسخ Playerبالنسبة لملف ا إذات كساءوھو یحوي جمیع اإل Data.pakملف أما ،مجلد لعبتك إلىالشخصیة

التعدیل علیھ فیمكنك ذلك كما تعلمنا أردت .لعبتك إلىفقط قم بنسخھ أو سابقا

المشروع إنشاءب ٦المشروع باستخدام الفیجوال بیسك إنشاءبسوف نقوم اآلن :الوحدات والنماذج والكائنات كالتالي إضافةو

Page 101: تميز مع اليجوال بيسك 6 الاصدار 2

المحرك كما تعلمنا إضافةومن ثم نقوم ب :كالتالي سابقا

Page 102: تميز مع اليجوال بيسك 6 الاصدار 2

بنفس الطریقة كما تعلمنا DirectX8مكتبة إضافةونقوم ب :سابقا

.في النھایة قم بحفظ المشروع في مجلد اللعبة

Page 103: تميز مع اليجوال بيسك 6 الاصدار 2

)٢(عمل لعبة بسیطة :عشر السادس الدرس

+ رضاأل إنشاءو Data.pakفي البدایة سوف نقوم بتحمیل الخامات من ملف .مربع السماء وبالطبع تھیئة المحرك ووضع المتغیرات

Virtual3DWorld(Module)نضع الكود التالي في

' Scene Dims

Public V8 As TVEngine

Public Scene As TVScene

Public Inp As TVInputEngine

Public Texture As TVTextureFactory

Public Camera As TVCamera

Public Sky As TVAtmosphere

Public Land As TVLandscape

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

' Objects Dims

Public MainPlayer As TVActor2

Public House(0 To 45) As TVMesh

Public Tree(0 To 45) As TVMesh

Public Floor(0 To 45) As TVMesh

Public RightStreet(0 To 45) As TVMesh

Public CenterStreet(0 To 45) As TVMesh

Public LeftStreet(0 To 45) As TVMesh

Public Caution(0 To 7) As TVActor2

Public MonsterS(0 To 30) As TVActor2

Page 104: تميز مع اليجوال بيسك 6 الاصدار 2

Public Cars(0 To 30) As TVMesh

Public LevelBuilder As New VirtualLevelBuilder

Public FinishBox As TVMesh

Public PlayerControl As TVMesh

Public MovementMainPlayer As Boolean

سوف تظھر في اللعبة واسمھا التي ھذه المتغیرات المسؤولة عن جمیع الكائنات .یوضح ما ھو عملھا في اللعبة

وھو من نوع الكائن LevelBuilderلیھا جمیعھا باستثناء المتغیر إوقد تعرفنا شجار وحسب ما ألقمنا بعملھ وھو الذي سوف ینشىء المباني والشوارع وا الذي

.یحدده المبرمج

'PlayerMovement

Public Const Speed = 0.5

Public PlayerPositionX As Single, PlayerPositionY As Single, PlayerPositionZ As Single

Public PlayerPositionLast As D3DVECTOR, PlayerPositionNew As D3DVECTOR

Public CameraPositionX As Single, CameraPositionY As Single, CameraPositionZ As Single

Public CarsPositionX(0 To 30) As Single, CarsPositionZ(0 To 30) As Single

Public MonstersPositionX(0 To 30) As Single

.وحركة الكامیراھذه المتغیرات سوف تكون مسؤولة عن الحركة والتصادم

'LoopingDims

Page 105: تميز مع اليجوال بيسك 6 الاصدار 2

Public DoLoOp As Boolean

Public CameraStart As Boolean

.خر مسؤول عن وضع الكامیراآلمسؤول عن التكرار وا األولت ھذان المتغیرا

Public Sub Set_Dims(Enable As Boolean)

If Enable = True Then

Set V8 = New TVEngine

Set Scene = New TVScene

Set Inp = New TVInputEngine

Set Texture = New TVTextureFactory

Set Land = New TVLandscape

Set Camera = New TVCamera

Set Sky = New TVAtmosphere

Set FinishBox = New TVMesh

Set FinishBox = Scene.CreateMeshBuilder

End If

End Sub

.ھذه الدالة لتعریف المتغیرات في اللعبة

Public Sub CreateHandl(W As Long, H As Long, Bpp As Long)

With V8

.Init3DFullscreen W, H, Bpp

.SetAngleSystem TV_ANGLE_DEGREE

.DisplayFPS = True

End With

Page 106: تميز مع اليجوال بيسك 6 الاصدار 2

With Scene

.SetSceneBackGround 0, 0, 0

End With

End Sub

شاشة العرض كما تعلمنا إنشاءوھذه الدالة لتحدید سواقة اللعبة و . سابقا

Public Sub RenderingObjectsD3D(NameObject As String, ID As Integer)

Select Case LCase(NameObject)

Case Is = "caution"

Caution(ID).Render

Case Is = "skybox"

Sky.Skybox_Render

Case Is = "land"

Land.Render True

Case Is = "player"

MainPlayer.Render

Case Is = "monster"

MonsterS(ID).Render

End Select

End Sub

.للكائنات في التكرار Renderھذه الدالة فھي لعمل أما

Page 107: تميز مع اليجوال بيسك 6 الاصدار 2

Load_Formیمكنك االستغناء عن الدوال السابقة بوضع الكود في : مالحظة مھمة .مع مراعاة تغیر القیم

Public Function Close_D3d(Enable As Boolean)

If Enable = True Then

Set V8 = Nothing: Set Scene = Nothing: Set Inp = Nothing

End

End If

End Function

.ھذه الدالة جدیدة نوعا ما حیث تقوم بمسح قیمة المتغیرات وھي لیست بالضروریة

Page 108: تميز مع اليجوال بيسك 6 الاصدار 2
Page 109: تميز مع اليجوال بيسك 6 الاصدار 2

.VirtualLevelsنضع الكود التالي في

V8.OpenPAKFile App.Path + "\data\data.pak"

Texture.LoadTexture "\cur.bmp", "Cursor", , , TV_COLORKEY_BLACK

Texture.LoadTexture "\landmap.jpg", "HeightMap"

Texture.LoadTexture "\land.jpg", "Land"

Texture.LoadTexture "\skybox\back.jpg", "BackSky"

Texture.LoadTexture "\skybox\down.jpg", "DownSky"

Texture.LoadTexture "\skybox\front.jpg", "FrontSky"

Texture.LoadTexture "\skybox\left.jpg", "LeftSky"

Texture.LoadTexture "\skybox\right.jpg", "RightSky"

Texture.LoadTexture "\skybox\up.jpg", "UpSky"

Texture.LoadTexture "\house1\house1.jpg", "HouseA"

Texture.LoadTexture "\house2\house2.png", "HouseB", , , TV_COLORKEY_BLACK

Texture.LoadTexture "\house3\house3.jpg", "HouseC"

Texture.LoadTexture "\floor.jpg", "FloorTexture"

Texture.LoadTexture "\tree1.bmp", "TreeA"

Texture.LoadTexture "\tree2.bmp", "TreeB"

Texture.LoadTexture "\street.png", "StreetTexture"

Texture.LoadTexture "\Center.png", "CenterTexture"

Texture.LoadTexture "\carsa\1.jpg", "Car1"

Texture.LoadTexture "\carsa\2.jpg", "Car2"

Texture.LoadTexture "\carsa\3.jpg", "Car3"

Texture.LoadTexture "\carsa\4.jpg", "Car4"

Page 110: تميز مع اليجوال بيسك 6 الاصدار 2

Texture.LoadTexture "\carsa\5.jpg", "Car5"

Texture.LoadTexture "\notex.bmp", "NoTeX"

Texture.LoadTexture "\sun.jpg", "SunTex"

V8.ClosePAKFile

كما عرفنا Data.pakتقوم بتحمیل الخامات من ملف وامرھذه األ أن الحظ .سابقا

'CreateLand

With Land

.GenerateHugeTerrain App.Path + "\map.jpg", TV_PRECISION_LOW, 10, 10, 0, 0, True

.SetTerrainScale 1, 0.005, 1

.SetTexture GetTex("land")

End With

.ھا وقد سبق شرحھ إكسائو رضاأل نشاءفھو إل مرھذا األأما

'CreateSkyBox

With Sky

.SkyBox_SetTexture GetTex("frontsky"), GetTex("backsky"), GetTex("leftsky"), GetTex("rightsky"), GetTex("upsky"), GetTex("downsky")

.SkyBox_Enable True

.SkyBox_SetDistance 1000

.Sun_SetTexture GetTex("suntex")

.Sun_SetPosition 0, 400, 5000

.Sun_Enable True

Page 111: تميز مع اليجوال بيسك 6 الاصدار 2

End With

.مكعب السماء نشاءفھو إل مرھذا األأما

.)VirtualLevelBuilder(نقوم بتجھیز الكائن الرئیس اآلن

Page 112: تميز مع اليجوال بيسك 6 الاصدار 2

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)

Set House(ID) = New TVMesh

Set House(ID) = Scene.CreateMeshBuilder

Select Case LCase(TypeHouse)

Case Is = "housea"

V8.OpenPAKFile App.Path + "\data\data.pak"

House(ID).Load3DSMesh "\house1\house1.3ds"

V8.ClosePAKFile

House(ID).ScaleMesh ScaleX, ScaleY, ScaleZ

House(ID).SetPosition PositionX, PositionY, PositionZ

House(ID).SetRotation RotationX, RotationY, RotationZ

House(ID).SetTexture GetTex("HouseA")

Case Is = "houseb"

V8.OpenPAKFile App.Path + "\data\data.pak"

House(ID).Load3DSMesh "\house2\house2.3ds", False, False

House(ID).SetColor RGBA(1, 1, 1, 1)

House(ID).ScaleMesh ScaleX, ScaleY, ScaleZ

House(ID).SetPosition PositionX, PositionY, PositionZ

House(ID).SetRotation RotationX, RotationY, RotationZ

House(ID).SetTexture GetTex("HouseB")

Page 113: تميز مع اليجوال بيسك 6 الاصدار 2

Case Is = "housec"

V8.OpenPAKFile App.Path + "\data\data.pak"

House(ID).Load3DSMesh "\house3\house3.3ds"

House(ID).ScaleMesh ScaleX, ScaleY, ScaleZ

House(ID).SetPosition PositionX, PositionY, PositionZ

House(ID).SetRotation RotationX, RotationY, RotationZ

House(ID).SetTexture GetTex("HouseC")

End Select

End Sub

:تفسیر الكود

المباني في اللعبة وھي سوف تسھل على المبرمج إنشاءھذه الدالة مسؤولة عن أن الحظواع من المباني ویمكنك التعدیل علیھا وزیادة عدد أن ثالثة إنشاءا تقوم بأنھتصمیھا ونالحظ

.المباني

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

Page 114: تميز مع اليجوال بيسك 6 الاصدار 2

:تفسیر الكود

.تمثل الرصیف أو التي یةرضاأل نشاءھذه الدالة فھي إلأما

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)

Set Tree(ID) = New TVMesh

Set Tree(ID) = Scene.CreateMeshBuilder

Select Case LCase(TypeTree)

Case Is = "treea"

V8.OpenPAKFile App.Path + "\data\data.pak"

Tree(ID).Load3DSMesh "\tree1.3ds", False, False

V8.ClosePAKFile

Tree(ID).SetColor RGBA(1, 1, 1, 1)

Tree(ID).ScaleMesh ScaleX, ScaleY, ScaleZ

Tree(ID).SetPosition PositionX, PositionY, PositionZ

Tree(ID).SetRotation RotationX, RotationY, RotationZ

Tree(ID).SetTexture GetTex("treea")

Case Is = "treeb"

V8.OpenPAKFile App.Path + "\data\data.pak"

Tree(ID).Load3DSMesh "\tree2.3ds", False, False

Tree(ID).SetColor RGBA(1, 1, 1, 1)

Tree(ID).ScaleMesh ScaleX, ScaleY, ScaleZ

Page 115: تميز مع اليجوال بيسك 6 الاصدار 2

Tree(ID).SetPosition PositionX, PositionY, PositionZ

Tree(ID).SetRotation roationx, RotationY, RotationZ

Tree(ID).SetTexture GetTex("treeb")

End Select

End Sub

:تفسیر الكود

.شجارألن من اافي اللعبة الحظ یوجد نوع شجارألا نشاءھذه الدالة مخصصة إل

Public Sub Create_Street_D3D(ID As Integer, PositionX As Single, PositionY As Single, PositionZ As Single)

Set RightStreet(ID) = New TVMesh

Set RightStreet(ID) = Scene.CreateMeshBuilder

Set CenterStreet(ID) = New TVMesh

Set CenterStreet(ID) = Scene.CreateMeshBuilder

Set LeftStreet(ID) = New TVMesh

Set LeftStreet(ID) = Scene.CreateMeshBuilder

With LeftStreet(ID)

.CreateBox 160, 0.5, 90

.SetPosition PositionX, PositionY, PositionZ

.SetRotation 0, 0, 0

.SetTexture GetTex("streettexture")

End With

With CenterStreet(ID)

.CreateBox 160, 0.5, 10

Page 116: تميز مع اليجوال بيسك 6 الاصدار 2

.SetPosition PositionX, PositionY, PositionZ - 45

.SetRotation 0, 0, 0

.SetTexture GetTex("centertexture")

End With

With RightStreet(ID)

.CreateBox 160, 0.5, 90

.SetPosition PositionX, PositionY, PositionZ - 95

.SetRotation 0, 0, 0

.SetTexture GetTex("streettexture")

End With

End Sub

:تفسیر الكود

یمن،أ( أجزاءثالثة إلىتم تقسیم الشارع أنھ الشوارع الحظ ھنا نشاءھذه الدالة إل .الثالثة تمثل قطعة من شارع اللعبة وھكذا جزاءواأل) وسطو یسر،وأ

Public Sub Create_Caution_D3D(ID As Integer, PositionX As Single, PositionY As Single, PositionZ As Single)

Set Caution(ID) = New TVActor2

V8.OpenPAKFile App.Path + "\data\data.pak"

Caution(ID).Load "\caution.mdl"

V8.ClosePAKFile

Caution(ID).SetScale 0.5, 0.5, 0.5

Caution(ID).SetPosition PositionX, PositionY, PositionZ

Caution(ID).SetRotation 0, 0, 0

Page 117: تميز مع اليجوال بيسك 6 الاصدار 2

End Sub

:تفسیر الكود

تم تحدید عددھا في أنھمجسم الفتة التحذیر تذكر نشاءفھو إل مرھذا األأما .٨المتغیرات ب

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

:تفسیر الكود

إضافةوھم نوع واحد یمكنك التعدیل علیھا و ،الوحوش في اللعبة نشاءإل مرھذا األ .أخرىمجسمات

Page 118: تميز مع اليجوال بيسك 6 الاصدار 2

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

Page 119: تميز مع اليجوال بيسك 6 الاصدار 2

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

:تفسیر الكود

Page 120: تميز مع اليجوال بيسك 6 الاصدار 2

موجود 3dsا مجسم واحد من نوع أنھالسیارات والحظ ھنا نشاءإل مراألھذا أما .ولكن الذي یفرقھا ھو نوع الخامات Data.pakفي ملف أیضا

Page 121: تميز مع اليجوال بيسك 6 الاصدار 2
Page 122: تميز مع اليجوال بيسك 6 الاصدار 2
Page 123: تميز مع اليجوال بيسك 6 الاصدار 2

ى األولالمرحلة إنشاءب اآلنقمنا بتجھیز الكائن الرئیس سوف نقوم أن وبعد اآلن .VirtualLevelsفي DownTownضع الكود التالي في دالة

'CreateHouse

With LevelBuilder

.Create_House_D3D 0, "houseb", 83, Land.GetHeight(0, 0), 250, 0, 90, 0, 5, 5, 10

.Create_House_D3D 1, "housea", 250, Land.GetHeight(0, 0) + 90, 300, 0, 270, 0, 1, 1, 1

.Create_House_D3D 2, "houseb", 417, Land.GetHeight(0, 0), 250, 0, 90, 0, 5, 5, 10

.Create_House_D3D 3, "housec", 577, Land.GetHeight(0, 0) + 90, 300, 0, 0, 0, 0.5, 0.5, 0.5

.Create_House_D3D 4, "houseb", 744, Land.GetHeight(0, 0), 250, 0, 90, 0, 5, 5, 10

.Create_House_D3D 5, "housea", 911, Land.GetHeight(0, 0) + 90, 300, 0, 270, 0, 1, 1, 1

.Create_House_D3D 6, "houseb", 1078, Land.GetHeight(0, 0), 250, 0, 90, 0, 5, 5, 10

.Create_House_D3D 7, "housec", 1245, Land.GetHeight(0, 0) + 90, 300, 0, 0, 0, 0.5, 0.5, 0.5

.Create_House_D3D 8, "houseb", 1412, Land.GetHeight(0, 0), 250, 0, 90, 0, 5, 5, 10

.Create_House_D3D 9, "housea", 1579, Land.GetHeight(0, 0) + 90, 300, 0, 270, 0, 1, 1, 1

.Create_House_D3D 10, "houseb", 1746, Land.GetHeight(0, 0), 250, 0, 90, 0, 5, 5, 10

Page 124: تميز مع اليجوال بيسك 6 الاصدار 2

.Create_House_D3D 11, "housec", 1913, Land.GetHeight(0, 0) + 90, 300, 0, 0, 0, 0.5, 0.5, 0.5

.Create_House_D3D 12, "houseb", 2080, Land.GetHeight(0, 0), 250, 0, 90, 0, 5, 5, 10

.Create_House_D3D 13, "housea", 2247, Land.GetHeight(0, 0) + 90, 300, 0, 270, 0, 1, 1, 1

.Create_House_D3D 14, "houseb", 2414, Land.GetHeight(0, 0), 250, 0, 90, 0, 5, 5, 10

End With

:تفسیر الكود

VirtualLevelBuilderالمباني في اللعبة باستخدام نشاءإل وامرھذه األ

نشأناھا في الكائن الرئیسأیتشكل منھا كما التي البارامترات أن الحظ

:حیث یكون على النحو التالي

Id ،المتغیر،نوع المبنىx،y،z،rx،ry،rz،scaleX،ScaleY،ScaleZ

'CreateFloor

With LevelBuilder

.Create_Floor_D3D 0, 60, 0.5, 40, 30, Land.GetHeight(0, 0), 190, 0, 0, 0

.Create_Floor_D3D 1, 60, 0.5, 40, 90, Land.GetHeight(0, 0), 190, 0, 0, 0

.Create_Floor_D3D 2, 60, 0.5, 40, 150, Land.GetHeight(0, 0) + 0.3, 190, 0, 0, 0

.Create_Floor_D3D 3, 60, 0.5, 40, 210, Land.GetHeight(0, 0) + 0.3, 190, 0, 0, 0

.Create_Floor_D3D 4, 60, 0.5, 40, 270, Land.GetHeight(0, 0) + 0.3, 190, 0, 0, 0

Page 125: تميز مع اليجوال بيسك 6 الاصدار 2

.Create_Floor_D3D 5, 60, 0.5, 40, 330, Land.GetHeight(0, 0) + 0.3, 190, 0, 0, 0

.Create_Floor_D3D 6, 60, 0.5, 40, 390, Land.GetHeight(0, 0) + 0.3, 190, 0, 0, 0

.Create_Floor_D3D 7, 60, 0.5, 40, 450, Land.GetHeight(0, 0) + 0.3, 190, 0, 0, 0

.Create_Floor_D3D 8, 60, 0.5, 40, 510, Land.GetHeight(0, 0) + 0.3, 190, 0, 0, 0

.Create_Floor_D3D 9, 60, 0.5, 40, 570, Land.GetHeight(0, 0) + 0.3, 190, 0, 0, 0

.Create_Floor_D3D 10, 60, 0.5, 40, 630, Land.GetHeight(0, 0) + 0.3, 190, 0, 0, 0

.Create_Floor_D3D 11, 60, 0.5, 40, 690, Land.GetHeight(0, 0) + 0.3, 190, 0, 0, 0

.Create_Floor_D3D 12, 60, 0.5, 40, 750, Land.GetHeight(0, 0) + 0.3, 190, 0, 0, 0

.Create_Floor_D3D 13, 60, 0.5, 40, 810, Land.GetHeight(0, 0) + 0.3, 190, 0, 0, 0

.Create_Floor_D3D 14, 60, 0.5, 40, 870, Land.GetHeight(0, 0) + 0.3, 190, 0, 0, 0

.Create_Floor_D3D 15, 60, 0.5, 40, 930, Land.GetHeight(0, 0) + 0.3, 190, 0, 0, 0

.Create_Floor_D3D 16, 60, 0.5, 40, 990, Land.GetHeight(0, 0) + 0.3, 190, 0, 0, 0

.Create_Floor_D3D 17, 60, 0.5, 40, 1050, Land.GetHeight(0, 0) + 0.3, 190, 0, 0, 0

.Create_Floor_D3D 18, 60, 0.5, 40, 1110, Land.GetHeight(0, 0) + 0.3, 190, 0, 0, 0

Page 126: تميز مع اليجوال بيسك 6 الاصدار 2

.Create_Floor_D3D 19, 60, 0.5, 40, 1170, Land.GetHeight(0, 0) + 0.3, 190, 0, 0, 0

.Create_Floor_D3D 20, 60, 0.5, 40, 1230, Land.GetHeight(0, 0) + 0.3, 190, 0, 0, 0

.Create_Floor_D3D 21, 60, 0.5, 40, 1290, Land.GetHeight(0, 0) + 0.3, 190, 0, 0, 0

.Create_Floor_D3D 22, 60, 0.5, 40, 1350, Land.GetHeight(0, 0) + 0.3, 190, 0, 0, 0

.Create_Floor_D3D 23, 60, 0.5, 40, 1410, Land.GetHeight(0, 0) + 0.3, 190, 0, 0, 0

.Create_Floor_D3D 24, 60, 0.5, 40, 1470, Land.GetHeight(0, 0) + 0.3, 190, 0, 0, 0

.Create_Floor_D3D 25, 60, 0.5, 40, 1530, Land.GetHeight(0, 0) + 0.3, 190, 0, 0, 0

.Create_Floor_D3D 26, 60, 0.5, 40, 1590, Land.GetHeight(0, 0) + 0.3, 190, 0, 0, 0

.Create_Floor_D3D 27, 60, 0.5, 40, 1650, Land.GetHeight(0, 0) + 0.3, 190, 0, 0, 0

.Create_Floor_D3D 28, 60, 0.5, 40, 1710, Land.GetHeight(0, 0) + 0.3, 190, 0, 0, 0

.Create_Floor_D3D 29, 60, 0.5, 40, 1770, Land.GetHeight(0, 0) + 0.3, 190, 0, 0, 0

.Create_Floor_D3D 30, 60, 0.5, 40, 1830, Land.GetHeight(0, 0) + 0.3, 190, 0, 0, 0

.Create_Floor_D3D 31, 60, 0.5, 40, 1890, Land.GetHeight(0, 0) + 0.3, 190, 0, 0, 0

.Create_Floor_D3D 32, 60, 0.5, 40, 1950, Land.GetHeight(0, 0) + 0.3, 190, 0, 0, 0

Page 127: تميز مع اليجوال بيسك 6 الاصدار 2

.Create_Floor_D3D 33, 60, 0.5, 40, 2010, Land.GetHeight(0, 0) + 0.3, 190, 0, 0, 0

.Create_Floor_D3D 34, 60, 0.5, 40, 2070, Land.GetHeight(0, 0) + 0.3, 190, 0, 0, 0

.Create_Floor_D3D 35, 60, 0.5, 40, 2130, Land.GetHeight(0, 0) + 0.3, 190, 0, 0, 0

.Create_Floor_D3D 36, 60, 0.5, 40, 2190, Land.GetHeight(0, 0) + 0.3, 190, 0, 0, 0

.Create_Floor_D3D 37, 60, 0.5, 40, 2250, Land.GetHeight(0, 0) + 0.3, 190, 0, 0, 0

.Create_Floor_D3D 38, 60, 0.5, 40, 2310, Land.GetHeight(0, 0) + 0.3, 190, 0, 0, 0

.Create_Floor_D3D 39, 60, 0.5, 40, 2370, Land.GetHeight(0, 0) + 0.3, 190, 0, 0, 0

.Create_Floor_D3D 40, 60, 0.5, 40, 2430, Land.GetHeight(0, 0) + 0.3, 190, 0, 0, 0

.Create_Floor_D3D 41, 60, 0.5, 40, 2490, Land.GetHeight(0, 0) + 0.3, 190, 0, 0, 0

End With

:تفسیر الكود

:حیث تكون على النحو التالي) الرصیف( رضاأل نشاءالتالي فھو إل مراألأما

Id،scalex،scaley،scalez،px،py،pz،rx،ry،rz

'CreateTrees

With LevelBuilder

Page 128: تميز مع اليجوال بيسك 6 الاصدار 2

.Create_Tree_D3D 0, "treea", 2, 2, 2, 170, Land.GetHeight(0, 0), 190, 0, 90, 0

.Create_Tree_D3D 1, "treeb", 2, 2, 2, 330, Land.GetHeight(0, 0), 190, 0, 90, 0

.Create_Tree_D3D 2, "treeb", 2, 2, 2, 500, Land.GetHeight(0, 0), 190, 0, 90, 0

.Create_Tree_D3D 3, "treea", 2, 2, 2, 667, Land.GetHeight(0, 0), 190, 0, 90, 0

.Create_Tree_D3D 3, "treeb", 2, 2, 2, 827, Land.GetHeight(0, 0), 190, 0, 90, 0

.Create_Tree_D3D 3, "treea", 2, 2, 2, 987, Land.GetHeight(0, 0), 190, 0, 90, 0

.Create_Tree_D3D 3, "treeb", 2, 2, 2, 1147, Land.GetHeight(0, 0), 190, 0, 90, 0

.Create_Tree_D3D 3, "treeb", 2, 2, 2, 1307, Land.GetHeight(0, 0), 190, 0, 90, 0

.Create_Tree_D3D 3, "treea", 2, 2, 2, 1467, Land.GetHeight(0, 0), 190, 0, 90, 0

.Create_Tree_D3D 3, "treea", 2, 2, 2, 1627, Land.GetHeight(0, 0), 190, 0, 90, 0

.Create_Tree_D3D 3, "treeb", 2, 2, 2, 1787, Land.GetHeight(0, 0), 190, 0, 90, 0

.Create_Tree_D3D 3, "treeb", 2, 2, 2, 1947, Land.GetHeight(0, 0), 190, 0, 90, 0

.Create_Tree_D3D 3, "treeb", 2, 2, 2, 2107, Land.GetHeight(0, 0), 190, 0, 90, 0

.Create_Tree_D3D 3, "treea", 2, 2, 2, 2267, Land.GetHeight(0, 0), 190, 0, 90, 0

Page 129: تميز مع اليجوال بيسك 6 الاصدار 2

.Create_Tree_D3D 3, "treeb", 2, 2, 2, 2427, Land.GetHeight(0, 0), 190, 0, 90, 0

End With

:تفسیر الكود

شجار في اللعبة حیث تكون البارامترات كما وضعناھا ألا نشاءفھو إل مرھذا األأما :VirtualLevelBuilderفي

Id،نوع الشجرة،sx،sy،sz،px،py،pz،rx،ry،rz.

'CreateStreets

With LevelBuilder

.Create_Street_D3D 0, 80, Land.GetHeight(0, 0) + 0.5, 140

.Create_Street_D3D 1, 240, Land.GetHeight(0, 0) + 0.5, 140

.Create_Street_D3D 2, 400, Land.GetHeight(0, 0) + 0.5, 140

.Create_Street_D3D 3, 560, Land.GetHeight(0, 0) + 0.5, 140

.Create_Street_D3D 4, 720, Land.GetHeight(0, 0) + 0.5, 140

.Create_Street_D3D 5, 880, Land.GetHeight(0, 0) + 0.5, 140

.Create_Street_D3D 6, 1040, Land.GetHeight(0, 0) + 0.5, 140

.Create_Street_D3D 7, 1200, Land.GetHeight(0, 0) + 0.5, 140

.Create_Street_D3D 8, 1360, Land.GetHeight(0, 0) + 0.5, 140

.Create_Street_D3D 9, 1520, Land.GetHeight(0, 0) + 0.5, 140

.Create_Street_D3D 10, 1680, Land.GetHeight(0, 0) + 0.5, 140

.Create_Street_D3D 11, 1840, Land.GetHeight(0, 0) + 0.5, 140

.Create_Street_D3D 12, 2000, Land.GetHeight(0, 0) + 0.5, 140

Page 130: تميز مع اليجوال بيسك 6 الاصدار 2

.Create_Street_D3D 13, 2160, Land.GetHeight(0, 0) + 0.5, 140

.Create_Street_D3D 14, 2320, Land.GetHeight(0, 0) + 0.5, 140

.Create_Street_D3D 15, 2480, Land.GetHeight(0, 0) + 0.5, 140

End With

:تفسیر الكود

.الشوارع في اللعبة نشاءلكنھ إل ة،نفس االفكار السابق فھو التالي مراألأما

Id،px،py،pz،length

'CreateCautionObject

With LevelBuilder

.Create_Caution_D3D 0, 10, Land.GetHeight(0, 0), 170

.Create_Caution_D3D 1, 10, Land.GetHeight(0, 0), 120

.Create_Caution_D3D 2, 10, Land.GetHeight(0, 0), 70

.Create_Caution_D3D 3, 10, Land.GetHeight(0, 0), 20

End With

:تفسیر الكود

:مجسمات الفتة التحذیر وھو على النحو التالي نشاءإل مرھذا األ

Id،px،py،pz

'CreateMonsters

MonstersPositionX(0) = 30

Page 131: تميز مع اليجوال بيسك 6 الاصدار 2

MonstersPositionX(1) = 40

With LevelBuilder

.Create_Monsters 0, "monstera", MonstersPositionX(0), Land.GetHeight(0, 0) + 10, 100, 180, 0, 180, 0.5, 0.5, 0.5

.Create_Monsters 1, "Monstera", MonstersPositionX(1), Land.GetHeight(0, 0) + 10, 150, 180, 0, 180, 0.5, 0.5, 0.5

End With

:تفسیر الكود

تالحق الالعب وتحدید موقعھا االبتدائي التي الوحوش نشاءالتالي إل مراأل

For i = 0 To 1

MonsterS(i).SetAnimationID 5

MonsterS(i).SetAnimationLoop True

MonsterS(i).PlayAnimation 30

Next i

:تفسیر الكود

وھو Animationأو ولكنھ سھل ومھم وھو للحركة ،جدید مرھذا األأن الحظ ھنا یتم تسجیل مجموعة من ھحیث عند تصمیم Mdlخاص بالمجسمات من نوع

أو رقمأعلى ھیئة أما جسم مثل القفز والضرب والركض ویتم تسمیتھا الحركات للم .سماء وھكذاأعلى ھیئة

الثاني تكراراھا مررقم الحركة واأل األول مررقام حیث یمثل األأوھنا على شكل .داء الحركة أالثالث سرعة مرواأل

'CreateCars I Delete Car Number 3 (Problem in my engine)

CarsPositionX(0) = 475: CarsPositionZ(0) = 50

Page 132: تميز مع اليجوال بيسك 6 الاصدار 2

CarsPositionX(1) = 400: CarsPositionZ(1) = 150

CarsPositionX(2) = 970: CarsPositionZ(2) = 100

CarsPositionZ(3) = -90: CarsPositionZ(3) = -90

CarsPositionX(4) = 800: CarsPositionZ(4) = 150

CarsPositionX(5) = 575: CarsPositionZ(5) = 150

CarsPositionX(6) = 657: CarsPositionZ(6) = 50

CarsPositionX(7) = 1100: CarsPositionZ(7) = 50

CarsPositionX(8) = 1200: CarsPositionZ(8) = 150

CarsPositionX(9) = 1800: CarsPositionZ(9) = 100

CarsPositionX(10) = 1300: CarsPositionZ(10) = 150

CarsPositionX(11) = 1500: CarsPositionZ(11) = 150

CarsPositionX(12) = 900: CarsPositionZ(12) = 50

CarsPositionX(13) = 1200: CarsPositionZ(13) = 50

CarsPositionX(14) = 1600: CarsPositionZ(14) = 150

CarsPositionX(15) = 1600: CarsPositionZ(15) = 100

CarsPositionX(16) = 2000: CarsPositionZ(16) = 150

CarsPositionX(17) = 1800: CarsPositionZ(17) = 150

CarsPositionX(18) = 2000: CarsPositionZ(18) = 50

With LevelBuilder

.Create_Cars 0, "cara", CarsPositionX(0), Land.GetHeight(0, 0) + 13, CarsPositionZ(0), 0, 0, 0, 0.25, 0.25, 0.15

.Create_Cars 1, "carb", CarsPositionX(1), Land.GetHeight(0, 0) + 13, CarsPositionZ(1), 0, 0, 0, 0.25, 0.25, 0.15

Page 133: تميز مع اليجوال بيسك 6 الاصدار 2

.Create_Cars 2, "carc", CarsPositionX(2), Land.GetHeight(0, 0) + 13, CarsPositionZ(2), 0, 0, 0, 0.25, 0.25, 0.15

.Create_Cars 4, "care", CarsPositionX(4), Land.GetHeight(0, 0) + 13, CarsPositionZ(4), 0, 0, 0, 0.25, 0.25, 0.15

.Create_Cars 5, "cara", CarsPositionX(5), Land.GetHeight(0, 0) + 13, CarsPositionZ(5), 0, 0, 0, 0.25, 0.25, 0.15

.Create_Cars 6, "carb", CarsPositionX(6), Land.GetHeight(0, 0) + 13, CarsPositionZ(6), 0, 0, 0, 0.25, 0.25, 0.15

.Create_Cars 7, "cara", CarsPositionX(7), Land.GetHeight(0, 0) + 13, CarsPositionZ(7), 0, 0, 0, 0.25, 0.25, 0.15

.Create_Cars 8, "carb", CarsPositionX(8), Land.GetHeight(0, 0) + 13, CarsPositionZ(8), 0, 0, 0, 0.25, 0.25, 0.15

.Create_Cars 9, "carc", CarsPositionX(9), Land.GetHeight(0, 0) + 13, CarsPositionZ(9), 0, 0, 0, 0.25, 0.25, 0.15

.Create_Cars 10, "care", CarsPositionX(10), Land.GetHeight(0, 0) + 13, CarsPositionZ(10), 0, 0, 0, 0.25, 0.25, 0.15

.Create_Cars 11, "cara", CarsPositionX(11), Land.GetHeight(0, 0) + 13, CarsPositionZ(11), 0, 0, 0, 0.25, 0.25, 0.15

.Create_Cars 12, "carb", CarsPositionX(12), Land.GetHeight(0, 0) + 13, CarsPositionZ(12), 0, 0, 0, 0.25, 0.25, 0.15

.Create_Cars 13, "cara", CarsPositionX(13), Land.GetHeight(0, 0) + 13, CarsPositionZ(13), 0, 0, 0, 0.25, 0.25, 0.15

.Create_Cars 14, "carb", CarsPositionX(14), Land.GetHeight(0, 0) + 13, CarsPositionZ(14), 0, 0, 0, 0.25, 0.25, 0.15

.Create_Cars 15, "carc", CarsPositionX(15), Land.GetHeight(0, 0) + 13, CarsPositionZ(15), 0, 0, 0, 0.25, 0.25, 0.15

.Create_Cars 16, "care", CarsPositionX(16), Land.GetHeight(0, 0) + 13, CarsPositionZ(16), 0, 0, 0, 0.25, 0.25, 0.15

Page 134: تميز مع اليجوال بيسك 6 الاصدار 2

.Create_Cars 17, "cara", CarsPositionX(17), Land.GetHeight(0, 0) + 13, CarsPositionZ(17), 0, 0, 0, 0.25, 0.25, 0.15

.Create_Cars 18, "carb", CarsPositionX(18), Land.GetHeight(0, 0) + 13, CarsPositionZ(18), 0, 0, 0, 0.25, 0.25, 0.15

End With

:تفسیر الكود

.ھائإنشاھذا لتحدید مواقع السیارات االبتدائیة و مراأل أن الحظ

'Create Finisht Box

With FinishBox

.CreateCylinder 100, 100, 100

.SetPosition 2400, Land.GetHeight(0, 0) + 40, 100

.SetColor RGBA(0.6, 0.6, 0.1, 0.2)

End With

:تفسیر الكود

.خط النھایة نشاءبسیط وسھل وھو إل مراأل

كل مرة وامرتستطیع التخلي عن الكائن الرئیس بكتابة األ أنھتذكر :مالحظة ھامةعلى حدة للمجسم الواحد لكن ھذا غیر عملي وغیر منطقي حتى لذلك یفضل تكوین

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

Public Sub CreateMainPlayer()

Set MainPlayer = New TVActor2

Page 135: تميز مع اليجوال بيسك 6 الاصدار 2

PlayerPositionX = 120

PlayerPositionY = Land.GetHeight(0, 0)

PlayerPositionZ = 100

MainPlayer.Load App.Path + "\data\player\PlayerAct.x"

MainPlayer.SetScale 0.08, 0.08, 0.08

MainPlayer.SetPosition PlayerPositionX, PlayerPositionY, PlayerPositionZ

MainPlayer.SetRotation 270, 90, 0

MainPlayer.SetMaterial 0

'PlayerControl

Set PlayerControl = New TVMesh

Set PlayerControl = Scene.CreateMeshBuilder

With PlayerControl

.CreateBox 10, 10, 10

.SetPosition PlayerPositionX, PlayerPositionY, PlayerPositionZ

.SetColor RGBA(0, 0, 0, 0)

End With

End Sub

:تفسیرالكود

أن الالعب الرئیسي وتحدید موقع االبتدائي لكن الحظ ھنا نشاءإل وامرھذه األ Playerبل موجود في مجلد Data.pakالالعب الرئیسي غیر موجود في ملف

xالمجلد من النوع أن ومن الضروري المالحظة ھنا Dataالموجود في مجلد من كساءوھو مربوط بشكل خاص مع اإل TVActorوقد قمنا بتحمیلھ في متغیر

.بنفس االسم وفي المجلد نفسھ كساءیكون اإل أن قبل مصمم المجسم حیث یجب

Page 136: تميز مع اليجوال بيسك 6 الاصدار 2

Public Sub SetFirstCamera()

CameraStart = False

CameraPositionX = 110: CameraPositionY = 50: CameraPositionZ = -1000

Camera.SetPosition CameraPositionX, CameraPositionY, CameraPositionZ

Camera.SetRotation 20, 0, 0

End Sub

:تفسیرالكود

تلحق الالعب التي الكامیرا إلى ءھذا الكود لضبط وضع الكامیرا من كامیرا البد .یاتھاإحداثوضبط

Page 137: تميز مع اليجوال بيسك 6 الاصدار 2
Page 138: تميز مع اليجوال بيسك 6 الاصدار 2
Page 139: تميز مع اليجوال بيسك 6 الاصدار 2

)٣(عمل لعبة بسیطة :الدرس السادس عشر

خیرالحركة والتصادم والتكرار وھو الجزء األ إنشاءفي ھذا الدرس سوف نقوم ب .للعبة

الدالة المسؤولة عن نشاءوھو إل VirtualEventsنضع الكود التالي في وحدة .حركة الالعب الرئیس

Public Sub Input_Keys()

If Inp.IsKeyPressed(TV_KEY_ESCAPE) = True Then Close_D3d True: DoLoOp = False

'MainPlayer Controling

If Inp.IsKeyPressed(TV_KEY_RIGHT) = True Then

PlayerPositionX = PlayerPositionX + Speed

Page 140: تميز مع اليجوال بيسك 6 الاصدار 2

CameraPositionX = CameraPositionX + Speed

End If

If Inp.IsKeyPressed(TV_KEY_RIGHT) = False Then

DoWalk = False

MainPlayer.SetAnimationID 0

MainPlayer.SetAnimationLoop True

MainPlayer.PlayAnimation 10000

End If

If Inp.IsKeyPressed(TV_KEY_UP) = True Then

PlayerPositionZ = PlayerPositionZ + (Speed - 0.2)

CameraPositionZ = CameraPositionZ + (Speed - 0.4)

End If

If Inp.IsKeyPressed(TV_KEY_DOWN) = True Then

PlayerPositionZ = PlayerPositionZ - (Speed - 0.2)

CameraPositionZ = CameraPositionZ - (Speed - 0.4)

End If

End Sub

:تفسیر الكود

حركة الالعب تكون على المحور أن نالحظ ھناو ،واضح وغیر مبھم مراألx للیمین فقط من جھة الناظر والحركة على المحورz والخلف لألمام

اللعبة تاخذ مقطع أن إذمن جھة الناظر أیضا عرضی ا . ا

Page 141: تميز مع اليجوال بيسك 6 الاصدار 2

ي مقدار التغیر أفھو یمثل سرعة حركة الالعب Speedبالنسبة للثابت أما .

بكتابة الدالة المسؤولة عن حركة كامیرا النھایة والالعب الرئیس اآلننقوم :كالتالي

Public Sub GetWorldMovement()

If MovementMainPlayer = True Then

If PlayerPositionZ > 200 Then PlayerPositionZ = 200: CameraPositionZ = -60

If PlayerPositionZ < 4 Then PlayerPositionZ = 4: cameraposition = -100

MainPlayer.SetPosition PlayerPositionX, PlayerPositionY, PlayerPositionZ

PlayerControl.SetPosition PlayerPositionX, PlayerPositionY + 30, PlayerPositionZ

Page 142: تميز مع اليجوال بيسك 6 الاصدار 2

Else

PlayerControl.RotateY V8.TimeElapsed * 0.01

End If

Camera.SetPosition CameraPositionX, CameraPositionY, CameraPositionZ

End Sub

:تفسیر الكود

الذي یلیھ لضبط المسافة مروھو لتفعیل حركة الالعب واأل األول مراأل . z–الخلف إلىو z+مام ألا إلىیتحركھا الالعب التيالقصوى

فھو یمثل الصندوق الذي یرافق الالعب في حركتھ PlayerControlأما وھو غیر ظاھر على شاشة العرض وھو الذي سوف تدور حولھ الكامیرا

.في النھایة

نقوم بكتابة دالة الحركة الخاصة بباقي الكائنات مثل السیارات اآلن :وغیرھا

Public Sub MovementObjects()

For i = 0 To 18

MonstersPositionX(i) = MonstersPositionX(i) + 0.1

CarsPositionX(i) = CarsPositionX(i) - 0.3

Next i

Page 143: تميز مع اليجوال بيسك 6 الاصدار 2

MonsterS(0).SetPosition MonstersPositionX(0), Land.GetHeight(0, 0) + 10, 100

MonsterS(1).SetPosition MonstersPositionX(1), Land.GetHeight(0, 0) + 10, 150

Cars(0).SetPosition CarsPositionX(0), Land.GetHeight(0, 0) + 13, CarsPositionZ(0)

Cars(1).SetPosition CarsPositionX(1), Land.GetHeight(0, 0) + 13, CarsPositionZ(1)

Cars(2).SetPosition CarsPositionX(2), Land.GetHeight(0, 0) + 13, CarsPositionZ(2)

Cars(4).SetPosition CarsPositionX(4), Land.GetHeight(0, 0) + 13, CarsPositionZ(4)

Cars(5).SetPosition CarsPositionX(5), Land.GetHeight(0, 0) + 13, CarsPositionZ(5)

Cars(6).SetPosition CarsPositionX(6), Land.GetHeight(0, 0) + 13, CarsPositionZ(6)

Cars(7).SetPosition CarsPositionX(7), Land.GetHeight(0, 0) + 13, CarsPositionZ(7)

Cars(8).SetPosition CarsPositionX(8), Land.GetHeight(0, 0) + 13, CarsPositionZ(8)

Cars(9).SetPosition CarsPositionX(9), Land.GetHeight(0, 0) + 13, CarsPositionZ(9)

Cars(10).SetPosition CarsPositionX(10), Land.GetHeight(0, 0) + 13, CarsPositionZ(10)

Cars(11).SetPosition CarsPositionX(11), Land.GetHeight(0, 0) + 13, CarsPositionZ(11)

Cars(12).SetPosition CarsPositionX(12), Land.GetHeight(0, 0) + 13, CarsPositionZ(12)

Cars(13).SetPosition CarsPositionX(13), Land.GetHeight(0, 0) + 13, CarsPositionZ(13)

Cars(14).SetPosition CarsPositionX(14), Land.GetHeight(0, 0) + 13, CarsPositionZ(14)

Cars(15).SetPosition CarsPositionX(15), Land.GetHeight(0, 0) + 13, CarsPositionZ(15)

Page 144: تميز مع اليجوال بيسك 6 الاصدار 2

Cars(16).SetPosition CarsPositionX(16), Land.GetHeight(0, 0) + 13, CarsPositionZ(16)

Cars(17).SetPosition CarsPositionX(17), Land.GetHeight(0, 0) + 13, CarsPositionZ(17)

Cars(18).SetPosition CarsPositionX(18), Land.GetHeight(0, 0) + 13, CarsPositionZ(18)

SetCollisionD3d

End Sub

:الكودتفسیر

من مرة لكن أكثرالكود سھل وال داعي لشرحھ فقد تم الحدیث عن فكرتھ الخاص بحركة السیارات والوحوش اقصر مرتجعل األ أن الحظ ھنا یمكنك

.forالتكرار عن طریق استخدام

لیس من دوال مرھذا األ SetCollisionD3dوھو خیراأل مرالحظ األTrueVision نشائھا بعد قلیل وھي تخص إھي دالة سوف نقوم ب إنماو

.التصادم مع السیارات

Page 145: تميز مع اليجوال بيسك 6 الاصدار 2

:نقوم بكتابة دالة التصادم سابقة الذكر اآلن

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وھي سابقا

Page 146: تميز مع اليجوال بيسك 6 الاصدار 2

:الدالة الخاصة بالكامیرا في نھایة اللعبة إنشاءنقوم ب

Public Function EndOfTheGame(Enable As Boolean)

If Enable = True Then

MovementMainPlayer = False

Camera.SimpleFollowing PlayerControl, Vector(10, 0, 10)

Main.Timer1.Enabled = True

Else

End

End If

End Function

:تفسیر الكود

ره یطفاء اللعبة ویمكنك تغیإلوھو Timerھذا الكود یقوم بتفعیل أن نالحظ .ذلك إلىظھار صورة ربح وما إ إلىحسب رغبتك

كما یقوم بایقاف حركة الكائن الرئیس وجعل الكامیر تتبع حركة أیضاPlayerControl.

كما ترید والتعدیل علیھ ما یھمنا ھنا MenuForm إنشاءیمكنك اآلن . Mainال وھو أالنموذج الذي سوف یحمل التكرار

Load_Formنضع الكود التالي في

Page 147: تميز مع اليجوال بيسك 6 الاصدار 2

MovementMainPlayer = True

Set_Dims True

CreateHandl 1366, 768, 64

DownTown_Levell

DoLoOp = True

CreateMainPlayer

SetFirstCamera

:تفسیر الكود

نشاءلتفعیل حركة االعب والثاني لتعریف المتغیرات والثالث إل األول مراألوالخامس لتفعیل DownTownشاشة العرض والرابع لتحمیل الخریطة

.كامیرا البدایة خیرالالعب الرئیس واأل إنشاءالتكرار والخامس

نشائھا إقمنا ب التي ا الدوال أنھونالحظ .سابقا

.التكرار أمرنقوم بكتابة اآلن

Page 148: تميز مع اليجوال بيسك 6 الاصدار 2

Do While DoLoOp = True

DoEvents

Input_Keys

V8.Clear

RenderingObjectsD3D "land", 0

RenderingObjectsD3D "skybox", 0

RenderingObjectsD3D "caution", 0

RenderingObjectsD3D "caution", 1

RenderingObjectsD3D "caution", 2

RenderingObjectsD3D "caution", 3

RenderingObjectsD3D "player", 0

RenderingObjectsD3D "monster", 0

RenderingObjectsD3D "monster", 1

If CameraStart = False Then

CameraPositionZ = CameraPositionZ + V8.TimeElapsed * 0.3

Camera.SetPosition CameraPositionX, CameraPositionY + 100, CameraPositionZ

If CameraPositionZ > -100 Then CameraPositionZ = -100: CameraStart = True

End If

If CameraStart = True Then

MovementObjects

GetWorldMovement

End If

Page 149: تميز مع اليجوال بيسك 6 الاصدار 2

Scene.RenderAllMeshes

V8.RenderToScreen

Loop

:تفسیر الكود

.للكائنات Render إلى ضافةحداث باإلألنالحظ ھنا قد قمنا بوضع دوال ا

نشائھ الذي إالذي سوف نقوم ب Timer1 نضع ھذا الكود وھو خاص ب . GetWorldMovement تفعل دالة

Private Sub Timer1_Timer()

End

End Sub

.تممنا المشروع بفضل هللا أھكذا نكون قد

Page 150: تميز مع اليجوال بيسك 6 الاصدار 2

لذلك قمت باختصار ھذا المشروع ما ھو اال تطبیق على الدروس السابقة .الشرح نوعا ما

Menu

Main

Page 151: تميز مع اليجوال بيسك 6 الاصدار 2

الشاشة عن طریق تخزین أبعادب للتحكمخر وھو آبرنامج إنشاءیمكنك ومن ثم تعدیل اللعبة لتعمل screen.dataفي ملف خارجي مثال بعاداأل

. بعادعلى ھذه األ

.مرفقة مع الكتاب مثلةجمیع األ :تذكر

Page 152: تميز مع اليجوال بيسك 6 الاصدار 2

افكار متنوعة لتطبیقات مستقبلیة:: التاسع عشر الدرس

في ھذا الدرس سوف اقوم بعرض بعض االفكار اللتي یمكنك القیام بھا حسب ما .تعلمتھ سابقا

وعة الشمسیة حیث یتوجب معمل برنامج تعلیمي ثالثي االبعاد للمج) : ١(الفكرة بعضھا ومن ثم قم علیك االطالع على خصائص ھذه الكواكب وبعدھا النسبي عن

ات وما اال ذلك من ھذه مسمشروع وما یحتاجھ من اكساءات ومجبتجھیز مجلد الاالمور وفي الغالب تستطیع ان تجدھا على مواقع مختلفة في االنترنت ان لم تكن

من ھواة الرسم ، وبعد ذلك قم بتطبیق ما تعلمناه من حركة للمجسمات بحیث ینتقل ب ما بنقر زر من لوحة المفاتیح على سبیل المثال لو مستخدم البرنامج الى كوك

سوف یذھب للكوكب الثالث من المجموعة الشمسیة والذي یمثل ٣ضغط الزر عدد حیث معلومات مختلفة عن ھذا الكوكب من االرض ویطبع غلى شاشة البرنامج

.لھ و نسبة الماء فیھ المعادن االساسیة المكونة و االقمار

عمل مكتبة دوال برمجیة مصغرة خاصة لك تسھل علیك في المستقبل ) : ٢(الفكرة .صناعة االلعاب

في البدایة لتكن لعبة بسیطة تضم العبین ) online(عمل لعبة جماعیة ) : ٣(الفكرة العبین كل منھم على جھاز مختلف وتكون اللعبة مثال كرة ترتد بواسطة ٤او

ة یخسر وھذه الفكرة بسیطة حیث صندوق والالعب الذي ال یستطیع صد الكریتوجب علیك اما القیام برفع قاعدة بیانات على االنترنت وھذه القاعدة ھي اللتي

وھي تشمل عدة حقول ) االربع العبین(ستربط انتقال البیانات بین الحواسیب االربع وكون موقع الالعب ثابت في المحورین ) اسم الالعب ، النقاط ، موقع الالعب (

فالمتغیر الوحید یكون المحور السیني ، ولكن اعتقد وان كان Zي و المحور الصادھنالك عیب في ھذه الطریقة سوف یكون في سرعة نقل البیانات وبالتالي اخطاء

ناتجة من السرعة وذلك الن االتصال مع قاعدة بیانات مرفوعة على االنترنت لیس لفكرة ولكن بجعل احد ھذه اما الطریقة االخرى نفس ا) . Server(مع خادم

ویمكن ) Clients(وباقي االجھزة تكون عمالء ) Server(االجھزة ھو الخادم

Page 153: تميز مع اليجوال بيسك 6 الاصدار 2

winsock control( وھي االستعانة باحد ادوات الفیجوال بیسك لتحقیق ھذا الربط6.0. (

ویكون ، ... وغابات مثال حدیقة حیوانات عمل تجسید لمشاھد طبیعیة) : ٤(الفكرة .علیك في البدایة الحصول على المجمسات اما بتحمیلھا من االنترنت او بتصمیھا

.القیام بعمل مراحل جدیدة للعبة التي قمنا بتصمیمھا سابقا ) : ٥(الفكرة

Page 154: تميز مع اليجوال بيسك 6 الاصدار 2

الخاتمةھكذا وبحمد هللا قد تم ھذا الكتاب وھذا ال یعني ان العلم قد انتھى بل ھو مجرد

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

(یوما من طلب العلم بل قل ربي زدني علما وتذكر قولھ عز وجل ل ق یستوي ھلذین مون ال ذین یعل مون ال وال ما یعل ن ر إ وا یتذك ول لباب أ ) .األ

ما كتبھ ناقص فھو ناقص فالكمال ال یكون لبشر لذلك ال تعجب ان وجدت بعض االخطاء في الكتاب فقد جل من ال یسھو وفي حال اكتشاف خطأ یمكنك التواصل

.معي عبر وسائل التواصل االجتماعي التي سترد الحقا

محتوى الكتاب فھو یحتوي على معلومات جیدة تساعدك في البرمجة بشكل اما في عام وتصمیم االلعاب ومحركاتھا بشكل خاص وكون ان العلم الحدود لھ تستطیع

االطالع وقراءة مواضیع جدیدة عن برمجة االلعاب من خالل زیارة المواقع في .االسفل

: علیھا مواقع اثرائیة اضافیة انصح بالزیارة واالطالع

http://www.truevision3d.com/community.php

http://www.kutub.info/library/category/18

:على مواقع التواصل االجتماعي تفسار او النقدواخیرا یمكن التواصل معي لالس

[email protected]:: االیمیل التالیـ

Facebook :https://www.facebook.com/anas.anis.980

---------------------------- بحمد هللاتم الكتاب -----------------------------

Page 155: تميز مع اليجوال بيسك 6 الاصدار 2