جزوه آموزشی گودوت – جلسه اول (۷ پروژه گام‌به‌گام)


🎮 جزوه آموزشی گودوت – جلسه اول

🔰 شروع کار با گودوت

به اولین جلسه آموزشی گودوت خوش آمدید! در این جزوه، ما با هم یک بازی ساده اما کامل را از صفر می‌سازیم. تمام کدهایی که در تصاویر ارسالی مشاهده کردید، در قالب ۷ پروژه مرحله‌به‌مرحله به شما آموزش داده می‌شود. هر پروژه یک قدم کوچک است که روی پروژه قبلی بنا می‌شود. در پایان، شما یک کاراکتر خواهید داشت که می‌تواند راه برود، بپرد، شتاب بگیرد و با محیط برخورد کند.

📌 پیش‌نیازها: گودوت نسخه ۴.۳ یا بالاتر نصب باشد. آشنایی اولیه با محیط گودوت مفید است، اما همه چیز را از پایه توضیح می‌دهیم.

پروژه ۱ ایجاد پروژه، صحنه و کاراکتر ساده

در اولین پروژه، یک پروژه جدید در گودوت ایجاد می‌کنیم، یک صحنه می‌سازیم و یک کاراکتر ساده (به شکل یک مربع رنگی) به آن اضافه می‌کنیم. این کاراکتر هنوز حرکت نمی‌کند، فقط در صحنه نمایش داده می‌شود.

مراحل گام‌به‌گام:

🔧 مرحله ۱: ایجاد پروژه جدید

  • گودوت را باز کنید. در پنجره Project Manager، روی New Project کلیک کنید.
  • نام پروژه را MyFirstGame بگذارید و یک پوشه خالی برای آن انتخاب کنید.
  • روی Create & Edit کلیک کنید تا وارد محیط ویرایشگر شوید.

🖼️ مرحله ۲: ساخت صحنه اصلی

  • در پنل Scene (سمت چپ)، روی دکمه + (Add New Node) کلیک کنید.
  • در پنجره جستجو، عبارت CharacterBody2D را تایپ کرده و آن را انتخاب کنید. این گره پایه کاراکتر ما خواهد بود.
  • روی Create کلیک کنید. نام گره را به Player تغییر دهید (با دوبار کلیک روی نام).

🎨 مرحله ۳: اضافه کردن ظاهر (Sprite2D)

  • روی گره Player کلیک راست کرده و Add Child Node را انتخاب کنید.
  • در جستجو، Sprite2D را پیدا کرده و ایجاد کنید.
  • در پنل Inspector (سمت راست)، در بخش Texture، روی Load کلیک کنید و یک تصویر ساده (مثلاً یک مربع رنگی ۳۲×۳۲) انتخاب کنید. اگر تصویری ندارید، می‌توانید از New Image استفاده کنید و یک مربع آبی بسازید.

📦 مرحله ۴: اضافه کردن برخورد (CollisionShape2D)

  • دوباره روی Player راست کلیک کرده و Add Child NodeCollisionShape2D را انتخاب کنید.
  • در Inspector، در بخش Shape، روی [empty] کلیک کرده و New RectangleShape2D را انتخاب کنید.
  • ابعاد مستطیل را حدوداً ۴۰×۴۰ پیکسل تنظیم کنید (با کلیک روی گزینه Size در بخش Shape).

💾 مرحله ۵: ذخیره و تست

  • صحنه را با Ctrl+S ذخیره کنید و نام آن را player.tscn بگذارید.
  • روی فایل player.tscn در FileSystem راست کلیک کرده و Set as Main Scene را انتخاب کنید.
  • کلید F5 را بزنید تا بازی اجرا شود. یک پنجره سفید با کاراکتر آبی رنگ در وسط آن خواهید دید.
✅ نتیجه پروژه ۱: یک کاراکتر ساده در وسط صحنه نمایش داده می‌شود. هنوز حرکتی ندارد، اما پایه اولیه ساخته شد.

پروژه ۲ حرکت کاراکتر به چپ و راست

در این پروژه، به کاراکتر خود حرکت افقی (چپ و راست) با استفاده از کلیدهای A و D (یا کلیدهای جهت‌ها) می‌دهیم.

