این یک متن ترجمه شده ماشینی است که ممکن است حاوی خطا باشد!
Hvor kommer denne informasjonen fra?
بخش زیادی از این مطالب صرفاً بازگویی مستندات رسمی 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 خواهد بود.
Del 2 - Legge til input, kontroller
På toppen av vinduet er det en meny, “Scene - Project - Debug - Editor - Help”. Trykk på “Project” og deretter “Project Settings”. Her får du opp en meny med masse instillinger. Trykk på “Input Map”. Her kan dere sett opp knapper på tastaturet.
- I “Add New Action” feltet, skriv “left” også trykk “Add”.
- Legg deretter til “right”, “up” og “down”.
- Disse blir kjent som “Actions”
- På hver “Action” kan dere legge inn knapper med å trykke på + knappen til høyre.
- Her er det bare å trykke på tastaturet, så trykke Add.
- Legg til knapper på alle actions.
بخش 2 - افزودن ورودی، کنترلها
در بالای پنجره، منویی با عنوان “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 kommentar som forklarer at dette skriptet kontrollerer spillerens bevegelse.
# این یک کامنت است که توضیح میدهد این اسکریپت حرکت بازیکن را کنترل میکند.
# Her definerer vi variabler for hastighet og retning.
# در اینجا متغیرهایی برای سرعت و جهت تعریف میکنیم.
# Funksjonen _physics_process kalles hver frame.
# تابع _physics_process هر فریم فراخوانی میشود.
در حال حاضر، این کد فقط میگوید که کد باید به یک گره از نوع “CharacterBody2D” تعلق داشته باشد، که همان بازیکن ماست.
ما یک تابع را در اینجا اضافه خواهیم کرد که برای دستکاری بازیکن از آن استفاده خواهیم کرد:
extends CharacterBody2D
# این تابع در هر فریم فیزیکی فراخوانی میشود.
func _physics_process(delta: float) -> void:
return
Physics Process?
_physics_process
تابعی است که هر “فریم” بهروزرسانی میشود، یعنی حدود 60 بار در ثانیه (پیشفرض). یک تابع دیگر به نام _process
نیز وجود دارد که بهطور مداوم بهروزرسانی میشود. اگر میخواهید بازیکن با سرعت ثابتی حرکت کند، از _physics_process
استفاده کنید.
اینجاست که باید کدی را اضافه کنیم که بازیکن را حرکت میدهد.
Del 4 - Basic input
I del 2 la du til input-knapper, nå skal vi bruke dem. Det finnes et innebygd objekt som heter Input
som vi kan bruke til å sjekke om spilleren har trykket på det som vi har satt opp i “Input Map”.
Prøv å legg denne koden inn i _physics_process
koden:
بخش 4 - ورودی پایه
در بخش 2 دکمههای ورودی را اضافه کردید، اکنون میخواهیم از آنها استفاده کنیم. یک شیء داخلی به نام 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()
Hva er move_and_slide()
?
move_and_slide()
یک تابع داخلی در Godot است که زمانی استفاده میشود که بخواهیم چیزی را که روی آن اعمال میکنیم، واقعاً حرکت دهیم. بدون این تابع، بازیکن حرکت نخواهد کرد.
Warning
فضای بین خطوط بسیار مهم است، این موضوع مشابه پایتون است.
وقتی برنامه را با فشردن دکمهی پخش در پنجرهی Godot شروع میکنید و سپس “راست” را فشار میدهید، چه اتفاقی میافتد؟
اگر الان هیچ اتفاقی نیفتاد:
- آیا چیزی را در “Input Map” تنظیم کردهاید؟
- آیا
right
را نوشتهاید و نهRight
؟ یعنی، آیا آنچه را که در کد نوشتید با نام موجود در input map یکسان است؟
Hele koden så langt
extends CharacterBody2D
func _physics_process(delta: float) -> void:
if Input.is_action_pressed('right'):
velocity.x = 100
move_and_slide()
این تمام کدی است که تا به حال نوشتهایم.
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'
چطور؟
Hele koden nå
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()
این کل کد است.
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.
Hele koden nå
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()
این کل کد است:
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()
هنگامی که اکنون بازی را شروع میکنید، میتوانید بازیکن را حرکت دهید:
علاوه بر این، میتوانید کد را طوری اصلاح کنید که سرعت فقط یک عدد نباشد، بلکه در جای دیگری نیز ذخیره شود.
به عنوان مثال، میتوانید (قبل از تابع) یک ثابت اضافه کنید که سرعت را پیگیری کند.
Hele koden til slutt med 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()
کل کد در انتها با 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()
بخش ۶ - خودتان بازی کنید!
اگر به بخش اول، منابع مفید برگردید، میتوانید ببینید با چه چیزهایی میتوانید به بازی کردن ادامه دهید.
بعد از این میتوانید سعی کنید بازی خودتان را بسازید. اینکه چه چیزی بسازید به خودتان بستگی دارد! اگر میخواهید چیزی کاملاً جدید بسازید، انجام دهید! اگر میخواهید سعی کنید یک بازی موجود را تقلید کنید، انجام دهید! بهترین راه برای یادگیری، امتحان کردن است!