السلام عليكم ورحمة الله وبركاته
منذ زمن بعيد لم اكتب دروس وذلك بسبب ظروف كثيرة...حسنا..احاول ان اعوض ما فاتنى واكتب درس
درس اليوم عن كيفية عمل حركات اساسية لشخصية مثل الجرى والقفز والاصطدام بالارضيات والحوائط
اسمع شخص يقول..وما الجديد فى هذا؟؟ كل مبتدىء فى الجيم ميكر يعلم هذه الاشياء..وهنا اقول نعم لكن...والاعضاء يعرضون العابهم لاحظت فى بعض الالعاب (واخص بالذكر العاب البلاتفورم)اخطاء فى التصادم منها اخطاء طفيفة لا تؤثر على اللعبة ومنها اخطاء فادحة...لذا فهذا الدرس قد يفيد بعض الاعضاء الذين يريدون ان يجعلوا امكانيات العابهم افضل واشرح من خلاله دوال التصادم الاساسية ووظائفها بالتفصيل.
حسنا....الان نبدأ الدرس
1-
اول ما سنفعله بعد فتح البرنامج هو ادخال السبرايتس الخاصة بالشخصية وقد اخترت فى المثال الذى ارفقته مع
الدرس صور سونيك وهو واقف,يجرى ويقفز
ملحوظة:
دائما حاول ان تسمى السبرايتس باسماء معبرة مثل spr_sonic_run او spr_sonic_stand
فهذا ينظم عملك بطريقة افضل
2-
قبل ان نفعل اى شىء علينا ان نضبط الBounding box..لكن ماهو الBounding box؟؟
اذا نظرنا الى هذه الصورة نجد ان هناك مربع تكون حول السبرايت وهذا المربع اختيارات هى Automatic , Full Image, Manual
ثم هناك احداثيات هى Left,Right,Top,Bottom
فكرة الBounding box هى انه يكون مربع يحول السبرايت وهذا المربع هو الذى يقوم بعملية الاصطدام
مع اى كائن فى اللعبة..انظر الى الصورة
هنا نرى ان صورة الدب اصطدمت بصورة الكرة من خلال هذه المربعات..لكن طبعا هذا المربع وهمى
فاذا اخترنا Automatic فان البرنامج سيقوم بوضع المربع حول السبرايت فقط
اما Full Image فانه سيجعلها على الصورة كاملة
لكن Manual عند اختيارها فانها ستنشط جزء الاحداثيات ومنها تضع القيم بيدك والتى تراها مناسبة
حسنا...الان عرفنا الBounding box لكننا لم نعرف بعد ما معنى ان نضبطه
ضبطه التى اقصدها هى ان تجعل كل القيم واحدة لكل السبرايتس...كيف؟؟
انظر هنا!!
ويجب ايضا ان تضبط الOrigin وتجعله متساو فى الثلاث صور وان تجعل ايضا الصور
من اسفل لها نفس الابعاد
وهذه هى الخطوة الاولى فى اصلاح التصادم الخاص بلعبتك
سنقوم بعد ذلك بادخال سبرايتس خاصة لعمل الارض وانا دائما اقوم برسم مربع ثم اقوم بتوزيعه فى الغرفة وبعدها اخفيه...ارسم انت ارضيتك المناسبة فهذا ليس موضوعنا الان.
ثم ابدأ بادخال الاوبجيكت الخاص بالاعب وليكن obj_sonic والاوبجكت الخاص بالارض ويسمى obj_land
اجعل الارضية solid من خلال المربع الموجود بعد فتح obj_land
الان سنبدأ العمل الجاد..لذا يجب التركيز
افتح obj_sonic واختر من قائمة الاحداث الحدث create
وبعدها اجذب Excute a peice of code الموجودة فى قائمة control
انظر هنا
افتحها واكتب فيها هذه المتغيرات
ماهى هذه المتغيرات؟؟
المتغير run هو المتغير الخاص بالجرى فاذا كانت قيمته تساوى صفر
فهذا يعنى انه واقف اما اذا كان =1 اذا فالشخصية تجرى
jump هو متغير يعبر عن القفز فلو ان قيمته تساوى صفر يكون معناه ان
اللاعب ملامس للارضية (اى ثابت عليها سواء كان واقف اى run=0 او يجرى run=1 )
هنا دور الجاذبية...اذا لم تقم بوضع الجاذبية فى لعبتك فان اللاعب يظل معلقا اذا قفز
ومنها يأتى سؤال..هل الجاذبية مؤقتة ام دائمة...هل اذا قفزت انت فى مرة ستهبط على الارض وفى مرة اخرى ستظل معلق فى الهواء؟؟..الاجابة:الجاذبية دائمة واذا كان الحدث دائم فاننا نستعمل الحدث step
السؤال الاخر هو..متى تشعر بتأثير الجاذبية؟؟ دائما تشعر به وانت فى الهواء عندما تقفز اما عندما تنزل الى الارض فلا تشعر بها..فالجاذبية لا تجذبك ناحية الارض اذا كنت ملامس لها...اذا لعمل جاذبية فى الجيم ميكر نختار الحدث step
ونجذب excute a peice of code ثم نكتب داخلها هذا الكود
كود:
{
if place_free(x,y) {gravity=0.5} else {gravity=0}
if run=1 {sprite_index=spr_sonic_run;image_speed=0.5}
if run=0 && jump=0 && vspeed=0 {sprite_index=spr_sonic_stand}
if run=0 && jump=1 {sprite_index=spr_sonic_jump;image_speed=1}
if vspeed!=0 {sprite_index=spr_sonic_jump;image_speed=1}
}
ومعنى هذا الكود واضح..يعنى اذا كان المكان حر وغير مصطدم بشىء (ارضية او غيره)...وهذا المكان حددنا احداثياته بx,y حيث انهما قيمتين معروفين
للبرنامج تدل على احداثيات الكائن الذى تكتب فيه هذا الكود فان الجاذبية تكون مساوية 0.5 والا (اى اذا كان ملامس لأى شىء) فان الجاذبية ستكون مساوية لصفر.
الاكواد الخرى شرحتها من قبل لو لم تفهمها سأعيد شرحها مرة اخرى
الخطوة التالية هى عند حدث اصطدام اللاعب بالارضية..انظر هنا
نضع هذا الكود
كود:
{
move_contact_solid(direction,12)
if vspeed>0
{
jump=0
run=0
}
vspeed=0
}
معنى هذا الكود:
اذا اصطدمت بالارضية فان هناك اتصال سيحدث بين اللاعب والارضية الصلبة(وعرفنا كيف نجعل الارضية solid)
وهذا الاتصال يكون فى اتجاه direction (اى يكون فى الاتجاه الذى يتجه اليه اللاعب يعنى لو اللاعب يتجه يمينا فيكون الاتجاه لليمين وان كان لليسار
فالاتجاه لليسار)
اما القيمة 12 فهى تعبر عن القوة القصوى للتصادم وكلما زادت كلما كان الثبوت على الارض اكثر ونعطى مثال:
اذا ازدت قيمة الgravity وانقصت القيمة هذه فان التصادم سيكون به خلل حيث تجد انه قبل ان يلامس الارضية تبطأ سرعته الى
ان يستقر على الارض لذا حاول ان يكون هناك تناسب بين القيمتين
طبعا الكود التالى للتحكم فى المتغيرات حيث يجعل متغير القفز يساوى صفر فهذا معناه انه مستقر على الارض وايضا نجعل متغير الجرى مساوى لصفر ايضا
الكود الاخير vspeed=0 لابد منه والا ستجد ان اللاعب يستقر على الارض فترة قصيرة ثم يخترق الارضية
وينزل بسرعة كبيرة منها...لاحظ ايضا ان الكود يجب ان يكون بهذا الترتيب فلو انك عكسته سيسبب خلل فى التصادم..ممكن تجرب اذا شئت
الان عند الضغط على زر اليسار..انظر هنا
ضع الكود:
كود:
{
image_xscale=-1
if jump=0 then run=1
}
الكود الاول يجعل صورة الشخصية تنظر للاتجاه الاخر (وهذه نستعملها بدلا من ان نضع صروة للاعب وهو ينظر لليمين وصورة اخرى وهو ينظر لليسار)
الكود الثانى لتغيير قيمة متغر الجرى كما كتبت من قبل
الان الجزء المهم...الان وانت واقف ومستقر على الارض اسألك هل تستطيع التحرك ؟؟
الاجابة هى انك ستتحرك اذا لم يكن هناك عائق فى طريقك..اى اذا كان امامك وخلفك مساحات خالية...لذا ضع الكود الاتى
كود:
{
if place_free(x-5,y) {x-=5}
}
حيث اننا يهمنا ان تكون المساحة خالية على بعد 5px من يساره لأنه سيتحرك جهة اليسار
ثم نكتب الكود x-=5 لكى يتحرك اى انه يتحرك فى حالة تحقق ذلك
وهذا الجزء الاول...اما الاخر فاذكره بمثال وهو مثال سوبر ماريو...عندما يقفز سوبر ماريو فانه يتحرك يمينا ويسارا وهو قافز
بشرط ان يكون هناك مساحات خالية على يساره و يمينه و اعلاه واسفله لذا نضيف هذا الكود:
كود:
{
if place_free(x-5,y-8) {x-=5;y-=8;move_contact_solid(270,12)}
}
ومعناه..اذا كانت المساحة خالية امام اللاعب على بعد 5pxمن يساره وعلى على بعد 8px من اعلاه فانه سيتحرك
فى اتجاه x مسافة 5 ناحية اليسار وفى اتجاه y لاعلى مسافة 8
وهذا الجزء الذى يهمله معظم الاعضاء فى العابهم
الان كما فعلت هذا لحدث ضغط زر اليسار افعله مع الحدث الخاص بضغط زر اليمين مع عكس القيم image_xscale,x
الان الجزء قبل الاخير
وهو كيفية القفز..نسألك متى تستطيع القفز؟؟ والجواب يكون عندما تكون ملامس الارضية
فانت لا تستطيع القفز وانت فى الهواء لأن الجاذبية تؤثر عليك وتعوق اتجاهك لأعلى...لذا فى الحدث الخاص بضغط زر القفز اكتب هذا الكود
كود:
{
if place_metting(x,y+1,obj_land)
{
jump=1
run=0
vspeed=-10
}
}
ومعناه..اذا كان اللاعب ملامس للارضية سواء على يمينه او يساره او اسفله بمقداار 1px فسيكون هناك قفز
وطبعا غير قيم المتغيرات اياها واجعله يقفز عن طريق كتابة vspeed= وقيمتها تكون سالبة
يبقى شىء صغير لننتقل لاخر نقطة وهو عندما ترفع يدك عن زر اليسار فان اللاعب يتوقف ...يجب عليك ان تغير صورته وانظر هذه الجزئية فى مثالى
الان الجزء الاخير:
وهو هل سيكون التصادم ممتاز ولا عيوب به؟؟
هنا اقول لك حتى الان تقريبا لا..لكن بخطوة صغيرة سيصبح تمام باذن الله.كيف؟؟
سندخل صورة اخرى صغيرة عبارة عن مربع بلون مخالف للارضية او مثلها اذا اردت ونضيف الاوبجيكت ونختاره
وسنسميه obj_border
انظر الصور
بعد ان ادخلته اجعله مطابق ل
obj_land من خلال
parent كما فى الصورة
وضعها على الحواف كما فى الصورة
وبهذا يكون التصادم كامل ومتقن....المثال موجود بالمرفقات كتطبيق لهذا الدرس المطول
ارجو ان اكون وفقت فى الشرح وان يستفيد كل عضو من هذا الدرس الطويل...فى انتظار اى استفسار او سؤال...وتطبيق هذا الدرس موجود بالمرفقات
والسلام عليكم