مراحل گام‌به‌گام:

📝 مرحله ۱: اتصال اسکریپت به کاراکتر

  • روی گره Player کلیک راست کرده و Attach Script را انتخاب کنید.
  • نام فایل را player.gd بگذارید و روی Create کلیک کنید. ویرایشگر کد باز می‌شود.

✍️ مرحله ۲: نوشتن کد حرکت افقی

کد زیر را در فایل player.gd بنویسید. هر خط را با دقت بخوانید و توضیحات را دنبال کنید.

📄 کد حرکت چپ و راست – player.gd (پروژه ۲)
extends CharacterBody2D

# سرعت حرکت افقی (پیکسل بر ثانیه)
@export var speed = 300

func _physics_process(delta):
    # مقدار اولیه سرعت افقی (صفر)
    var horizontal_input = 0
    
    # تشخیص کلیدهای چپ و راست
    if Input.is_action_pressed("ui_left"):
        horizontal_input = -1
    elif Input.is_action_pressed("ui_right"):
        horizontal_input = 1
    
    # اعمال سرعت به محور X
    velocity.x = horizontal_input * speed
    velocity.y = 0   # فعلاً عمودی حرکت نمی‌کنیم
    
    # حرکت دادن کاراکتر و مدیریت برخورد
    move_and_slide()

🧠 تحلیل خط به خط کد:

  • extends CharacterBody2D – به گودوت می‌گوید این اسکریپت به گره CharacterBody2D متصل است و تمام قابلیت‌های آن را به ارث می‌برد.
  • @export var speed = 300 – یک متغیر به نام سرعت (سرعت حرکت) با مقدار ۳۰۰ تعریف می‌کند. @export باعث می‌شود این مقدار در پنل Inspector قابل تغییر باشد.
  • func _physics_process(delta): – تابعی که ۶۰ بار در ثانیه اجرا می‌شود و برای حرکت فیزیکی مناسب است.
  • var horizontal_input = 0 – یک متغیر محلی برای ذخیره جهت حرکت افقی (۱ برای راست، ۱- برای چپ، ۰ برای بدون حرکت).
  • if Input.is_action_pressed(“ui_left”): – اگر کلید چپ فشرده شده باشد، horizontal_input = -1 (چپ).
  • elif Input.is_action_pressed(“ui_right”): – اگر کلید راست فشرده شده باشد، horizontal_input = 1 (راست).
  • velocity.x = horizontal_input * speed – سرعت افقی (velocity.x) برابر حاصلضرب جهت در سرعت می‌شود.
  • velocity.y = 0 – سرعت عمودی را صفر می‌کنیم تا کاراکتر روی زمین بماند.
  • move_and_slide() – تابع جادویی که کاراکتر را بر اساس velocity جابجا می‌کند و برخوردها را مدیریت می‌کند.

▶️ مرحله ۳: تست حرکت

  • کد را ذخیره کنید (Ctrl+S).
  • بازی را با F5 اجرا کنید. حالا با فشار دادن کلیدهای چپ و راست (جهت‌ها) کاراکتر حرکت می‌کند.
✅ نتیجه پروژه ۲: کاراکتر با کلیدهای چپ/راست حرکت می‌کند. اما هنوز نمی‌تواند بپرد یا سقوط کند.

پروژه ۳ پرش با فشردن دکمه (Space)

در این پروژه، قابلیت پرش را به کاراکتر اضافه می‌کنیم. با فشردن کلید Space (یا کلید بالا)، کاراکتر به سمت بالا می‌پرد.

مراحل گام‌به‌گام:

✍️ مرحله ۱: اضافه کردن کد پرش به اسکریپت

کد زیر را به اسکریپت player.gd اضافه کنید (می‌توانید کد قبلی را کامل بازنویسی کنید).

📄 کد حرکت + پرش – player.gd (پروژه ۳)
extends CharacterBody2D

@export var speed = 300
@export var jump_strength = -500   # قدرت پرش (عدد منفی = بالا)

