snake_x86
26-09-2006, 04:05 PM
دروس في الدارك بيسيك الجزء الرابع
مع Snake_x86
هل قرأت الدروس السابقة؟
====الدرس الأول==== (http://www.montada.com/showthread.php?t=493085)
====الدرس الثاني==== (http://www.montada.com/showthread.php?t=493599)
====الدرس الثالث==== (http://www.montada.com/showthread.php?t=494555)
هذا الدرس ايضا عبارة عن مثال مشروح بالتفصيل داخلالمثال نفسه يمكن نسخه مع الشروحات الى الدارك بيسيك مباشرة .... شكرا لخاصية الـCommensts
علما انه يستحسن تشغيل الملف اللذي في المرفقات لانه منسق اي اسهل للقرائة
و هذا المثال يقوم بانشاء عشرة مكعبات ملونة و موزعة عشوائياً
و ستتحكم بأحد هذه المكعبات و استخدمت اسهل نظام تصادم بسيط حيث لن تستطيع
الدخول في المكعبات الاخرى :biggthump
يمكنك نسخ الكود الى الدارك بيسيك مباشرة مع التعليقات
حيث في الدارك بيسيك اي شيء تكتبه بعد " ` " لن يتم قرائته من قبل الـ compiler
و في المرفقات يوجد ملف مضغوط يحتوي على سورس لهذا المثال نفس الموجود هنا
لكنه منسق حيث التنسيق يحذف عند وضعه في المنتدى.
قبل المثال اريد ان اذكر ببعض الاشياء الضرورية
اولا في العالم الثلاثي الابعاد هناك ثلاث احداثيات
و الدارك بيسيك يرمز لها بـ X و Y و Z
X يعني س
Y يعني ص و اللذي هو الارتفاع كلما زادت قيمة Y اي زاد الارتفاع
Z اي العمق
و في الدارك بيسيك سيكون التعامل في اغلب الاحيان مع ال X و Z
خاصة في الالعاب اللتي يكون فيها ارتفاع اللاعب عن الارض ثابت
ثانيا العملية RND و اللتي هي مستخدمة بهذا المثال كثيرا
تقوم بارجاع عدد عشوائي بين 0 و الرقم اللذي تحدده
rnd(200)
ستقوم بارجاع رقم عشوائي بين 0 و 200
ثالثا كل اوبجكت نعطيه رقم معين يكون 1 او اكثر يرمز اليه
ولا يتشارك اوبجكتين برقم واحد
رابعا في الدارك بيسيك حركة رائعة وعي انك اذا لم تفهم احد الاوامر
في الكود ضع المؤشر فوق هذا الامر او الدالة و اضغط عليه بزر الماوس الايسر
سينتقل مؤشر الكتابة اليه و هنا اضغط على help ثم command help
او F1 و سظهر صفحة تشرح لك هذا الامر بالتفصيل .... واو
خامسا .... اذا كنت لا تفم ما هي عملية الـ for Next
حاول فهمها من المثال او راجع الدرس الثاني (http://www.montada.com/showthread.php?t=493599) من سلسلة دروسي هناك شرحتها بالتفصيل الممل
sync on `جعل عمليات تحديث الشاشة غير تلقائية اي يمكن التحكم بها
sync rate 60 `جعل معدل تحديث الشاشة 60 صورة بالثانية كحد اقصى
autocam off `منع الكانيرا من الانتقال او النظر الى اخر اوبجكت تم استدعائه
`الان نريد اعداد الاوبجكتات حيث نريد 10 اوبجكتات فنستخدم الأمر
`For ... next
`سيقوم بانشاء عشرة اوبجكتات و وضعها يمكان عشوائي
`و تفعيل كشف التصادم عليها
`ثم تلوينها بلون عشوائي
for i = 1 to 10
make object cube i,20 `انشاء اوبجكت على شكل مكعب و ترقيمها و اعطاءها حجم و هنا 20
position object i,rnd(300) - 150, 10 ,rnd(300) - 150 `وضع هذه الاوبجكن بمكان عشوائي
set object collision on i `تفعيل كشف التصادم لهذا الاوبجكت
color object i, rgb(rnd(250),rnd(250),rnd(250)) `تلوين هذا الاوبجكت بلون عشوائي
next i
`الان حصلنا على عشرة اوبجكتات عبارة عن مكعبات مرقمة من 1 الى 10
`كل منها وضعت بمكان عشوائي و لونت بلون عشوائي
`و تم تفعيل كشف التصادم عليها
do `بداية الدائرة الرئيسية
`الآن دخلنا بالدائرة الرئيسة
` Main Loop
`و هذه الدائرة عبارة عن مجموعة اكواد و أوامر ستتحكم باللعبة
`اولا نقوم بحفظ احداثيات اللاعب او المكعب اللذي سنتحكم به
oldx# = object position x(1)
oldz# = object position z(1)
`الأمر التالي يتحكم باللاعب و هو عبارة عن دالة قمت بانشائها
`و ستجدونها بآخر البرنامج
control_player()
`هذه الدالة ستقوم بالتحكم بالكاميرا
`و ستكون الكاميرا عمودية فوق اللاعب
control_camera()
`التصادم:
`في هذا المثال استخدمت عملية تصادم بسيطة جدا
`اذا اصتدم اللاعب بأحد المكعبات الاخرى
`سيتم نقله الى اخر احداثيات قبل ان يحدث التصادم
`و هنا سترون مدى اهمية العملية
`for ... nexr
`الان سنقوم بالتحقق من التصادم بين كل من المكعبات و اللاعب
`علما ان اللاعب هو الاوبجكت رقم 1
`ليس من الضروري ان يكون اللاعب هو الاوبجكت رقم 1 الامر يعود اليك
for i = 2 to 10
`هنا سيتم التحقق من حدوث تصادم بين اللاعب (الاوبجكت رقم 1) وبين الاوبجكتات الاخرى من 2 الى 10
`و اذا كان هناك تصادم نعيد اللاعب الى الاحداثيات اللتي قمنا بحفظها في اول الدائرة الرئيسية
if object collision(1,i) then position object 1,oldx#,10,oldz#
next i
sync `تحديث الشاشة هو امر ضروري جدا في كل نهاية دائرة رئيسية
loop `نهاية الدائرة الرئيسية
` هنا كعادتي اضع في آخر الرنامج الدوال اللتي استدعيها اول البرنامج
` لكي يكون البرنامج مرتب
`اول دالة هي اللتي تتحكم بالمكعب رقم 1 و اللذي هو اللاعب
` قمت باستدعائها في الدائرة الرئيسية
function control_player()
`اولا نحفظ احداثيات اللاعب في ثلاث متغيرات
x# = object position x(1)
`اريد هنا ان اذكر ان في الدارك بيسيك
` Y
`هي احداثية الارتفاع كلما زادت زاد ارتفاع الاوبجكت
y# = object position y(1) `حفظ احداثي الارتفاع
z# = object position z(1)
`الان بعد ان حصلنا على احداثيات اللاعب
`بتزويدها او تنقيصها حسب ضغط ازرار الاتجاهات في الكي بورد
`z# اذا كان زر (فوق) مضغوط في لوحة المفاتيح نزيد 1 على المتغير
if upkey() then inc z#,1
`z# هنا اذا كان زر (اسفل) مضغوط سننقص 1 من المتغير
if downkey() then dec z#,1
`اذا كان ر (اليسار) مضغوط نقلل من قيمة المتغير بمقدار 1
if leftkey() then dec x#,1
`عكس السابقة
if rightkey() then inc x#,1
`الان ننقل اللاعب او المكعب الى الاحداثيات المعدلة
position object 1,x#,y#,z#
endfunction
function control_camera()
`في هذه الدالة سنجعل الكاميرا فوق اللاعب
`نأخذ احداثيات اللاعب و نحفظها في متغيرات
x# = object position x(1)
y# = object position y(1)
z# = object position z(1)
`نقوم بتعيين متغيرات لحساب موضع الكاميرا
camx# = x# `نعطي هذه الاحداثية للكاميرا بدون تغيير
camy# = y# + 150 `هذه احداثية الارتفاع و بما اننا نريد ان تكون الكاميرا فوق اللاعب نزيد 150 عن احداثي اللاعب
camz# = z# - 5 `هنا انقصت 5 لتكون الكاميرا منحنية قليلا
`ننقل الكاميرا الى الاحداثيات اللتي حصلنا عليها
position camera camx#,camy#,camz#
`نجعل الكاميرا تنظر الى اللاعب
point camera x#,y#,z#
endfunction
ردا على طلب Son of UAE
سأتكلم قليلا عن الـ frames
افترض انك استخدمت الثري دي استوديو لانشاء موديل ثلاثي الابعاد
ثم قمت بتحريكه داخل الثري دي استوديو
علما ان الثري دي استوديو يتعامل مع الفريمز
على سبيل المثال نجعل من الفريمز من 0 الى 20 حركات الوقفة
اي سيقوم البطل بالتنفس
و من 20 الى 50 حركات المشي اي سيحرك البطل او الشخصية اقدامه و ايديه
بحيث يبدو انه يمشي لكنه فعليا ثابت بمكانه حيث التحريك يكون في الدارك بيسيك
و من الفريم 50 الى 70 حركات الضرب
ثم نقوم بتصديرها الى ملف ثري دي و الدارك بيسيك يدعم نوعين من ملفات الثري دي
الاول و الافضل هو ملف .x و الثاني و الذي لا يدعمه الدارك بيسيك جيدا و هو ملف 3ds
و يستحسن استخدام مقبس لتصدير لملفات x و الافضل هو مقبس panda Xporter (http://www.andytather.co.uk/Panda/directxmax_downloads.aspx)
و يمكنك تنزيله من هذه الصفحة (http://www.andytather.co.uk/Panda/directxmax_downloads.aspx)
الان نقوم بادخاله الى الدارك بيسيك.....
نضع الملف في مجلد المشروع اي المجلد اللذي ستضع فيه الملف التطبيقي للعبة
و نقوم بتحميله عن طريق استخدام load object
لنفرض ان لدينا ملف اسمه hero.x و نريد ان نعطيه الـ ID رقم 2
load object "hero.x" , 2
و الان في حال ضغط اي زر من اسهم الاتجاه نريد ان يقوم البطل بالتحرك و كأنه يمشي
و فريمات المشي هي من 20 الى 50 كما حددنا في الثري دي استوديو ماكس
هناك طريقتين للتشغيل الفريمات
loop object : تشغيل الفريمات و ستقوم باعادة نفسها عند النهاية
play object : تشغيل الفريمات و عند انتهاء الفريمات ستتوف عن الحركة
و الـ parameters متطابقة في كل من الدالتين
الان لجعل الشخصية تتحرك و كأنها تمشي(تذكرو اننا عينا للشخصية الـ ID رقم 2 و فريمات المشي من 20 الى 50)
loop object 2 , 20 , 50
هذه في حالة المشي اي عن ضغط اللاعب لاي زر من ازرار التحريك
عند يكون اللاعب واقف اي لا يضغط اي زر من ازرار التحريك يجب ان نشغل الفريمات التي
تظهر فيهاالشخصية واقفة اي الفريمات من 0 ال 20
loop object 2 , 0 , 20
و هكذا..............
و في حالة الضرب نستخدم
play object 2 , 50 , 70
و عند توقف انتهاء الفريمات
if object playing (2) = 0
نعود الى الحالة السابقة اي الوقوف او المشي
____________________________________________________
سأقوم قريبا بعمل مثال عن الفريمز و سيكون عبارة عن نفس المثال في هذا الدرس لكن
باستخدام موديلات بدل من المكعبات :biggthump
مع Snake_x86
هل قرأت الدروس السابقة؟
====الدرس الأول==== (http://www.montada.com/showthread.php?t=493085)
====الدرس الثاني==== (http://www.montada.com/showthread.php?t=493599)
====الدرس الثالث==== (http://www.montada.com/showthread.php?t=494555)
هذا الدرس ايضا عبارة عن مثال مشروح بالتفصيل داخلالمثال نفسه يمكن نسخه مع الشروحات الى الدارك بيسيك مباشرة .... شكرا لخاصية الـCommensts
علما انه يستحسن تشغيل الملف اللذي في المرفقات لانه منسق اي اسهل للقرائة
و هذا المثال يقوم بانشاء عشرة مكعبات ملونة و موزعة عشوائياً
و ستتحكم بأحد هذه المكعبات و استخدمت اسهل نظام تصادم بسيط حيث لن تستطيع
الدخول في المكعبات الاخرى :biggthump
يمكنك نسخ الكود الى الدارك بيسيك مباشرة مع التعليقات
حيث في الدارك بيسيك اي شيء تكتبه بعد " ` " لن يتم قرائته من قبل الـ compiler
و في المرفقات يوجد ملف مضغوط يحتوي على سورس لهذا المثال نفس الموجود هنا
لكنه منسق حيث التنسيق يحذف عند وضعه في المنتدى.
قبل المثال اريد ان اذكر ببعض الاشياء الضرورية
اولا في العالم الثلاثي الابعاد هناك ثلاث احداثيات
و الدارك بيسيك يرمز لها بـ X و Y و Z
X يعني س
Y يعني ص و اللذي هو الارتفاع كلما زادت قيمة Y اي زاد الارتفاع
Z اي العمق
و في الدارك بيسيك سيكون التعامل في اغلب الاحيان مع ال X و Z
خاصة في الالعاب اللتي يكون فيها ارتفاع اللاعب عن الارض ثابت
ثانيا العملية RND و اللتي هي مستخدمة بهذا المثال كثيرا
تقوم بارجاع عدد عشوائي بين 0 و الرقم اللذي تحدده
rnd(200)
ستقوم بارجاع رقم عشوائي بين 0 و 200
ثالثا كل اوبجكت نعطيه رقم معين يكون 1 او اكثر يرمز اليه
ولا يتشارك اوبجكتين برقم واحد
رابعا في الدارك بيسيك حركة رائعة وعي انك اذا لم تفهم احد الاوامر
في الكود ضع المؤشر فوق هذا الامر او الدالة و اضغط عليه بزر الماوس الايسر
سينتقل مؤشر الكتابة اليه و هنا اضغط على help ثم command help
او F1 و سظهر صفحة تشرح لك هذا الامر بالتفصيل .... واو
خامسا .... اذا كنت لا تفم ما هي عملية الـ for Next
حاول فهمها من المثال او راجع الدرس الثاني (http://www.montada.com/showthread.php?t=493599) من سلسلة دروسي هناك شرحتها بالتفصيل الممل
sync on `جعل عمليات تحديث الشاشة غير تلقائية اي يمكن التحكم بها
sync rate 60 `جعل معدل تحديث الشاشة 60 صورة بالثانية كحد اقصى
autocam off `منع الكانيرا من الانتقال او النظر الى اخر اوبجكت تم استدعائه
`الان نريد اعداد الاوبجكتات حيث نريد 10 اوبجكتات فنستخدم الأمر
`For ... next
`سيقوم بانشاء عشرة اوبجكتات و وضعها يمكان عشوائي
`و تفعيل كشف التصادم عليها
`ثم تلوينها بلون عشوائي
for i = 1 to 10
make object cube i,20 `انشاء اوبجكت على شكل مكعب و ترقيمها و اعطاءها حجم و هنا 20
position object i,rnd(300) - 150, 10 ,rnd(300) - 150 `وضع هذه الاوبجكن بمكان عشوائي
set object collision on i `تفعيل كشف التصادم لهذا الاوبجكت
color object i, rgb(rnd(250),rnd(250),rnd(250)) `تلوين هذا الاوبجكت بلون عشوائي
next i
`الان حصلنا على عشرة اوبجكتات عبارة عن مكعبات مرقمة من 1 الى 10
`كل منها وضعت بمكان عشوائي و لونت بلون عشوائي
`و تم تفعيل كشف التصادم عليها
do `بداية الدائرة الرئيسية
`الآن دخلنا بالدائرة الرئيسة
` Main Loop
`و هذه الدائرة عبارة عن مجموعة اكواد و أوامر ستتحكم باللعبة
`اولا نقوم بحفظ احداثيات اللاعب او المكعب اللذي سنتحكم به
oldx# = object position x(1)
oldz# = object position z(1)
`الأمر التالي يتحكم باللاعب و هو عبارة عن دالة قمت بانشائها
`و ستجدونها بآخر البرنامج
control_player()
`هذه الدالة ستقوم بالتحكم بالكاميرا
`و ستكون الكاميرا عمودية فوق اللاعب
control_camera()
`التصادم:
`في هذا المثال استخدمت عملية تصادم بسيطة جدا
`اذا اصتدم اللاعب بأحد المكعبات الاخرى
`سيتم نقله الى اخر احداثيات قبل ان يحدث التصادم
`و هنا سترون مدى اهمية العملية
`for ... nexr
`الان سنقوم بالتحقق من التصادم بين كل من المكعبات و اللاعب
`علما ان اللاعب هو الاوبجكت رقم 1
`ليس من الضروري ان يكون اللاعب هو الاوبجكت رقم 1 الامر يعود اليك
for i = 2 to 10
`هنا سيتم التحقق من حدوث تصادم بين اللاعب (الاوبجكت رقم 1) وبين الاوبجكتات الاخرى من 2 الى 10
`و اذا كان هناك تصادم نعيد اللاعب الى الاحداثيات اللتي قمنا بحفظها في اول الدائرة الرئيسية
if object collision(1,i) then position object 1,oldx#,10,oldz#
next i
sync `تحديث الشاشة هو امر ضروري جدا في كل نهاية دائرة رئيسية
loop `نهاية الدائرة الرئيسية
` هنا كعادتي اضع في آخر الرنامج الدوال اللتي استدعيها اول البرنامج
` لكي يكون البرنامج مرتب
`اول دالة هي اللتي تتحكم بالمكعب رقم 1 و اللذي هو اللاعب
` قمت باستدعائها في الدائرة الرئيسية
function control_player()
`اولا نحفظ احداثيات اللاعب في ثلاث متغيرات
x# = object position x(1)
`اريد هنا ان اذكر ان في الدارك بيسيك
` Y
`هي احداثية الارتفاع كلما زادت زاد ارتفاع الاوبجكت
y# = object position y(1) `حفظ احداثي الارتفاع
z# = object position z(1)
`الان بعد ان حصلنا على احداثيات اللاعب
`بتزويدها او تنقيصها حسب ضغط ازرار الاتجاهات في الكي بورد
`z# اذا كان زر (فوق) مضغوط في لوحة المفاتيح نزيد 1 على المتغير
if upkey() then inc z#,1
`z# هنا اذا كان زر (اسفل) مضغوط سننقص 1 من المتغير
if downkey() then dec z#,1
`اذا كان ر (اليسار) مضغوط نقلل من قيمة المتغير بمقدار 1
if leftkey() then dec x#,1
`عكس السابقة
if rightkey() then inc x#,1
`الان ننقل اللاعب او المكعب الى الاحداثيات المعدلة
position object 1,x#,y#,z#
endfunction
function control_camera()
`في هذه الدالة سنجعل الكاميرا فوق اللاعب
`نأخذ احداثيات اللاعب و نحفظها في متغيرات
x# = object position x(1)
y# = object position y(1)
z# = object position z(1)
`نقوم بتعيين متغيرات لحساب موضع الكاميرا
camx# = x# `نعطي هذه الاحداثية للكاميرا بدون تغيير
camy# = y# + 150 `هذه احداثية الارتفاع و بما اننا نريد ان تكون الكاميرا فوق اللاعب نزيد 150 عن احداثي اللاعب
camz# = z# - 5 `هنا انقصت 5 لتكون الكاميرا منحنية قليلا
`ننقل الكاميرا الى الاحداثيات اللتي حصلنا عليها
position camera camx#,camy#,camz#
`نجعل الكاميرا تنظر الى اللاعب
point camera x#,y#,z#
endfunction
ردا على طلب Son of UAE
سأتكلم قليلا عن الـ frames
افترض انك استخدمت الثري دي استوديو لانشاء موديل ثلاثي الابعاد
ثم قمت بتحريكه داخل الثري دي استوديو
علما ان الثري دي استوديو يتعامل مع الفريمز
على سبيل المثال نجعل من الفريمز من 0 الى 20 حركات الوقفة
اي سيقوم البطل بالتنفس
و من 20 الى 50 حركات المشي اي سيحرك البطل او الشخصية اقدامه و ايديه
بحيث يبدو انه يمشي لكنه فعليا ثابت بمكانه حيث التحريك يكون في الدارك بيسيك
و من الفريم 50 الى 70 حركات الضرب
ثم نقوم بتصديرها الى ملف ثري دي و الدارك بيسيك يدعم نوعين من ملفات الثري دي
الاول و الافضل هو ملف .x و الثاني و الذي لا يدعمه الدارك بيسيك جيدا و هو ملف 3ds
و يستحسن استخدام مقبس لتصدير لملفات x و الافضل هو مقبس panda Xporter (http://www.andytather.co.uk/Panda/directxmax_downloads.aspx)
و يمكنك تنزيله من هذه الصفحة (http://www.andytather.co.uk/Panda/directxmax_downloads.aspx)
الان نقوم بادخاله الى الدارك بيسيك.....
نضع الملف في مجلد المشروع اي المجلد اللذي ستضع فيه الملف التطبيقي للعبة
و نقوم بتحميله عن طريق استخدام load object
لنفرض ان لدينا ملف اسمه hero.x و نريد ان نعطيه الـ ID رقم 2
load object "hero.x" , 2
و الان في حال ضغط اي زر من اسهم الاتجاه نريد ان يقوم البطل بالتحرك و كأنه يمشي
و فريمات المشي هي من 20 الى 50 كما حددنا في الثري دي استوديو ماكس
هناك طريقتين للتشغيل الفريمات
loop object : تشغيل الفريمات و ستقوم باعادة نفسها عند النهاية
play object : تشغيل الفريمات و عند انتهاء الفريمات ستتوف عن الحركة
و الـ parameters متطابقة في كل من الدالتين
الان لجعل الشخصية تتحرك و كأنها تمشي(تذكرو اننا عينا للشخصية الـ ID رقم 2 و فريمات المشي من 20 الى 50)
loop object 2 , 20 , 50
هذه في حالة المشي اي عن ضغط اللاعب لاي زر من ازرار التحريك
عند يكون اللاعب واقف اي لا يضغط اي زر من ازرار التحريك يجب ان نشغل الفريمات التي
تظهر فيهاالشخصية واقفة اي الفريمات من 0 ال 20
loop object 2 , 0 , 20
و هكذا..............
و في حالة الضرب نستخدم
play object 2 , 50 , 70
و عند توقف انتهاء الفريمات
if object playing (2) = 0
نعود الى الحالة السابقة اي الوقوف او المشي
____________________________________________________
سأقوم قريبا بعمل مثال عن الفريمز و سيكون عبارة عن نفس المثال في هذا الدرس لكن
باستخدام موديلات بدل من المكعبات :biggthump