هذا نص مترجم آليًا وقد يحتوي على أخطاء!
من أين تأتي هذه المعلومات؟
الكثير من هذا مجرد إعادة سرد للوثائق الرسمية لـ Godot. فيما يلي بعض الروابط المفيدة للوثائق الرسمية (التي أوصي بها بشدة على Piggy، ولكن إذا كنت تفضل هذه، فلا بأس في استخدامها!)
موارد مفيدة:
ماذا عن الرسومات، هل يجب عليّ أن أصنعها بنفسي؟
لا! يمكنكم العثور على الكثير من الأصول المجانية هنا:
روابط مفيدة أخرى:
محركات ألعاب أخرى؟
إذا كنت تفضل، يمكنك استخدام محركات ألعاب أخرى. أمثلة على محركات ألعاب أخرى هي:
هناك العديد من الخيارات الأخرى أيضًا، ابحث إذا كنت ترغب في تجربة شيء آخر!
ما هو Godot؟
Godot (تنطق Guh-doh)، هو محرك ألعاب (Game Engine). ببساطة، هو برنامج يسمح لك بإنشاء ألعاب (أو برامج عادية إذا أردت). يمكن لـ Godot أن يفعل معظم ما يمكن لمحركات الألعاب الأخرى القيام به، سواء كان ذلك ثنائي الأبعاد أو ثلاثي الأبعاد.
أمثلة على الألعاب التي تم إنشاؤها في Godot: Godot Showcase
ليس فقط الألعاب المستقلة (Indie games) التي تم إنشاؤها في Godot، Sonic Colors Ultimate تم إنشاؤها باستخدام Godot!
كيف تحصل على Godot؟
يمكنك تنزيل Godot من:
- الصفحة الرسمية: Godot Official Page.
- أو على Steam: Godot Steam.
فقط قم بالتنزيل والتثبيت (أو قم بتشغيله على steam).
إعداد مشروع!
عند بدء Godot، يظهر لك هذا النافذة:
هنا يُسأل عن لغة البرمجة، GDScript أو C#. GDScript مشابه جدًا لـ Python.
الفرق بين GDScript و Python (بدون ألوان):
def hello():
text = "Hello world!"
print(text)
func hello():
var text = "Hello world!"
print(text)
لتغيير المتغيرات في Python، تحتاج فقط إلى كتابة اسم المتغير. في GDScript، يجب عليك كتابة var
أولاً. لإنشاء دوال، تكتب func
بدلاً من def
.
Scenes & Nodes
أحد أهم المفاهيم في Godot هو Scenes و Nodes. يمكننا أن نبدأ بـ Nodes. Node هو كائن في Godot، ويمكن أن يمثل أي شيء. يمكن أن يكون شيئًا يمثل لاعبًا، أو عدوًا، أو زرًا في قائمة، أو نصًا على الشاشة، أي شيء. Scenes هي مجموعة من Nodes.
هنا سنقوم بإنشاء مثال بسيط جدًا.
الجزء 1أ - إعداد مشهد “اللاعب”
في أعلى نافذة Godot، اضغط على زر “2D” لتغيير العرض إلى عرض 2D.
على الجانب الأيسر من النافذة، سترون الواجهة التالية:
اضغط على زر “Other Node” وابحث عن “CharacterBody2D”، حدده واضغط على “Create”. هذه هي عقدة تُستخدم لـ 2D لاعب. قد ترى أن هناك مثلث تحذير ⚠️ بجوار عقدة “CharacterBody2D”. هذا لأنها تفتقر إلى بعض الأشياء التي ترغب فيها.
إذا قمت بالنقر بزر الماوس الأيمن على العقدة، فهناك زر “+ Add Child Node…” استخدم هذا وأضف عقدتين، Sprite2D و CollisionShape2D. تُستخدم Sprite2D لإضافة رسومات إلى اللاعب، بينما تُستخدم الأخرى للتحقق من الاصطدامات. يمكنك أيضًا إعطاؤهم أسماءً إذا كان ذلك يجعل من السهل تتبع الأشياء. لقد أعطيت CharacterBody2D الخاص بي اسم “Player”. يجب أن يبدو المشهد الآن كما يلي:
الجزء 1ب - إصلاح ⚠️ على CollisionShape2D
رمز التحذير المثلث في هذه الحالة هو أن CollisionShape2D تفتقر إلى التصادم الفعلي. يمكنك إصلاح ذلك عن طريق الضغط على العقدة (على اليسار)، ثم ستظهر لوحة على الجانب الأيمن. هنا ستحصل على كومة من المعلومات حول العقدة التي يمكنك تغييرها. لا تتردد في اللعب بما هو موجود هناك. ولكن الذي سنركز عليه هو “Shape”، اضبط هذا على، على سبيل المثال، RectangleShape2D. ليس من المهم جدًا، لن نستخدم التصادمات هنا.
الجزء 1ج - إضافة Sprite، رسم
إذا ضغطت على 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”. لا يوجد الكثير هنا في البداية.
extends CharacterBody2D
# Dette er en karakterfigur i 2D
# This is a character figure in 2D
# هذا شكل شخصية ثنائية الأبعاد
التعليمات البرمجية الوحيدة التي تقولها هذه التعليمات البرمجية في الوقت الحالي هي أن التعليمات البرمجية يجب أن تنتمي إلى عقدة من النوع “CharacterBody2D”، وهي لاعِبنا.
سنضيف هنا دالة سنستخدمها لمعالجة اللاعب:
extends CharacterBody2D
func _physics_process(delta: float) -> void:
# Dette er en tom funksjon.
# هذه دالة فارغة.
Physics Process?
_physics_process
هي دالة يتم تحديثها في كل “إطار”، أي حوالي 60 مرة في الثانية (افتراضيًا). توجد دالة أخرى تسمى فقط _process
، والتي يتم تحديثها بالكامل. إذا كنت تريد أن يتحرك اللاعب بوتيرة ثابتة، فاستخدم _physics_process
.
هنا سنضيف الكود الذي يحرك اللاعب.
الجزء الرابع - الإدخال الأساسي
في الجزء الثاني، أضفت أزرار الإدخال، الآن سنستخدمها. يوجد كائن مدمج يسمى Input
يمكننا استخدامه للتحقق مما إذا كان اللاعب قد ضغط على ما قمنا بإعداده في “Input Map”.
حاول إدخال هذا الكود في كود _physics_process
:
if Input.is_action_pressed('right'):
# يمينا
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()
الجزء 5 - إصلاح الكود
قد تلاحظون أن اللاعب لا يتوقف عند تحرير الاتجاه. يمكننا إصلاح ذلك الآن!
قبل كل if
-s، أضف سطرًا لتعيين السرعة إلى 0. يمكنك القيام بذلك بكتابة velocity = Vector2()
كل السرعات والاتجاهات في Godot هي متجهات, هذا مفهوم رياضي لن نتعمق فيه الآن، ولكن إذا أردتم معرفة المزيد عما يعنيه هذا، يمكنكم الذهاب إلى هنا: Wikipedia vectors.
الكود كاملاً الآن
extends CharacterBody2D
func _physics_process(delta: float) -> void:
velovity = 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 - العب بحرية!
إذا عدتم إلى الجزء الأول، موارد مفيدة، يمكنكم العثور على ما يمكنكم مواصلة اللعب به.
بعد ذلك، يمكنكم محاولة إنشاء لعبتكم الخاصة. ما تصنعونه متروك لكم! إذا أردتم إنشاء شيء جديد تمامًا، افعلوا ذلك! إذا أردتم محاولة تقليد لعبة موجودة بالفعل، افعلوا ذلك! أفضل طريقة للتعلم هي المحاولة!