نظام الـAutoLoad للتحميل التلقائي في محرك Godot

Godot

نظام المَشَاهد في محرك الألعاب Godot هو نظام قوي، يُمكنك من إنشاء مشاهد بطريقة منظمة وبل ايضا يجمع بين فكرة الوراثة والكائنات في آن واحد. لكن يوجد مشكلة كبيرة به، ألا وهي تخزين المعلومات. 

انتقال اللاعب من مرحلة لاخرى يعني حفظ معلوماته ثم استعادتها مجددا في المرحلة الجديدة، معلومات مثل صحته وما يحمله من عتاد وكل ما هو متعلق به. 

ليس نقل معلومات اللاعب فقط، بل معلومات المستخدم نفسها، مثل مجموع نقاطه، فمن السيء أن ينتقل المستخدم إلى مرحلة/مشهد آخر ويجد أن عداد نقاطه رجع إلى 0.

لحل هذه المشكلة يوجد في المحرك نظام يسمى التحميل التلقائي – Autoload, أو التفرد – Singletons، وهو نظام فكرته إنشاء ملف نص برمجي – script، ويمكن الوصول إليه من أي كائن ومن أي مشهد في اللعبة، هكذا يمكنك حفظ المعلومات فيه ومن ثم استعادتها أو التعديل عليها في أوقاتُ لاحقة.

فكرة التحميل التلقائي – Autoload

عند اضافة الملف الى المحرك وتحديده كـ”تحميل تلقائي”، فعند تشغيل اللعبة، فسيقوم المحرك تلقائيا بوضع عقدة من نفس نوعه داخل المشهد الذي يعمل.

أي أن عند تشغيل لعبتك، شكل شجرة المشهد يكون مثل الصورة المجاورة.

حيث Global و PlayerVariables هما ملفين مختلفين وتم تحديدهم كتشغيل تلقائي. ونعم، يمكن اضافة اكثر من ملف وتحديدهم كملفات تحميل تلقائي.

بسبب هذا الشكل وبسبب هذا التنسيق في اضافة المشاهد، ينتج عنه أساليب ذكية في استدعاء الكائنات، وذلك نرجع إليه بعد قليل

استخداماته وما لا يقدر عليه

ذكرت من قبل بعض المشاكل البسيطة التي يُمكن حلها عن طريق استخدام هذه التقنية، لكن استخدامها لا ينحصر فقط على حفظ معلومات اللاعب والمستخدم فقط، بل أكثر من ذلك بكثير.
مثل : 

  • إنشاء متغيرات عامة لحفظ قيم يمكن الرجوع إليها في أي وقت
    • هل انهى اللاعب مهمة ام لا
    • اهي اول مرة يدخل في مكان ما أم لا
    • الأغراض المتواجدة في المتجر بعد وقبل الشراء
    • حفظ مسار أحد ملفات اللعبة (path)
  • إنشاء قواميس لحفظ مجموعة كبيرة من المعلومات
    • يمكن عمل قاموس يحفظ كل معلومات اللاعب {صحته، نقاطه، سلاحه، مكان وقفه، عتاده}
    • قاموس به كل انواع الاسلحة، هكذا يمكن أن تستخدم نفس المتغير للتعامل مع اللاعب والمتجر والعتاد الذي يقع على الأرض
    • قاموس لحفظ نصوص عامة للشخصيات الجانبية، مثل (مرحبا، اهلا، كيف الحال، السلام عليكم)
    • حفظ إعدادات المستخدم (صوت، لغة، إضاءة، جودة رسوميات، الاهتزاز، الظلال)
  • إنشاء دوال تقوم بعمليات متواجدة في أكثر من مكان، مثل :
    • دالة تحفظ تقدم اللاعب داخل ملف json أو txt
    • دالة تقوم بإنشاء عنصر واعطائه مجموعة من البيانات المحددة مسبقا (كائن باغراض قتالية)
    • عمل العمليات الرياضية المتكررة بكثرة مثل إيجاد مساحة شكل مضلع (polygon)
    • إرجاع قيمة اضائة والوان الغرفة اعتمادا على الوقت (إرسال الوقت واستلام الالوان)
  • أخرى
    • نقاط رجوع (checkpoint)، فعندما يدخل اللاعب الى مكان ويخرج منه، يخرج من نفس مكان الدخول
    • إنشاء نص برمجي لديه كل الاصوات العامة للعبة، وأمره بتشغيلها في الوقت المناسب.
    • اضافة أو ازالة عقد، او حتى التلاعب بقيمها بشكل عام (مثل أيقاف جميع ازرار اللعبة)

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

مع ذلك يوجد شيء مهم يجب ذكره، وهو ماهية الامور التي لا يقدر على فعلها هذا النظام، وهي تتمحور حول شيء واحد فقط, ولكنه مهم.

اغلاق اللعبة وفتحها يُعيد ضبط الملف لأصله

اي عندما تقوم بحفظ صحة اللاعب على 60 مثلا، وهي في الأصل كانت 100، فعندما تُعيد فتح اللعبة من جديد، ستجد أن صحة اللاعب اصبحت 100 وليس 60.

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

القيم طويلة المدى مثل تقدم اللاعب وما الأشياء التي قام بفتحها والقدرات التي اكتسبها، تلك في العادة يمكن عملها عن طريق نظام الحفظ، والذي يعمل على حفظ جميع البيانات داخل ملف json، وهو ليس موضوعنا.

