این یک متن ترجمه شده ماشینی است که ممکن است حاوی خطا باشد!
این اطلاعات از کجا آمده است؟
بسیاری از این موارد صرفاً بازگویی مستندات رسمی Godot هستند. در زیر، برخی از لینکهای مفید به مستندات رسمی را مشاهده میکنید (که من ترجیح میدهم از آنها به جای این نسخه در Piggy استفاده کنید، اما اگر این نسخه را ترجیح میدهید، میتوانید از همین استفاده کنید!)
منابع مفید:
آیا در مورد گرافیک چطور؟ آیا باید آن را خودم بسازم؟
نه! شما میتوانید داراییهای رایگان زیادی در اینجا پیدا کنید:
لینکهای مفید دیگر:
موتورهای بازی دیگر؟
اگر ترجیح میدهید، میتوانید از موتورهای بازی دیگری استفاده کنید. مثالهایی از موتورهای بازی دیگر عبارتند از:
موتورهای دیگری هم وجود دارند، اگر میخواهید چیز دیگری را امتحان کنید، حتماً جستجو کنید!
گودوت چیست؟
گودوت (تلفظ: گو-دوه)، یک ‘موتور بازی’ است. به زبان ساده، این یک برنامه است که به شما امکان میدهد بازیها (یا برنامههای معمولی در صورت تمایل) بسازید. گودوت میتواند تقریباً هر کاری را که سایر موتورهای بازی میتوانند انجام دهند، هم در 2D و هم در 3D انجام دهد.
نمونههایی از بازیهایی که با گودوت ساخته شدهاند: Godot Showcase
فقط بازیهای مستقل در گودوت ساخته نشدهاند، Sonic Colors Ultimate با گودوت ساخته شده است! 🦔🦔🦔
چگونه 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 مینویسید.
صحنهها و گرهها
یکی از مهمترین مفاهیم در Godot، صحنهها و گرهها هستند. میتوانیم با گرهها شروع کنیم. یک گره یک شیء در Godot است و میتواند هر چیزی را نشان دهد. این میتواند چیزی باشد که یک بازیکن، یک دشمن، یک دکمه در یک منو، متن روی صفحه نمایش، هر چیزی را نشان دهد. صحنهها مجموعهای از گرهها هستند.
در اینجا میخواهیم یک مثال بسیار ساده ایجاد کنیم.
Del 1a - راهاندازی صحنه “player”
در بالای پنجره Godot، دکمه “2D” را فشار دهید تا نما به نمای 2D تغییر کند.
در سمت چپ پنجره، رابط کاربری زیر را مشاهده خواهید کرد:
دکمه “Other Node” را فشار دهید و “CharacterBody2D” را جستجو کنید، آن را انتخاب کرده و “Create” را فشار دهید. این یک گره است که برای یک بازیکن 2D استفاده میشود. ممکن است متوجه شوید که یک مثلث هشدار ⚠️ در کنار گره “CharacterBody2D” وجود دارد. این به این دلیل است که برخی چیزها را که میخواهد ندارد.
اگر روی گره راستکلیک کنید، یک دکمه “+ Add Child Node…” وجود دارد. از این دکمه استفاده کنید و دو گره Sprite2D و CollisionShape2D را اضافه کنید. Sprite2D برای افزودن گرافیک به بازیکن استفاده میشود، در حالی که دیگری برای بررسی برخوردها استفاده میشود. همچنین میتوانید در صورت تمایل برای سهولت در پیگیری، به آنها نام دهید. من به CharacterBody2D خود نام “Player” را دادهام. صحنه شما اکنون باید به این شکل باشد:
Del 1b - رفع ⚠️ در CollisionShape2D
مثلث هشدار در این مورد این است که CollisionShape2D فاقد برخورد واقعی است. میتوانید این را با فشار دادن روی گره (در سمت چپ) برطرف کنید، سپس یک پنل در سمت راست ظاهر میشود. در اینجا اطلاعات زیادی در مورد گرهای که میتوانید تغییر دهید وجود دارد. حتماً با آنچه در آنجا وجود دارد بازی کنید. اما ما میخواهیم روی “Shape” تمرکز کنیم، آن را روی RectangleShape2D تنظیم کنید. خیلی مهم نیست، ما از برخوردها در اینجا استفاده نمیکنیم.
Del 1c - افزودن یک 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
در حال حاضر، این کد فقط میگوید که کد باید به یک گره از نوع “CharacterBody2D” تعلق داشته باشد، که همان بازیکن ماست.
ما یک تابع را در اینجا اضافه خواهیم کرد که برای دستکاری بازیکن از آن استفاده خواهیم کرد:
extends CharacterBody2D
# این تابع در هر فریم فیزیکی فراخوانی میشود.
func _physics_process(delta: float) -> void:
return
Physics Process?
_physics_process تابعی است که هر “فریم” بهروزرسانی میشود، یعنی حدود 60 بار در ثانیه (پیشفرض). یک تابع دیگر به نام _process نیز وجود دارد که بهطور مداوم بهروزرسانی میشود. اگر میخواهید بازیکن با سرعت ثابتی حرکت کند، از _physics_process استفاده کنید.
اینجاست که باید کدی را اضافه کنیم که بازیکن را حرکت میدهد.
بخش ۴ - ورودی پایه
در بخش ۲، شما دکمههای ورودی را اضافه کردید، اکنون قرار است از آنها استفاده کنیم. یک شیء داخلی به نام Input وجود دارد که میتوانیم از آن برای بررسی اینکه آیا بازیکن آنچه را که در “Input Map” تنظیم کردهایم، فشار داده است یا خیر، استفاده کنیم.
سعی کنید این کد را در کد _physics_process قرار دهید:
if Input.is_action_pressed('right'):
velocity.x = 100
# Hvis høyre pil-tast trykkes, sett hastigheten i x-retning til 100
# اگر کلید جهتنمای راست فشار داده شود، سرعت را در جهت x برابر با 100 قرار دهید
move_and_slide()
move_and_slide() چیست؟
move_and_slide() یک تابع داخلی در Godot است که زمانی استفاده میشود که میخواهیم آنچه را که از آن استفاده میکنیم، واقعاً حرکت دهیم. بدون این تابع، بازیکن حرکت نخواهد کرد.
Warning
فضای بین خطوط بسیار مهم است، این موضوع مشابه پایتون است.
وقتی برنامه را با فشردن دکمهی پخش در پنجرهی Godot شروع میکنید و سپس “راست” را فشار میدهید، چه اتفاقی میافتد؟
اگر الان هیچ اتفاقی نیفتاد:
- آیا چیزی را در “Input Map” تنظیم کردهاید؟
- آیا
rightرا نوشتهاید و نهRight؟ یعنی، آیا آنچه را که در کد نوشتید با نام موجود در input map یکسان است؟
تمام کد تا اینجا
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-ها، یک خط اضافه کنید که velocity را روی 0 تنظیم کند. میتوانید این کار را با نوشتن velocity = Vector2() انجام دهید.
تمام سرعتها و جهتها در Godot بردار هستند، این یک مفهوم ریاضی است که الان وارد آن نمیشویم، اما اگر کنجکاو هستید که این به چه معناست، میتوانید به اینجا مراجعه کنید: Wikipedia 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()
بخش ۶ - خودتان بازی کنید!
اگر به بخش اول، منابع مفید برگردید، میتوانید ببینید با چه چیزهایی میتوانید به بازی کردن ادامه دهید.
بعد از این میتوانید سعی کنید بازی خودتان را بسازید. اینکه چه چیزی بسازید به خودتان بستگی دارد! اگر میخواهید چیزی کاملاً جدید بسازید، انجام دهید! اگر میخواهید سعی کنید یک بازی موجود را تقلید کنید، انجام دهید! بهترین راه برای یادگیری، امتحان کردن است!




