هذا نص مترجم آليًا وقد يحتوي على أخطاء!
من أين تأتي هذه المعلومات؟
الكثير من هذا مجرد إعادة سرد للوثائق الرسمية لـ Godot. فيما يلي بعض الروابط المفيدة للوثائق الرسمية (التي أوصي بها بشدة على Piggy، ولكن إذا كنت تفضل هذه، فلا بأس في استخدامها!)
موارد مفيدة:
ماذا عن الرسومات، هل يجب عليّ أن أصنعها بنفسي؟
لا! يمكنكم العثور على الكثير من الأصول المجانية هنا:
روابط مفيدة أخرى:
محركات ألعاب أخرى؟
إذا كنت تفضل، يمكنك استخدام محركات ألعاب أخرى. أمثلة على محركات ألعاب أخرى هي:
هناك العديد من الخيارات الأخرى أيضًا، ابحث إذا كنت ترغب في تجربة شيء آخر!
ما هو Godot؟
Godot (تنطق Guh-doh)، هو محرك ألعاب (Game Engine). ببساطة، هو برنامج يسمح لك بإنشاء ألعاب (أو برامج عادية إذا أردت). يمكن لـ Godot أن يفعل معظم ما يمكن لمحركات الألعاب الأخرى القيام به، سواء كان ذلك ثنائي الأبعاد أو ثلاثي الأبعاد.
أمثلة على الألعاب التي تم إنشاؤها في Godot: Godot Showcase
ليس فقط الألعاب المستقلة (Indie games) التي تم إنشاؤها في Godot، Sonic Colors Ultimate تم إنشاؤها باستخدام Godot!
كيف تحصل على غودوت؟
يمكنك إما تنزيل غودوت من:
- الموقع الرسمي: الموقع الرسمي لغودوت، أو عبر ستيم: غودوت على ستيم.
ما عليك سوى التنزيل والتثبيت (أو التشغيل مباشرةً عبر ستيم).
إنشاء مشروع جديد!
عند بدء تشغيل محرك جودت، سيظهر لك هذا النافذة:
سيُطلب منك هنا اختيار لغة البرمجة، إما GDScript أو C++. تشبه لغة GDScript إلى حد كبير لغة بايثون.
الاختلافات بين لغتي GDSCRIPT و PYTHON (بدون تلوين الأكواد):
def hello():
text = "Hello world!"
print(text)
func hello():
var text = "Hello world!"
print(text)
بالنسبة للمتغيرات في لغة البايثون تحتاج فقط لكتابة اسم المتغير مباشرةً أما في لغة GD Script عليك كتابة الكلمة الأساسية var أولاً وبالنسبة لإنشاء الدوال يجب أن تبدأ بكتابة كلمة func بدلاً من استخدام def المستخدمة في البايثون .
Scenes & Nodes
أحد أهم المفاهيم في Godot هو Scenes و Nodes. يمكننا أن نبدأ بـ Nodes. Node هو كائن في Godot، ويمكن أن يمثل أي شيء. يمكن أن يكون شيئًا يمثل لاعبًا، أو عدوًا، أو زرًا في قائمة، أو نصًا على الشاشة، أي شيء. Scenes هي مجموعة من Nodes.
هنا سنقوم بإنشاء مثال بسيط جدًا.
الجزء الأول أ - إعداد مشهد اللاعب
في أعلى نافذة غودوت، اضغط على زر «٢ دي» لتغيير العرض إلى عرض ثنائي الأبعاد.
على الجانب الأيسر من النافذة، ستظهر واجهة المستخدم التالية:
اضغط على الزر الآخر («Other Node») وابحث عن «CharacterBody2D»، ثم اختره واضغط على «Create». تُستخدم هذه العقدة (Node) للاعب في بيئة ثنائية الأبعاد. قد تلاحظ مثلث تحذير ⚠️ بجانب عقدة «CharacterBody2D». والسبب هو أنها تحتاج بعض العناصر التي يفضل توفرها فيها.
إذا قمت بالنقر بزر الماوس الأيمن فوق العقدة، فستجد خيار إضافة طفلة (+ Add Child Node…). استخدم هذا الخيار لإضافة عقدتين: Sprite2D وCollisionShape2D. يُستخدم Sprite2D لإضافة رسم بياني للشخصية، بينما يستخدم الثاني للتحقق من التصادمات. يمكنك أيضاً إعطاؤهما أسماءً إذا كان ذلك يسهل عليك تتبع الأمور. لقد أعطيتُ شخصي CharacterBody2D اسم “Player”. ينبغي أن يبدو المشهد كما يلي الآن:
الجزء الأول بـ - إصلاح التحذير على CollisionShape2D
تظهر مثلثات التنبيه في هذه الحالة لأن شكل التصادم (CollisionShape2D) يفتقر فعليًا إلى خاصية الاصطدام. يمكنك حل ذلك بالنقر فوق العقدة الموجودة على اليسار، مما سيفتح لوحة معلومات على الجانب الأيمن. ستحصل هنا على مجموعة من المعلومات حول العقدة التي يمكن تعديلها. يُنصح بالتجربة مع الخيارات المتاحة هناك. ولكن العنصر الذي نريد التركيز عليه هو “الشكل” (Shape)، حيث قم بتعيينه مثلاً إلى RectangleShape2D. لا يهم كثيرًا ما تختاره؛ إذ أننا لن نستخدم خصائص التصادم هنا.
الجزء 1ج - إضافة كائن Sprites ورسوميات
إذا قمت بالنقر على عنصر Sprite2D الموجود في القائمة اليسرى، سيظهر الحقل المقابل له إلى اليمين حيث يظهر النص “Texture” (الملمس/الخامة). يمكنك هنا وضع صورة للاعب. كل ما عليك فعله هو سحب وإفلات الصورة داخل هذا الحقل.
ستكون النتيجة كما يلي بعد إضافة الكائن الرسومي (sprite):
الجزء الثاني - إضافة مدخلات، تحكم
في أعلى النافذة توجد قائمة، “Scene - Project - Debug - Editor - Help”. اضغط على “Project” ثم “Project Settings”. هنا تظهر لك قائمة بإعدادات كثيرة. اضغط على “Input Map”. هنا يمكنكم إعداد أزرار على لوحة المفاتيح.
- في حقل “Add New Action”، اكتب “left” ثم اضغط “Add”.
- ثم أضف “right” و “up” و “down”.
- تصبح هذه معروفة باسم “Actions”
- في كل “Action” يمكنكم إدخال أزرار عن طريق الضغط على زر + على اليمين.
- هنا فقط اضغط على لوحة المفاتيح، ثم اضغط Add.
- أضف أزرار لجميع الـ actions.
الجزء 3 - إضافة سكريبت للتحكم في اللاعب.
لكي نتمكن من إضافة منطق اللعبة، أي فعل شيء مع اللاعب، الخلفية، أو أي شيء آخر في اللعبة، نحتاج إلى سكريبت. السكريبتات هي كود، ويمكن كتابتها بلغتين، GDScript أو C#، GDScript هي الافتراضية.
- اضغط على عقدة “CharacterBody2D” (لقد أطلقت عليها “Player”).
- اضغط على زر “Attach Script” (انظر أدناه)
- هنا ستظهر نافذة حيث يمكنك اختيار اللغة (اختر GDScript) ومسار (فقط اتركه باسمه الحالي، ولكن يمكنك إعطائه اسمًا)، ثم انقر فوق المتابعة. هنا ستظهر نافذة “Script”. لا يوجد الكثير هنا في البداية.
يمتد من CharacterBody2D
كل ما تقوله هذه الشفرة في الوقت الحالي هو أن الشفرة يجب أن تنتمي إلى عقدة من نوع “CharacterBody2D”، وهي لاعبنا.
سنقوم بإضافة وظيفة هنا سنستخدمها للتحكم في اللاعب:
يمتد إلى CharakterBody2D
الدالة _processing_الفيزيائي(المسافة الزمنية delta): لا شيء يتم إرجاعها
عملية الفيزياء؟
يُعدّ _physics_process_ دالةً يتم تحديثها في كل إطار زمني، أي حوالي 60 مرة في الثانية افتراضيًا. توجد دالة أخرى تسمى ببساطة _process_ تُحدَّث باستمرار. إذا كنت ترغب في أن يتحرك اللاعب بسرعة ثابتة ومتسقة، فاستخدم _physics_process_.
هنا سنضيف الكود الذي يحرك اللاعب.
الجزء الرابع - الإدخال الأساسي
في الجزء الثاني، أضفت أزرار الإدخال، الآن سنستخدمها. يوجد كائن مدمج يسمى Input يمكننا استخدامه للتحقق مما إذا كان اللاعب قد ضغط على ما قمنا بإعداده في “Input Map”.
حاول إدخال هذا الكود في كود _physics_process:
# إذا كان الزر "يمين" مضغوطًا، اضبط السرعة الأفقية على 100
if Input.is_action_pressed('right'):
# تحديث سرعة الحركة في الاتجاه x
velocity.x = 100
# تحريك الكائن مع التحقق من الاصطدامات بالأسطح المحيطة
move_and_slide()
ما هي move_and_slide()؟
move_and_slide() هي دالة مدمجة في Godot تُستخدم عندما نريد تحريك ما نطبّقها عليه فعليًا. بدونها، لن يتحرك اللاعب.
Warning
المسافات بين الأسطر مهمة جدًا، هذا مشابه لما هو الحال في بايثون.
ماذا يحدث عند بدء تشغيل البرنامج بالنقر على زر التشغيل في نافذة Godot، ثم النقر على “يمين”؟
إذا لم يحدث شيء الآن:
- هل تذكرت إعداد أي شيء في “Input Map”؟
- هل كتبت
rightوليسRight؟ أي، هل ما كتبته في الكود هو نفس الاسم في خريطة الإدخال؟
الكود بأكمله حتى الآن
extends CharacterBody2D
func _physics_process(delta: float) -> void:
if Input.is_action_pressed('right'):
velocity.x = 100
move_and_slide()
حاول الآن إضافة كود لـ `'left'`, `'up'`, `'down'`.
ماذا يجب أن تكون `velocity.x` بالنسبة لـ `left`؟ وماذا عن `up` و `down`؟
الكود بأكمله الآن
extends CharacterBody2D
func _physics_process(delta: float) -> void:
if Input.is_action_pressed('right'):
velocity.x = 100
if Input.is_action_pressed('left'):
velocity.x = -100
if Input.is_action_pressed('down'):
velocity.y = 100
if Input.is_action_pressed('up'):
velocity.y = -100
move_and_slide()
الجزء الخامس – إصلاح الكود
ربما تلاحظون أن اللاعب لا يتوقف عند ترك اتجاه معين. يمكننا حل هذه المشكلة الآن!
قبل جميع عبارات if، أضفوا سطراً يحدد السرعة (velocity) إلى الصفر. يمكنكم فعل ذلك بكتابة velocity = Vector2().
جميع السرعات والاتجاهات في غوتو هي متجهات؛ هذا مفهوم رياضي لن ندخل فيه حالياً، ولكن إذا أردتم معرفة المزيد عن معنى هذا المصطلح، يمكنك زيارة الرابط التالي: Vectors على ويكيبيديا.
الكود الكامل الآن
extends CharacterBody2D
func _physics_process(delta: float) -> void:
velocity = Vector2()
if Input.is_action_pressed('right'):
velocity.x = 100
if Input.is_action_pressed('left'):
velocity.x = -100
if Input.is_action_pressed('down'):
velocity.y = 100
if Input.is_action_pressed('up'):
velocity.y = -100
move_and_slide()
عندما تبدأ اللعبة الآن يمكنك تحريك اللاعب:
بعد ذلك، يمكنك تعديل الكود لجعل السرعة ليست مجرد رقم، ولكن يمكن تخزينها في مكان آخر.
يمكنك على سبيل المثال (قبل الدالة) إضافة ثابت يحتفظ بمعلومات السرعة.
الكود الكامل في النهاية باستخدام const
extends CharacterBody2D
const SPEED = 100
func _physics_process(delta: float) -> void:
velovity = Vector2()
if Input.is_action_pressed('right'):
velocity.x = SPEED
if Input.is_action_pressed('left'):
velocity.x = -SPEED
if Input.is_action_pressed('down'):
velocity.y = SPEED
if Input.is_action_pressed('up'):
velocity.y = -SPEED
move_and_slide()
الجزء 6 - العب بحرية!
إذا عدتم إلى الجزء الأول، موارد مفيدة، يمكنكم العثور على ما يمكنكم مواصلة اللعب به.
بعد ذلك، يمكنكم محاولة إنشاء لعبتكم الخاصة. ما تصنعونه متروك لكم! إذا أردتم إنشاء شيء جديد تمامًا، افعلوا ذلك! إذا أردتم محاولة تقليد لعبة موجودة بالفعل، افعلوا ذلك! أفضل طريقة للتعلم هي المحاولة!




