تعلم لغة GDscript: الدوال #3

GDscriptبرمجة

اهلا بك في درس جديد وهو الدوال function  

يمكنك تخيل الدالة على أنها جهاز تدخل له بعض المدخلات ثم يقوم ببعض العمليات عليها وفي النهاية يعطينا مخرجات التي تكون النتيجة المطلوبة, دعونا نرى كيف تكتب

func Name():
    doSomething()

func sum():
    var x := 5
    var y := 10
    print(x + y)

حسنًا لتعريف أي دالة نكتب func ليعرف البرنامج اننا ننشئ دالة ثم إسم الدالة اختار أي إسم تريده ثم قوسين ( ) سنعرف ماذا تفعل تلك الأقواس لاحقًا

في الدالة الثانية لقد انشأت دالة خاصة بنا تدعى sum ــ اي جمع ــ داخلها عرفنا متغيرين x و y واعطيتها قيم 5 و 10 ثم نطبع مجموعهما print(x + y)  

الآن هكذا عرفت دالة و كتبت داخلها بعض الاكواد .. حاليًا الدالة مُعلقة ولن يتم تنفيذ أي كود داخلها

متى يتم تنفيذ اكواد الدالة التي انشأناها ؟

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

func _ready():
    print("Hello world!")

احدى تلك الدوال التي يبدأ المحرك في تنفيذ الاكواد هي دالة أساسية جاهزة تدعى func _ready, وهي تتبع ايضًا المسافات الفارغة كما ترى, داخل الدالة كتبنا جملة الطباعة .. وعند تشغيل البرنامج سيتم طباعة الجملة

كيف سيتم تنفيذ الدالة خاصتك ؟

حسنًا دعونا نرى المثال التالي

func sum():
    var x := 5
    var y := 10
    print(x + y)

func _ready():
    sum()

يجب ان نستدعي الدالة التي أنشأتها داخل الـ _ready لأنها إحدى الدوال الرئيسية التي يبدأ من خلالها البرنامج, تستدعيها عن طريق كتابة إسم الدالة فقط sum() داخل الـ _ready() هكذا سيتم طباعة 15

لكن هذه الدالة الذي تدعى sum ليست ديناميكية .. أي انها تجمع رقمين ثابتين وهما 10 و5 والنتيجة دائمًا ستكون 15.

بالنسبة لي, اريد ان ارسل لها أي رقمين وهي تجمعهما. 

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

func sum(x, y): # هذه الدالة الان تستقبل متغيران
    print(x + y)

func _ready():
    sum(5, 10) # مرر اي رقمين لتحصل علي مجموعهما

لاحظ اني قمت بإنشاء متغيرين x وy داخل أقواس الدالة sum, هذا معناه ان الدالة تلك تقبل متغيرين ثم داخل الدالة نستدعى دالة الطباعة ونطبع مجموعهما.

في دالة الـ ready قم باستدعاء دالة الـ sum وأرسل معها رقمين, اي رقمين تريدهما, وهكذا سيتم تنفيذ الاكواد داخل الدالة و يتم طباعة المجموع.
بالتالي تعريف الدالة هو

  • جهاز تدخل له بعض المدخلات ثم يقوم ببعض العمليات عليها وفي النهاية يعطينا مخرجات

لقد فهمت كيف ندخل لها المدخلات وتجري العمليات عليها .. لكن ما الذي يُقصد بـ يعطينا مخرجات ؟

هل الدوال قد ترجع لك الناتج لتستعملها ؟ 

نعم الدوال قد ترجع لك قيم تستعملها في اشياء اخرى

func sum(x, y):
    return x + y

func _ready():
    var z := sum(5, 10) # z استقبل الجمع وضعه في 
    print(z) # print value of z will be 15

انظر لمحتوى الدالة الاولى جيدًا, كلمة return هنا تعني أن تلك الدالة سترجع لك قيمة, ثم تستطيع ان تستقبل تلك القيمة الراجعة من الدالة في متغير ما, مثلما حصل في اول سطر من الدالة _ready

هكذا .. فمثلما قلت ان الدوال كالاجهزة تستقبل مدخلات ثم تجري عليها عمليات ثم تخرج لك بناتج العملية, فدالة الـ sum استقبلت رقمين ثم أجرت عليهما بعض العمليات ثم ارجعت لنا النواتج, فتستطيع أن تخزن ذاك الناتج في متغير واستخدامه في أي شيء آخر

تتذكر عندما كت تحدد نوع المتغير هكذا؟ 
var Name : Datatype = Value

كنت تكتب نقطتين فوق بعضهما  ( : ) ثم نوع البيانات int, وكنا نفعل هذا لمنع حدوث خطأ و ينبهنا البرنامج بذلك, ويمكنك عمل نفس الشىء مع المتغيرات التي تستقبلها الدوال

func sum(x : int, y : int): # to make sure the type of x, y is integer
    return x + y

func _ready():
    var z := sum(5, 10)
    print(z)

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

ماذا سيحدث ان لم نكتب النوع ؟

ان لم تكتب النوع قد نرسل بيانات غير صحيحة للدالة دون ان ندري والمحرك لن ينبهك, فقد نستمر في كتابة العديد من الاكواد والأمور وهناك خطأ لا ندري عنه سيسبب لك مشاكل لاحقًا

تمرير – pass

لقد انتهيت من شرح أساسيات الدوال .. وقبل ان انهي ساتكلم عن الـ pass  

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

هنا يأتي دور الـ pass

لاحظ اني حصلت على خطأ عندما لم اكتب شيء داخل الدالة واختفى عندما كتبت pass.
هي تساعد في كتابة دوال فارغة دون الحصول على خطأ, في الحقيقة هي لا تختصر على الدوال .. يمكنك استخدامها مع أي شيء يدعم المسافات الفارغة

مثل الـ if else في الدرس السابق

var x := 7
if x == 8:
    print(x)
elif x == 10:
    pass # هذا الشرط لن يقوم بعمل اي شيئ في الوقت الحالي
else:
    print(x + 5)

الأمر كأنك تريد ان تتجاهل شيء لكن لا تريد حذفه ايضًا, فهنا الشرط موجود لكن لا يفعل شىء في الوقت الحالي

ملاحظة أخيرة هناك نوعان أساسيان للدوال

  • الدوال الجاهزة – built-in functions
    وهي دوال جاهزة داخل البرنامج بمعنى انك لم تنشئها لأنها موجودة بالفعل وتم إنشاؤها مسبقا ودمجها داخل البرنامج, أنت فقط تستدعيها وتستخدمها ولا تتلاعب بالاكواد التي بداخلها, مثل :
    • _ready()
    •  _physics_process()
    • print()
  • دوال المستخدم – user-defined functions 
    وهي الدوال التي تنشئها أنت بنفسك مثل ما فعلنا وأنشأنا دالة خاصة بنا تدعى sum()

هذا كل شيء .. الدوال سنستعملها كثيرًا في الدروس القادمة والمشاريع سواء دوال جاهزة في البرنامج او دوال تنشئها بنفسك

4 3 votes
Article Rating
Subscribe
نبّهني عن
guest

0 تعليقات
Inline Feedbacks
View all comments