مع ذلك يمكن استخدام نظام التحميل التلقائي كنظام حفظ مع الالعاب البسيطة.

تجهيزُه واستخدامُه

قم اولا بفتح مشروع اللعبة الخاص بك في محرك godot، ثم في نظام الملفات (أسفل يسار)، قم بالضغط بزر الفأرة الأيمن في أي مكان فارغ، ثم اختر New Script.

بعد ذلك تظهر واجهة إنشاء النصوص البرمجية، قم بكتابة الاسم الذي تريده ــ بالنسبة لي فاخترت اسم  “عام” Global ــ ثم الضغط على زر Create.

هكذا تكون قد أنشئت النص البرمجي – script الذي يمكن استعماله في نظام التحميل التلقائي. هو نفس الملف الذي تستطيع أن تحفظ فيه المتغيرات التي تريدها أو إنشاء الدوال التي تحتاجها.

كل ما عليك فعله الآن هو تحديد هذا الملف كـ تحميل تلقائي في اعدادات المشروع، لذا في اعلى يسار المحرك قم بالذهاب الى المسار التالي : Project >> Project Settings.

بهذه الطريقة تظهر لك واجهة الاعدادات، في الاعلى اختر Autoload التي منها يمكن تحديد الملف الذي نريده، حيث توجد علامة الملفات، وبالضغط عليها يظهر لك مدير الملفات، منه يمكنك اختيار الملف الذي قمت بانشائه. 

كل ما عليك فعله هو فقط كتابة الاسم الذي تريد استخدامه لاستدعاء ذلك الملف، تاكد أن يكون اسما بسيطا يمكن بسهولة كتابته، 

ثم قم بالضغط على زر Add الذي من شأنه تعريف المحرك بان هذا ملف تحميل تلقائي. ايضا تأكد من أن خيار Enable مُعلم بعلامة ✔

هكذا أصبح كل شيء جاهزا، يمكنك الذهاب الى أي عقدة اخرى بها نص برمجي – script، ثم استعمال نفس الاسم الذي قمت بكتابته للتعبير عن هذا الملف ــ بالنسبة لي سيكون Glob.

وبسبب طريقة المحرك في التعامل مع هذه التقنية، فيمكنك استعمال الأمر get_node() لاستدعائه ، وفي حال اردت التلاعب في قيمة من قيم المتغيرات خاصته، أو استدعاء ايا من دواله، فذلك يكون عن استخدام علامة النقطة  ( . ) ثم ذكر ما تريده، ليكون الاستخدام كالتالي : 

var GlobalScript = get_node("/root/Glob")
GlobalScript.VariablName # الان يمكنك أخذ هذه القيمة أو التعديل عليها
GlobalScirpt.FunctionName() # تأكد من وضع المعاملات داخل الأقواس أن وجدت

بطبيعة الحال يمكنك استعمال Glub بدلا من GlobalScript، ولكني وضعتها بهذا الشكل لتوضيح إمكانيات التعامل مع هذه التقنية.

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

المثال

اولا قم بعمل مشهدين، في كل مشهد يوجد زر ينقلك للمشهد الآخر ـ أي الأول ينقلك للثاني، والثاني ينقلك للاول ــ وفي منتصف المشهد يوجد نص مكتوب عليه 0 ونص آخر عليه اسم المشهد، واخيرا زر الانتقال.

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

extends Node
func _go_to(): 
  get_tree().change_scene_to_file("res://scene/path/Level.tscn")
  pass

تأكد من تغيير res://scene/path/Level.tscn بمسار المراحل الخاص بك، بالطبع هذه الأسطر متواجدة في كلا المشهدين، مع التأكد أن كلا منهما يشير الى الاخر.

كل ما يجب عليك فعله الان، هو إنشاء ملف تحميل تلقائي، قم بعمل واحد باسم global وسجله في المحرك. بداخله قم بعمل متغير بسيط باسم value بقيمة 0.

اخيرا نقوم باضافة دالة في كل مشهد من المشاهد تقوم على استلام قيمة المتغير value، ثم زيادته بـ10، ثم عرضه في المشهد، ليكون شكل الملفين هكذا : 

النصوص البرمجية للمشاهد

extends Node

func _ready(): 
  global.value += 10 # زيادة المتغير العمومي بـ10 
  $value.text = str(global.value) # اظهار قيمة المتغير في المشهد 
  pass

func _go_to(): 
  get_tree().change_scene_to_file("res://scene/path/Level.tscn")
  pass

النص البرمجي ذو التحميل التلقائي

extends Node

# المتغير العمومي
var value = 0 

وإذا ما قمت بعمل كل شيء بشكل صحيح، فيمكنك الان تشغيل احد تلك المشاهد والضغط على ازرار الانتقال وملاحظة ما يحدث.

في حال لم تستطع تتبع إنشاء المشروع، فيمكنك رؤيته على github أو تنزيله : 

في النهاية ذلك كان نظام التحميل التلقائي – autoload، الذي يعمل بمثابة نص برمجي يمكن الوصول إليه من أكثر من مكان، هكذا تستطيع حفظ القيم بداخله، واستدعائها في أي مكان تريد.

في حال كان يوجد مشكلة أو أردت كان لديك سؤال، فلا تبخل علينا به، قسم التعليقات مفتوح لحل جميع المشاكل المتعلقة بهذا النظام الرائع.

2 1 vote
Article Rating
Subscribe
نبّهني عن
guest

0 تعليقات
Oldest
Newest Most Voted
Inline Feedbacks
View all comments