func _physics_process(delta):
    # حرکت افقی
    var horizontal_input = 0
    if Input.is_action_pressed("ui_left"):
        horizontal_input = -1
    elif Input.is_action_pressed("ui_right"):
        horizontal_input = 1
    velocity.x = horizontal_input * speed
    
    # پرش
    if Input.is_action_just_pressed("ui_accept") and is_on_floor():
        velocity.y = jump_strength
    
    # اعمال گرانش (کم کم به سمت پایین کشیده شود)
    velocity.y += 20  # شتاب گرانش ساده
    
    move_and_slide()

🧠 تحلیل خط‌های جدید:

  • @export var jump_strength = -500 – متغیر قدرت پرش. عدد منفی یعنی به سمت بالا (چون در گودوت Y+ پایین است).
  • if Input.is_action_just_pressed(“ui_accept”) and is_on_floor(): – اگر کلید پرش (پیش‌فرض Space یا بالا) فقط یک بار فشرده شود و کاراکتر روی زمین باشد (is_on_floor())، آنگاه…
  • velocity.y = jump_strength – سرعت عمودی را برابر قدرت پرش قرار می‌دهد (کاراکتر به بالا می‌پرد).
  • velocity.y += 20 – هر فریم، مقدار کمی به سرعت عمودی اضافه می‌شود (شتاب گرانش). این باعث می‌شود کاراکتر پس از پرش دوباره به پایین بیاید.

▶️ مرحله ۲: تست پرش

  • کد را ذخیره کنید و بازی را اجرا کنید.
  • با کلید Space (یا فلش بالا) کاراکتر می‌پرد و دوباره به زمین برمی‌گردد.
⚠️ توجه: در این مرحله، کاراکتر پس از پرش از صفحه خارج می‌شود! برای حل این مشکل، در پروژه بعدی یک زمین (Floor) به صحنه اضافه می‌کنیم.

پروژه ۴ اضافه کردن زمین (سکوی جامد)

برای اینکه کاراکتر روی یک سطح بایستد و از صفحه سقوط نکند، یک زمین (Floor) به صحنه اضافه می‌کنیم.

مراحل گام‌به‌گام:

🖼️ مرحله ۱: ایجاد گره زمین

  • در پنل Scene، روی گره ریشه (Player) کلیک راست کرده و Add Child NodeStaticBody2D را انتخاب کنید. نام آن را Floor بگذارید.
  • زیر Floor، یک گره CollisionShape2D اضافه کنید.
  • در Inspector، برای Shape یک RectangleShape2D جدید بسازید و اندازه آن را ۱۰۰۰×۳۰ پیکسل تنظیم کنید (یک نوار افقی در پایین صفحه).
  • گره Floor را در پایین صفحه قرار دهید (با تغییر Position Y به حدود ۵۰۰).

🎨 مرحله ۲: اضافه کردن ظاهر برای زمین (اختیاری)

  • زیر Floor یک گره Sprite2D اضافه کنید و یک بافت ساده (مثلاً یک مستطیل سبز) به آن بدهید تا زمین قابل مشاهده باشد.

▶️ مرحله ۳: تست

  • بازی را اجرا کنید. کاراکتر روی زمین می‌ایستد و پس از پرش، دوباره به زمین برمی‌گردد.
✅ نتیجه پروژه ۴: کاراکتر روی زمین می‌ایستد، حرکت می‌کند و می‌پرد. اما هنوز شتاب گرانش خیلی ساده است.

پروژه ۵ بهبود شتاب گرانش و پرش طبیعی

در این پروژه، شتاب گرانش را با استفاده از متغیر gravity حرفه‌ای‌تر می‌کنیم تا پرش طبیعی‌تر شود.

مراحل گام‌به‌گام:

✍️ مرحله ۱: به‌روزرسانی کد با گرانش

کد زیر را جایگزین اسکریپت قبلی کنید.

📄 کد با گرانش حرفه‌ای – پروژه ۵
extends CharacterBody2D

@export var speed = 300
@export var jump_strength = -500
@export var gravity = 40   # شتاب گرانش (پیکسل بر ثانیه مربع)

