چرا گودوت (Godot)؟ موتورِ بازیسازیِ مردمپسند!

چرا گودوت (Godot)؟ موتورِ بازیسازیِ مردمپسند!
قبل از شروع، باید بدانید چرا گودوت در سال ۲۰۲۶ اینقدر محبوب است:
1. **کاملاً رایگان (متنباز):** هیچ درصدی از فروش بازی شما را نمیگیرد.
2. **سبک و سریع:** کل نرمافزار حدود ۱۰۰ مگابایت است! (در حالی که رقبایش چندین گیگابایت هستند).
3. **دوکاره:** هم برای بازیهای ۲ بعدی (2D) بینظیر است و هم برای بازیهای ۳ بعدی (3D) کاملاً قدرتمند.
4. **زبانِ دوستانه:** از زبانی به نام **GDScript** استفاده میکند که بسیار شبیه به **پایتون** است؛ یعنی یادگیری آن برای مبتدیها بسیار ساده است.
---
نقشه راه: چطور اولین بازی موبایل خود را بسازیم؟
برای شروع بازیسازی در گودوت، این ۴ مرحلهی کلیدی را دنبال کنید:
گام اول: نصب و آشنایی با محیط (The Interface)
ابتدا گودوت را از سایت رسمیاش دانلود کنید. محیط آن از سه بخش اصلی تشکیل شده است:
* **Scene (صحنه):** همه چیز در گودوت یک «صحنه» است؛ کاراکتر، دشمن، یا حتی یک دکمه ساده.
* **Node (گره):** اجزای سازنده صحنه هستند (مثل یک عکس، یک صدای انفجار، یا یک محیط فیزیکی).
* **Inspector:** جایی که ویژگیهای هر گره را تغییر میدهید (مثلاً تغییر رنگ، اندازه یا سرعت حرکت).
#### گام دوم: یادگیری منطق بازی (GDScript)
شما نباید از کدنویسی بترسید. در گودوت، کدها به اشیاء جان میدهند. مثلاً برای حرکت دادن یک کاراکتر، فقط چند خط ساده مینویسید:
```gdscript
# اگر کلید راست زده شد، کاراکتر به راست حرکت کند
if Input.is_action_pressed("ui_right"):
position.x += speed * delta
```
این کد برای یک مبتدی کاملاً قابل درک است!
گام سوم: طراحی برای موبایل (Touch & Screen)
بازیهای موبایل با بازیهای کامپیوتری فرق دارند. در گودوت باید:
* **رزولوشن صفحه:** تنظیمات بازی را روی حالت "Stretch" بگذارید تا بازی شما روی همه گوشیها (آیفون یا اندروید) به درستی نمایش داده شود.
* **ورودی لمسی:** به جای کیبورد، از "Input Events" گودوت برای شناسایی ضربه انگشت روی صفحه استفاده کنید.
گام چهارم: خروجی گرفتن (Export)
وقتی بازی آماده شد، با استفاده از بخش "Export"، گودوت فایل شما را به فرمت `APK` برای اندروید یا `IPA` برای iOS تبدیل میکند.
---
۳ نکته طلایی برای حرفهای شدن در گودوت
1. **از کوچک شروع کنید:** اولین بازی خود را با ساخت یک بازی مثل "Flappy Bird" یا "پریدن از روی موانع" شروع کنید. سراغ ساخت بازیهای بزرگ نروید تا ناامید نشوید.
2. **از کتابخانههای آماده استفاده کنید:** در سایت [Godot Asset Library](https://godotengine.org/asset-library/)، هزاران کاراکتر، صدا و کدهای آماده وجود دارد که میتوانید رایگان دانلود و در بازیتان استفاده کنید.
3. **بهترین راه یادگیری (Learn by doing):** به جای دیدن ۱۰ ساعت تئوری، یک پروژه ۳۰ دقیقهای در یوتیوب پیدا کنید و همزمان با آن بسازید.
یک حقیقت جالب (Fun Fact):
آیا میدانستید بسیاری از بازیهای پرطرفدار گوشی که در مترو یا اتوبوس بازی میکنید، با همین موتور ساخته شدهاند؟ گودوت به دلیل حجم کم، به بازی شما اجازه میدهد خیلی سریع روی گوشی اجرا شود و باتری گوشی کاربر را هم زود خالی نمیکند!
حتما! بخش دوم آموزش گودوت را آماده کردهام که روی ساخت بازی تمرکز بیشتری دارد و نکات کاربردیتری را پوشش میدهد:
---
راهنمای گامبهگام ساخت بازی در گودوت (بخش دوم)
در بخش اول با کلیات گودوت آشنا شدیم. حالا وقت آن است که دستانمان را آلوده کنیم و اولین بازی واقعی خود را بسازیم! فرض کنیم میخواهیم یک بازی ساده سهبعدی (3D) بسازیم که در آن یک مکعب باید روی سکوها بپرد.
گام پنجم: ساخت دنیای بازی (The 3D Scene)
1. **ایجاد صحنه جدید:** یک صحنه سهبعدی جدید بسازید (`3D Scene`).
2. **اضافه کردن زمین (Floor):** یک `MeshInstance3D` اضافه کنید و در Inspector، برای آن یک `BoxMesh` (مکعب) بسازید. سپس اندازه آن را بزرگ کنید تا مثل یک زمین شود.
3. **اضافه کردن کاراکتر (Player Cube):** یک `MeshInstance3D` دیگر اضافه کنید و آن را به عنوان «کاراکتر» نامگذاری کنید. یک `BoxMesh` کوچک برایش بسازید. برای اینکه کاراکتر بتواند حرکت کند و با دنیای فیزیکی تعامل داشته باشد، یک `CharacterBody3D` هم به عنوان والد (Parent) برای این مکعب قرار دهید.
4. **اضافه کردن سکوها (Platforms):** چند `MeshInstance3D` دیگر اضافه کنید و آنها را مثل سکو در اطراف زمین قرار دهید.
گام ششم: کدنویسی برای حرکت (GDScript for Movement)
حالا به کاراکتر مکعب خود، یک اسکریپت GDScript اضافه کنید. این اسکریپت منطق حرکت و پرش را کنترل میکند:
```gdscript
# فرض کنید نام والد CharacterBody3D است
extends CharacterBody3D
@export var speed = 5.0 # سرعت حرکت
@export var jump_velocity = 4.5 # قدرت پرش
# تابع physics_process در هر فریم physics اجرا میشود
func _physics_process(delta):
# گرفتن ورودی از کاربر (مثلاً کلیدهای جهتنما)
var input_dir = Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down")
# محاسبه جهت حرکت بر اساس دوربین (اگر دوربین داشته باشیم)
# ... (این قسمت پیچیدهتر است و برای شروع لازم نیست)
# اعمال گرانش
if not is_on_floor():
velocity.y -= gravity * delta # gravity باید تعریف شده باشد
# پرش
if Input.is_action_just_pressed("ui_up") and is_on_floor():
velocity.y = jump_velocity
# حرکت افقی
var direction = (transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()
if direction:
velocity.x = direction.x * speed
velocity.z = direction.z * speed
else:
velocity.x = move_toward(velocity.x, 0, speed)
velocity.z = move_toward(velocity.z, 0, speed)
move_and_slide() # این تابع خود حرکت را اعمال میکند
**نکته جالب:** در کد بالا، `@export` به شما اجازه میدهد تا متغیرهایی مثل `speed` و `jump_velocity` را مستقیماً از داخل محیط گودوت (Inspector) تنظیم کنید، بدون اینکه نیاز باشد کد را دوباره ویرایش کنید!
گام هفتم: افزودن دوربین (The Camera)
یک `Camera3D` به صحنه اضافه کنید. معمولاً این دوربین را زیرمجموعه کاراکتر قرار میدهند تا با او حرکت کند. برای اینکه دوربین پشت سر کاراکتر بماند، کمی آن را عقب ببرید و بچرخانید.
گام هشتم: اضافه کردن فیزیک و برخورد (Physics & Collisions)
* **برای زمین و سکوها:** هر کدام از اینها باید یک `StaticBody3D` و یک `CollisionShape3D` داشته باشند تا گودوت بفهمد اینها اجسام سختی هستند که کاراکتر نمیتواند از آنها عبور کند.
* **برای کاراکتر:** همانطور که گفته شد، `CharacterBody3D` و `CollisionShape3D` (معمولاً یک `BoxShape3D`) برای کاراکتر لازم است تا بتواند با زمین و سکوها برخورد کند.
گام نهم: مدیریت صحنهها و انتقال (Scene Management)
* **صحنه اصلی:** صحنهای که الان ساختهاید را به عنوان صحنه اصلی (`Main Scene`) ذخیره کنید.
* **انتقال بین مراحل:** اگر بازی شما مراحل مختلف دارد، میتوانید با کدنویسی، یک صحنه را بارگذاری و صحنه قبلی را حذف کنید.
نکته حرفهای: استفاده از "Signals" (سیگنالها)
یکی از زیباترین ویژگیهای گودوت، سیستم سیگنال آن است. فرض کنید کاراکتر شما به بالای سکو میرسد. سکو میتواند یک «سیگنال» (مثل یک پیام) بفرستد که «من توسط کاراکتر لمس شدم!». سپس کاراکتر شما این پیام را دریافت کرده و مثلاً امتیاز شما را افزایش میدهد یا باعث میشود سکو ناپدید شود. این کار باعث میشود کدها بسیار تمیز و سازمانیافته شوند.
راهنمای گامبهگام ساخت بازی در گودوت (بخش سوم: صدا، منو و جذابیت بصری)
تا اینجا توانستیم یک بازی سهبعدی ساده با قابلیت حرکت و پرش بسازیم. حالا وقت آن است که بازیمان را حرفهایتر و جذابتر کنیم.
گام دهم: اضافه کردن صدا و موسیقی (Sound & Music)
هیچ بازی بدون صدا کامل نمیشود! گودوت برای این کار دو نوع گره (Node) اصلی دارد:
1. **`AudioStreamPlayer`:** برای پخش صداهای کوتاه و تکی (مثل صدای پرش، برخورد، یا جمع کردن آیتم).
* **نحوه استفاده:** یک گره `AudioStreamPlayer` به صحنهتان اضافه کنید. در بخش Inspector، فایل صوتی مورد نظرتان (مثلاً `jump.wav`) را در قسمت `Stream` قرار دهید. سپس در کد GDScript، وقتی میخواهید صدا پخش شود، این خط را اضافه کنید:
```gdscript
$AudioStreamPlayer.play()
```
(اگر نام گره صدا `AudioStreamPlayer` باشد)
2. **`AudioStreamPlayer2D / 3D`:** برای صداهایی که جهتدار هستند (مثلاً صدای انفجار از سمت چپ صفحه میآید). این گرهها در فضای سهبعدی یا دوبعدی شما موقعیت دارند.
3. **`AudioStreamPlayer` (برای موسیقی پسزمینه):** یک گره دیگر از این نوع بسازید و فایل موسیقی پسزمینه (مثلاً `background_music.ogg`) را به آن بدهید. در تنظیمات گره، گزینه `Autoplay` را فعال کنید تا موسیقی به محض شروع بازی پخش شود. همچنین میتوانید گزینه `Loop` را بزنید تا موسیقی تکرار شود.
**نکته جالب:** فرمتهای صوتی `OGG` معمولاً برای موسیقی و `WAV` برای صداهای کوتاه (افکتها) در گودوت بهینه هستند.
گام یازدهم: ساخت منوی شروع بازی (Main Menu)
بازی بدون منوی شروع، مثل یک فروشگاه بدون ویترین است!
1. **ایجاد صحنه منو:** یک صحنه جدید بسازید (`Scene -> New Scene`). این بار از نوع `Node2D` استفاده کنید چون معمولاً منوها دوبعدی هستند.
2. **اضافه کردن دکمهها:** از گرههای `Button` برای دکمههای «شروع بازی»، «تنظیمات» و «خروج» استفاده کنید. با استفاده از گره `Label` میتوانید متن روی دکمهها را بنویسید.
3. **اتصال دکمهها (Signals):** مهمترین بخش! روی هر دکمه کلیک راست کنید و گزینه `Connect Signal` را بزنید. سیگنال `pressed` را انتخاب کنید و آن را به اسکریپت صحنه منو متصل کنید.
4. **کدنویسی منو:** در اسکریپت GDScript که به صحنه منو اضافه کردهاید، بنویسید که وقتی دکمه «شروع بازی» فشرده شد، صحنه اصلی بازی شما بارگذاری شود:
```gdscript
# فرض کنید صحنه اصلی بازی "MainGame.tscn" نام دارد
func _on_start_button_pressed():
get_tree().change_scene_to_file("res://MainGame.tscn") # مسیر فایل صحنه بازی شما
func _on_quit_button_pressed():
get_tree().quit() # بازی را میبندد
```
5. **تنظیم صحنه اصلی:** در منوی `Project -> Project Settings -> Application -> Run`, صحنه منوی خود را به عنوان صحنه پیشفرض (`Main Scene`) انتخاب کنید.
#### گام دوازدهم: بهبودهای بصری (Visual Polish)
* **ذرات (Particle Effects):** برای جذابتر کردن بازی، مثلاً وقتی کاراکتر میپرد، یک انفجار کوچک ذرات بسازید. گره `GPUParticles3D` (برای 3D) یا `CPUParticles2D` (برای 2D) این کار را انجام میدهد. میتوانید رنگ، اندازه، سرعت و حتی شکل ذرات را تنظیم کنید.
* **انیمیشنها:** اگر کاراکتر شما فقط یک مکعب است، شاید لازم باشد یک مدل سهبعدی واقعیتر با انیمیشنهای راه رفتن، پریدن و... اضافه کنید. این کار با گره `AnimationPlayer` و وارد کردن فایلهای انیمیشن (مثل فرمت `glTF`) انجام میشود.
---
نکتهی جالب درباره بهینهسازی موبایل:
برای اینکه بازی شما روی گوشیهای ضعیفتر هم روان اجرا شود، گودوت قابلیتهای زیادی دارد:
* **Level of Detail (LOD):** مدلهای سهبعدی پیچیدهتر را فقط زمانی که کاربر نزدیک آنهاست نمایش میدهد.
* **Occlusion Culling:** اشیایی که پشت موانع هستند و دیده نمیشوند را پردازش نمیکند.
* **بهینهسازی کد:** استفاده از توابع بهینهتر گودوت و کمتر کردن محاسبات غیرضروری در حلقههای اصلی بازی (`_physics_process`).
---
**حالا بازی شما هم صدا دارد، هم منو و هم جلوههای بصری! اگر دوست دارید، میتوانیم در مورد «ساخت دشمنان هوشمند» یا «نحوه انتشار بازی در مارکتها» صحبت کنیم.**
بسیار عالی! اکنون به مرحلهای رسیدهایم که نقشه راه شما کامل میشود
بخش چهارم: خروجی گرفتن و انتشار (Export & Publish)
همه بازیسازان عاشق این لحظه هستند: تبدیل کدها به فایلی که دیگران بتوانند روی گوشیشان نصب کنند.
#### گام سیزدهم: تنظیمات خروجی (Export Settings)
برای اندروید (APK):
1. **دانلود Export Templates:** از منوی `Editor` گزینه `Manage Export Templates` را بزنید و نسخهی مناسب را دانلود کنید.
2. **تنظیم Android Build Template:** به `Project -> Export` بروید، دکمه `Add` را بزنید و `Android` را انتخاب کنید.
3. **امضای بازی (Keystore):** برای انتشار در کافهبازار یا گوگلپلی، نیاز به یک فایل Keystore دارید. گودوت به شما میگوید چگونه آن را بسازید (فقط یک بار کافی است).
4. **تنظیم آیکون و نام:** در همان صفحه Export، در بخش `Application` میتوانید نام بازی و آیکون آن را انتخاب کنید.
5. **خروجی گرفتن:** دکمه `Export Project` را بزنید. بازی شما در یک فایل `.apk` یا `.aab` (برای گوگلپلی) آماده است!
#### گام چهاردهم: انتشار در مارکتها (Tips)
* **اسکرینشات و ویدیو:** مخاطب ابتدا عکس بازی را میبیند. از صحنههای اکشن بازی اسکرینشات بگیرید.
* **توضیحات جذاب:** روی «ویژگیهای منحصربهفرد» بازی تاکید کنید.
* **آپدیت منظم:** همیشه بعد از انتشار، منتظر بازخوردها باشید و باگهای احتمالی را رفع کنید.
---
بخش پنجم: پروژه «جعبهپران» (ساخت یک بازی فوقسریع)
این یک پروژه کوچک است که در کمتر از ۳۰ دقیقه تمام میشود. **هدف:** لمس صفحه = پرش کاراکتر.
#### ساختار بازی:
1. **صحنه اصلی:** یک `Node2D` بسازید.
2. **کاراکتر:** یک `Sprite2D` (تصویر یک مربع) اضافه کنید.
3. **فیزیک:** به کاراکتر گره `CharacterBody2D` بدهید و به آن `CollisionShape2D` (مستطیل) اضافه کنید.
4. **زمین:** یک `StaticBody2D` در پایین صفحه با `CollisionShape2D` بسازید.
#### دستورات طلایی (اسکریپت ساده برای کاراکتر):
این کد را به `CharacterBody2D` خود بدهید تا بازی شروع شود:
```gdscript
extends CharacterBody2D
var jump_force = -400
var gravity = 800
func _physics_process(delta):
# اعمال گرانش
velocity.y += gravity * delta
# لمس صفحه یا زدن کلید فضا
if Input.is_action_just_pressed("ui_accept"): # کلید Space یا Tap روی موبایل
velocity.y = jump_force
move_and_slide()
```
#### مرحله نهایی: تنظیم موبایل
برای اینکه در موبایل کار کند:
1. به `Project -> Project Settings -> Input Devices -> Pointing` بروید.
2. گزینه `Emulate Touch From Mouse` را فعال کنید. حالا کلیک موس در کامپیوتر، همان «لمس» روی گوشی است.
3. به `Display -> Window` بروید و `Stretch Mode` را روی `canvas_items` و `Aspect` را روی `expand` بگذارید. این یعنی بازی شما در هر ابعاد گوشی (مستطیلی یا مربعی) درست دیده میشود.
---
جمعبندی نهایی برای وبلاگ شما:
* **شما الان یک بازیساز هستید!** از ایده تا خروجی APK را یاد گرفتید.
* **فرمول موفقیت:** «کوچک شروع کن، بزرگ فکر کن».
* **نکته آخر:** اگر در حین خروجی گرفتن اروری دیدید، در تنظیمات `Project Settings` کلمه `Export` را جستجو کنید؛ گودوت معمولاً خودش راهنمایی میکند که کدام بخش (مثل تنظیمات امضا یا آیکون) جا افتاده است.
بخش پنجم: جمعبندی، منابع بیشتر و چکلیست نهایی
تبریک میگویم! شما با موفقیت مراحل ساخت بازی با گودوت را از ابتدا تا رسیدن به یک نسخه قابل انتشار، طی کردید. این بخش پایانی، پلی است برای ادامه مسیر یادگیری و اطمینان از اینکه هیچ نکته کلیدی از قلم نیفتاده است.
#### گام پانزدهم: مرور نهایی و چکلیست آمادگی برای انتشار
قبل از اینکه بازی خود را به دنیا عرضه کنید، این چکلیست را مرور کنید:
* **[ ] نصب گودوت و تنظیمات اولیه:** آیا گودوت را نصب کردهاید و با محیط آن آشنا هستید؟ (بخش اول)
* **[ ] درک مفاهیم پایه:** صحنه (Scene)، گره (Node)، بازرس (Inspector) و اسکریپتنویسی GDScript را درک کردهاید؟ (بخش اول)
* **[ ] منطق بازی پیادهسازی شده:** آیا کاراکتر حرکت میکند، میپرد و با محیط تعامل دارد؟ (بخش دوم)
* **[ ] تنظیمات موبایل:** آیا بازی برای نمایش در اندازههای مختلف صفحه نمایش (Stretch Mode) و ورودی لمسی (Mobile Input) بهینه شده است؟ (بخش دوم)
* **[ ] صداگذاری و موسیقی:** آیا افکتهای صوتی و موسیقی پسزمینه به درستی اضافه شدهاند؟ (بخش سوم)
* **[ ] منوی شروع و رابط کاربری:** آیا منوی شروع، دکمهها و سایر عناصر UI به درستی کار میکنند؟ (بخش سوم)
* **[ ] بهینهسازی بصری:** آیا از ذرات، انیمیشنها یا جلوههای بصری برای جذابیت بیشتر استفاده کردهاید؟ (بخش سوم)
* **[ ] خروجی گرفتن (Export):** آیا مراحل خروجی گرفتن برای اندروید (APK/AAB) را با موفقیت انجام دادهاید؟ آیا فایل Keystore را تنظیم کردهاید؟ (بخش چهارم)
* **[ ] تست نهایی:** بازی را روی چند دستگاه مختلف تست کنید تا از عملکرد صحیح آن مطمئن شوید.
#### گام شانزدهم: منابع بیشتر برای ادامه یادگیری
دنیای بازیسازی بیپایان است! در اینجا چند منبع برای ادامه مسیر پیشنهاد میشود:
* **مستندات رسمی گودوت (Godot Docs):** کاملترین و دقیقترین منبع برای هر سوالی که ممکن است داشته باشید. (فقط انگلیسی)
* **کانال یوتیوب گودوت (Godot Official YouTube):** ویدیوهای آموزشی، معرفی قابلیتهای جدید و کنفرانسها.
* **انجمنها و فرومهای گودوت:** مکان عالی برای پرسیدن سوال، دیدن کارهای دیگران و پیدا کردن راهحل مشکلات.
* **Asset Store گودوت:** منابع رایگان و پولی (مدلهای سهبعدی، صدا، اسکریپت و...) که میتوانید در پروژههایتان استفاده کنید.
* **یادگیری زبانهای برنامهنویسی دیگر:** اگر به جنبههای فنیتر علاقهمند شدید، یادگیری C++ (که گودوت با آن نوشته شده) یا زبانهای دیگر میتواند مفید باشد.
#### نکتهی مهم: جامعهی گودوت (Godot Community)
یکی از بزرگترین نقاط قوت گودوت، جامعهی فعال و یاریرسان آن است. چه در فرومها، چه در دیسکورد یا حتی شبکههای اجتماعی، همیشه کسانی هستند که آماده کمک به شما یا بررسی ایدههایتان باشند. از این جامعه قدرتمند نهایت استفاده را ببرید!
---
### سخن پایانی:
امیدوارم این مجموعه آموزش، جرقه اولیهی لازم برای ورود شما به دنیای هیجانانگیز بازیسازی با گودوت بوده باشد. به یاد داشته باشید که بهترین راه یادگیری، **تمرین مداوم** و **ساختن پروژههای واقعی** است، حتی اگر در ابتدا ساده باشند. از شکست نترسید، از اشتباهات خود درس بگیرید و مهمتر از همه، از این فرایند خلاقانه لذت ببرید!
در ادامه، نحوه پیادهسازی سیستم «جون» و «دشمن» را به زبان ساده توضیح میدهم تا به آموزشتان اضافه کنید.
---
### پیادهسازی سیستم «جون» (Health System)
برای مدیریت جون کاراکتر، بهترین راه استفاده از یک اسکریپت است که متغیر `health` را نگه میدارد.
#### ۱. اسکریپت کاراکتر (Player.gd)
این کد را به اسکریپتی که به کاراکترتان دادید اضافه کنید:
```gdscript
extends CharacterBody2D
var max_health = 3
var current_health = 3
# تابعی برای کم شدن جون
func take_damage(amount):
current_health -= amount
print("جون شما: ", current_health)
if current_health <= 0:
die()
func die():
print("بازی تمام شد!")
get_tree().reload_current_scene() # ریست کردن مرحله
```
#### ۲. ایجاد دشمن (Enemy)
یک `Area2D` بسازید (این گره برای تشخیص برخورد است):
1. یک `CollisionShape2D` (مثل دایره) به آن اضافه کنید.
2. در بخش **Node** (کنار تب Inspector)، سیگنال `body_entered` را به اسکریپتِ دشمن وصل کنید.
#### ۳. اسکریپت دشمن (Enemy.gd)
این کد باعث میشود وقتی بازیکن به دشمن برخورد کرد، جونش کم شود:
```gdscript
extends Area2D
func _on_body_entered(body):
# چک میکنیم که آیا برخورد کننده واقعاً همان «پلیر» است؟
if body.name == "Player":
body.take_damage(1) # یک واحد از جون بازیکن کم کن
```
---
### چگونه این «دیتا» را به کاربر نشان دهیم؟ (UI)
برای اینکه بازیکن واقعاً ببیند که چقدر جون دارد، از `Label` یا `ProgressBar` استفاده میکنیم:
1. **ساخت UI:** در صحنهی اصلی، یک `CanvasLayer` بسازید (تا رابط کاربری همیشه روی صفحه بماند).
2. داخل آن یک `Label` اضافه کنید.
3. **بهروزرسانی متن:** در اسکریپتِ بازیکن، در تابع `take_damage` این خط را اضافه کنید:
```gdscript
# فرض کنید نام گره لیبل شما "HealthLabel" است
get_node("../CanvasLayer/HealthLabel").text = "Health: " + str(current_health)
```
---
### نکات کلیدی برای آموزش شما:
* **متغیرها (Variables):** به مخاطب بگویید که متغیرها مثل «ظرفهای حافظه» هستند که مقدار جون را در خود نگه میدارند.
* **سیگنالها (Signals):** توضیح دهید که سیگنالها مثل «خبرچین» عمل میکنند؛ وقتی بازیکن به دشمن میخورد، دشمن خبر میدهد که «برخورد رخ داد!» و بازیکن در پاسخ به این خبر، تابع `take_damage` را اجرا میکند.
* **توابع (Functions):** توضیح دهید که `take_damage` یک «دستورالعمل خاص» است که هر وقت لازم باشد (مثلاً برخورد با دشمن) فراخوانی میشود.
---
### پیشنهاد نهایی برای محتوای آموزشی شما:
برای اینکه مطلب برای مخاطب دیجیتالنیوز خیلی جذاب و حرفهای شود، میتوانید این بخش را با عنوان **«آموزش اضافه کردن سیستم سلامتی (Health System) به بازی»** به انتهای بخش سوم یا ابتدای بخش پنجم اضافه کنید.
البته! بیایید نحوه ذخیره و بارگذاری وضعیت بازی (امتیاز و جون) را به طور خلاصه و ساده توضیح دهیم.
### مدیریت ذخیره بازی (Save Game)
برای ذخیره وضعیت بازی (مانند امتیاز و جون بازیکن) در گودوت، میتوانید از `FileAccess` استفاده کنید. این کار به شما امکان میدهد دادهها را در یک فایل ذخیره کنید و سپس آنها را بارگذاری کنید.
#### ۱. ذخیره وضعیت بازی
در اسکریپت بازیکن (`Player.gd`)، تابعی برای ذخیره امتیاز و جون اضافه کنید:
```gdscript
func save_game():
var file = FileAccess.open("user://savegame.dat", FileAccess.WRITE)
if file:
file.store_var(current_health) # ذخیره جون
file.store_var(score) # ذخیره امتیاز
file.close() # بستن فایل
```
#### ۲. بارگذاری وضعیت بازی
حال تابعی برای بارگذاری دادهها به اسکریپت بازیکن اضافه کنید:
```gdscript
func load_game():
var file = FileAccess.open("user://savegame.dat", FileAccess.READ)
if file:
current_health = file.get_var() # بارگذاری جون
score = file.get_var() # بارگذاری امتیاز
file.close() # بستن فایل
```
#### ۳. فراخوانی توابع ذخیره و بارگذاری
شما میتوانید توابع `save_game()` و `load_game()` را در نقاط مناسب بازی فراخوانی کنید، مانند:
- **ذخیره بازی:** بعد از اینکه بازیکن امتیاز جدیدی کسب کرد یا در منو ورودی گزینه "ذخیره" را انتخاب کرد.
- **بارگذاری بازی:** وقتی بازیکن وارد بازی میشود، میخواهید موقعیت قبلی را بارگذاری کنید.
### مثال ساده در اسکریپت
در زیر یک نمونه کامل از نحوه استفاده از این توابع به همراه وظایف ذخیره و بارگذاری سریع:
```gdscript
extends CharacterBody2D
var max_health = 3
var current_health = 3
var score = 0
func _ready():
load_game() # بارگذاری وضعیت بازی هنگام شروع
func add_score(amount):
score += amount
save_game() # ذخیره وضعیت بعد از افزایش امتیاز
func save_game():
var file = FileAccess.open("user://savegame.dat", FileAccess.WRITE)
if file:
file.store_var(current_health)
file.store_var(score)
file.close()
func load_game():
var file = FileAccess.open("user://savegame.dat", FileAccess.READ)
if file:
current_health = file.get_var()
score = file.get_var()
file.close()
```
### نکات مهم:
- **مسیر "user://":** این مسیر به عنوان کاتالوگ کاربر عمل میکند و به شما امکان میدهد دادهها را در محلی که کاربر دسترسی دارد ذخیره کنید.
- **تست در شبیهساز:** برای اطمینان از درست کار کردن ذخیره و بارگذاری، بازی را در محیط شبیهساز تست کنید.
این روش به شما کمک میکند تا پیشرفتهای بازیکنان را حفظ کنید و بازیکنان بتوانند بازی خود را ادامه دهند. آیا سوال دیگری دارید؟ حتما در کامنت ها بنویسید
برنامه نویسی گودوت آموزش بازی سازی آموزش گودوت موتور بازی سازی