توسعه بازی با گودوت 🤖

Skip to content

این یک متن ترجمه شده ماشینی است که ممکن است حاوی خطا باشد!

Hvor kommer denne informasjonen fra?

بخش زیادی از این مطالب صرفاً بازگویی مستندات رسمی Godot است. در زیر، پیوندهای مفیدی به مستندات رسمی (که ترجیحاً آن را به این مورد در Piggy توصیه می‌کنم، اما اگر این را ترجیح می‌دهید، می‌توانید از این استفاده کنید!) وجود دارد.

منابع مفید:

آیا در مورد گرافیک چطور؟ آیا باید آن را خودم بسازم؟

نه! شما می‌توانید دارایی‌های رایگان زیادی در اینجا پیدا کنید:

پیوندهای مفید دیگر:

موتورهای بازی دیگر؟

اگر ترجیح می‌دهید، می‌توانید از موتورهای بازی دیگری استفاده کنید. مثال‌هایی از موتورهای بازی دیگر عبارتند از:

موتورهای دیگری هم وجود دارند، اگر می‌خواهید چیز دیگری را امتحان کنید، حتماً جستجو کنید!

گودوت چیست؟

گودوت (تلفظ: گو-دوه)، یک ‘موتور بازی’ است. به زبان ساده، این یک برنامه است که به شما امکان می‌دهد بازی‌ها (یا برنامه‌های معمولی در صورت تمایل) بسازید. گودوت می‌تواند تقریباً هر کاری را که سایر موتورهای بازی می‌توانند انجام دهند، هم در 2D و هم در 3D انجام دهد.

نمونه‌هایی از بازی‌هایی که با گودوت ساخته شده‌اند: Godot Showcase

فقط بازی‌های مستقل در گودوت ساخته نشده‌اند، Sonic Colors Ultimate با گودوت ساخته شده است! 🦔🦔🦔

چگونه Godot را دریافت کنیم؟

می‌توانید Godot را از:

فقط دانلود و نصب کنید (یا از طریق Steam اجرا کنید).

راه‌اندازی یک پروژه!

وقتی Godot را شروع می‌کنید، این پنجره را مشاهده می‌کنید:

Godot Prosjekt

در اینجا از شما در مورد زبان برنامه‌نویسی، 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 تغییر کند.

در سمت چپ پنجره، رابط کاربری زیر را مشاهده خواهید کرد:

Create Scene

دکمه “Other Node” را فشار دهید و “CharacterBody2D” را جستجو کنید، آن را انتخاب کرده و “Create” را فشار دهید. این یک گره است که برای یک بازیکن 2D استفاده می‌شود. ممکن است متوجه شوید که یک مثلث هشدار ⚠️ در کنار گره “CharacterBody2D” وجود دارد. این به این دلیل است که برخی چیزها را که می‌خواهد ندارد.

اگر روی گره راست‌کلیک کنید، یک دکمه “+ Add Child Node…” وجود دارد. از این دکمه استفاده کنید و دو گره Sprite2D و CollisionShape2D را اضافه کنید. Sprite2D برای افزودن گرافیک به بازیکن استفاده می‌شود، در حالی که دیگری برای بررسی برخوردها استفاده می‌شود. همچنین می‌توانید در صورت تمایل برای سهولت در پیگیری، به آنها نام دهید. من به CharacterBody2D خود نام “Player” را داده‌ام. صحنه شما اکنون باید به این شکل باشد:

Scene currently

Del 1b - رفع ⚠️ در CollisionShape2D

مثلث هشدار در این مورد این است که CollisionShape2D فاقد برخورد واقعی است. می‌توانید این را با فشار دادن روی گره (در سمت چپ) برطرف کنید، سپس یک پنل در سمت راست ظاهر می‌شود. در اینجا اطلاعات زیادی در مورد گره‌ای که می‌توانید تغییر دهید وجود دارد. حتماً با آنچه در آنجا وجود دارد بازی کنید. اما ما می‌خواهیم روی “Shape” تمرکز کنیم، آن را روی RectangleShape2D تنظیم کنید. خیلی مهم نیست، ما از برخوردها در اینجا استفاده نمی‌کنیم.

Del 1c - افزودن یک Sprite، گرافیک

اگر روی Sprite2D در سمت چپ کلیک کنید، فیلدی در سمت راست ظاهر می‌شود که در آن “Texture” نوشته شده است. در اینجا می‌توانید یک تصویر برای بازیکن قرار دهید. فقط کافی است یک تصویر را بکشید و در فیلد رها کنید.

به این شکل بعد از افزودن یک sprite خواهد بود.

Sprite menu

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.

Plus button

  • 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” می‌توانید با کلیک روی دکمه + در سمت راست، دکمه‌ها را اضافه کنید.

Plus button

  • در اینجا فقط کافی است روی صفحه کلید کلیک کنید و سپس Add را بزنید.
  • دکمه‌ها را به همه actions اضافه کنید.

بخش 3 - افزودن یک اسکریپت برای کنترل بازیکن.

برای اینکه بتوانیم منطق بازی را اضافه کنیم، یعنی کاری با بازیکن، پس‌زمینه یا هر چیزی که در بازی وجود دارد انجام دهیم، به یک اسکریپت نیاز داریم. اسکریپت‌ها کد هستند و می‌توانند به دو زبان نوشته شوند، GDScript یا C#، GDScript به طور پیش‌فرض است.

  • روی گره “CharacterBody2D” (من آن را “Player” نامیده‌ام) کلیک کنید.
  • روی دکمه “Attach Script” (مشاهده در زیر) کلیک کنید.

Attach script button

  • در اینجا پنجره‌ای باز می‌شود که در آن می‌توانید زبان (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()

بخش ۶ - خودتان بازی کنید!

اگر به بخش اول، منابع مفید برگردید، می‌توانید ببینید با چه چیزهایی می‌توانید به بازی کردن ادامه دهید.

بعد از این می‌توانید سعی کنید بازی خودتان را بسازید. اینکه چه چیزی بسازید به خودتان بستگی دارد! اگر می‌خواهید چیزی کاملاً جدید بسازید، انجام دهید! اگر می‌خواهید سعی کنید یک بازی موجود را تقلید کنید، انجام دهید! بهترین راه برای یادگیری، امتحان کردن است!