func _physics_process(delta):
    # اعمال گرانش
    velocity.y += gravity
    
    # حرکت افقی
    var horizontal_input = 0
    if Input.is_action_pressed("ui_left"):
        horizontal_input = -1
    elif Input.is_action_pressed("ui_right"):
        horizontal_input = 1
    velocity.x = horizontal_input * speed
    
    # پرش
    if Input.is_action_just_pressed("ui_accept") and is_on_floor():
        velocity.y = jump_strength
    
    move_and_slide()

🧠 توضیح تغییرات:

  • @export var gravity = 40 – متغیر جدید برای شتاب گرانش. هر فریم این مقدار به سرعت عمودی اضافه می‌شود.
  • velocity.y += gravity – به جای عدد ثابت ۲۰، از متغیر gravity استفاده می‌کنیم که قابل تنظیم است.
  • حذف velocity.y = 0 – دیگر سرعت عمودی را صفر نمی‌کنیم، چون گرانش آن را مدیریت می‌کند.

▶️ تست و تنظیم

  • بازی را اجرا کنید. پرش طبیعی‌تر شده است.
  • در Inspector می‌توانید مقدار gravity و jump_strength را تغییر دهید تا پرش سنگین‌تر یا سبک‌تر شود.

پروژه ۶ محدود کردن پرش (فقط روی زمین)

در این پروژه، با استفاده از is_on_floor() مطمئن می‌شویم که کاراکتر فقط زمانی که روی زمین است بتواند بپرد (پرش دوباره در هوا ممنوع).

✍️ کد نهایی با محدودیت پرش

کد زیر کاملاً مشابه پروژه ۵ است، اما مطمئن می‌شویم که شرط is_on_floor() درست کار کند.

📄 کد نهایی با محدودیت پرش – پروژه ۶
extends CharacterBody2D

@export var speed = 300
@export var jump_strength = -500
@export var gravity = 40

func _physics_process(delta):
    # گرانش
    velocity.y += gravity
    
    # حرکت افقی
    var horizontal_input = 0
    if Input.is_action_pressed("ui_left"):
        horizontal_input = -1
    elif Input.is_action_pressed("ui_right"):
        horizontal_input = 1
    velocity.x = horizontal_input * speed
    
    # پرش فقط روی زمین
    if Input.is_action_just_pressed("ui_accept") and is_on_floor():
        velocity.y = jump_strength
    
    move_and_slide()

✅ نتیجه پروژه ۶: کاراکتر فقط زمانی که روی زمین است می‌تواند بپرد. پرش دوباره در هوا غیرفعال است.

پروژه ۷ پروژه نهایی – ترکیب همه چیز + تشخیص برخورد با سقف

در پروژه نهایی، همه چیز را ترکیب می‌کنیم و قابلیت تشخیص برخورد با سقف را نیز اضافه می‌کنیم (تا کاراکتر از سقف عبور نکند). همچنین کد را بهینه‌سازی می‌کنیم.

مراحل گام‌به‌گام:

✍️ کد نهایی کامل

این کد شامل تمام قابلیت‌های قبلی به اضافه تشخیص برخورد با سقف است.

📄 کد نهایی پروژه ۷ – player.gd (کامل)
extends CharacterBody2D

@export var speed = 300
@export var jump_strength = -500
@export var gravity = 40

func _physics_process(delta):
    # گرانش
    velocity.y += gravity
    
    # حرکت افقی
    var horizontal_input = 0
    if Input.is_action_pressed("ui_left"):
        horizontal_input = -1
    elif Input.is_action_pressed("ui_right"):
        horizontal_input = 1
    velocity.x = horizontal_input * speed
    
    # پرش (فقط روی زمین)
    if Input.is_action_just_pressed("ui_accept") and is_on_floor():
        velocity.y = jump_strength
    
    # حرکت و برخورد
    move_and_slide()
    
    # تشخیص برخورد با سقف (اختیاری)
    if is_on_ceiling():
        velocity.y = 0   # اگر به سقف خورد، سرعت عمودی را صفر کن

🧠 توضیح خط آخر (برخورد با سقف):

  • if is_on_ceiling(): – اگر کاراکتر به سقف برخورد کرده باشد…
  • velocity.y = 0 – سرعت عمودی را صفر می‌کنیم تا کاراکتر از سقف عبور نکند و به حالت سقوط برگردد.

▶️ تست نهایی

  • یک سقف (مثلاً یک StaticBody2D با CollisionShape2D در بالای صفحه) به صحنه اضافه کنید.
  • بازی را اجرا کنید. کاراکتر حرکت می‌کند، می‌پرد، به سقف برخورد می‌کند و دوباره پایین می‌آید.
✅ نتیجه پروژه ۷: یک کاراکتر کامل با حرکت افقی، پرش، گرانش، تشخیص زمین و سقف. تمام کدهای موجود در تصاویر شما در این پروژه‌ها پوشش داده شد.

📌 جمع‌بندی جلسه اول

در این جلسه، ۷ پروژه گام‌به‌گام را از صفر تا یک کاراکتر کامل انجام دادیم. یاد گرفتید که:

  • چطور یک پروژه جدید در گودوت ایجاد کنید و صحنه بسازید.
  • چطور گره‌های CharacterBody2D، Sprite2D و CollisionShape2D را ترکیب کنید.
  • چطور با اسکریپت نویسی حرکت افقی، پرش، گرانش و برخورد را پیاده‌سازی کنید.
  • مفهوم extends، func _physics_process، var و @export را درک کنید.
  • با توابع Input.is_action_pressed، is_on_floor() و move_and_slide() آشنا شوید.
📝 تمرین برای خانه:

  • مقدار speed، jump_strength و gravity را تغییر دهید و اثر آن را ببینید.
  • یک دشمن ساده (Area2D) به صحنه اضافه کنید که با برخورد، پیام Game Over چاپ کند.
  • یک سکه (Area2D) بسازید که با برخورد، ناپدید شود و پیام “+۱ سکه” چاپ کند.

🧩 نحوه نصب افزونه (پلاگین) در گودوت

برای افزودن قابلیت‌های پیشرفته مثل تبلیغات، خرید درون برنامه‌ای یا اتصال به سرویس‌های خارجی، نیاز به نصب افزونه (Plugin) دارید. دو روش اصلی وجود دارد:

روش اول: نصب از طریق AssetLib (کتابخانه داخلی)

📦 گام‌های نصب:

  1. در ویرایشگر گودوت، روی تب AssetLib (در پنل سمت راست یا بالای صفحه) کلیک کنید.
  2. در کادر جستجو، نام افزونه مورد نظر را بنویسید (مثلاً Admob یا Deeplink).
  3. روی افزونه مورد نظر کلیک کنید و دکمه Download را بزنید.
  4. در پنجره نصب، مسیر را روی ریشه پروژه (root directory) نگه دارید و تیک Ignore asset root را چک‌شده نگه دارید.
  5. روی Install کلیک کنید.
  6. افزونه را فعال کنید: از مسیر Project → Project Settings → Plugins، افزونه را پیدا کرده و تیک Enable را بزنید.

روش دوم: نصب دستی (از GitHub)

📁 گام‌های نصب دستی:

  1. فایل فشرده افزونه را از GitHub یا سایت مربوطه دانلود کنید.
  2. فایل را در ریشه پروژه (همان جایی که فایل project.godot قرار دارد) از حالت فشرده خارج کنید.
  3. پوشه addons/ در پروژه شما ایجاد می‌شود.
  4. افزونه را از مسیر Project → Project Settings → Plugins فعال کنید.
💡 نکته مهم: قبل از نصب نسخه جدید هر افزونه، نسخه قبلی آن را حذف کنید تا تداخل ایجاد نشود.

📚 منابع برای ادامه یادگیری

  • مستندات رسمی گودوت: docs.godotengine.org – بهترین منبع برای یادگیری عمیق.
  • کانال GDQuest: آموزش‌های ویدیویی عالی برای مبتدیان.
  • کانال KidsCanCode: آموزش‌های ساده و گام‌به‌گام.
  • انجمن فارسی گودوت: در تلگرام و دیسکورد – برای پرسش و پاسخ.

جزوه آموزشی گودوت – جلسه اول | طراحی شده برای وبسایت آموزشی | به‌روزرسانی شده در ۲۰۲۶


دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *