آموزش انجين گودو: جابجايي بين صحنه ها

با يک آموزش جديد از انجين بازي سازي گودو در خدمت شما هستم. در اين آموزش ياد ميگيريم چطور جابجايي بين دو صحنه بازي در گودو رو انجام بديم.

جا به جا شدن بين صحنه توي يه بازي از عادي ترين و پيش پا افتاده ترين کارهاست. و براي ساخت يک بازي ضروريه. فرض کنيد ميخوايد از صحنه بازي دکمه منو رو بزنيد، منو رو نمايش بديد و دوباره از منو وارد صحنه بازي بشيد. چطور اين کار رو انجام ميديد؟ امروز اين رو با هم ياد ميگيريم. من براي اين آموزش از گودو نسخه 4.0 استفاده کردم.

بياييد دو تا صحنه و چندتا دکمه و پنل بسازيم

در اين پروژه تمريني آموزش جابجايي، دو تا صحنه داريم. نام اين صحنه ها را game_scene و menu_scene گذاشتم. ميخوايم بين اين دو صحنه جابجا بشيم.

محتويات صحنه ها

  • صحنه menu-scene شامل يک دکمه با متن start game است. اين صحنه رو ساده در نظر گرفتم.
  • صحنه game_scene شامل يک دکمه براي نمايش و مخفي کردن پنل منوئه. همچنين يک پنل داره (فرض کنيد پنليه که وقتي بازي رو متوقف ميکنيد نمايش داده ميشه). داخل اين پنل يک دکمه هست. با زدن اون دکمه به صحنه منو برميگرديم.

ساختار صحنه ها رو بهتون نشون ميدم.

صحنه منو
صحنه اصلي بازي

من فرض ميکنم شما بلديد در گودو يک صحنه بسازيد. نودهاي مورد نياز رو به صحنه اضافه کنيد. سيگنال دکمه رو به اسکريپت صحنه متصل کنيد. همه اين ها قبلا در اين سايت آموزش داده شده. شديدا پيشنهاد ميکنم اگر نديديد حتما آموزش هاي قبلي رو ببينيد.

اول ميخوايم با زدن دکمه start game از صحنه منو، وارد صحنه game_scene بشيم. بايد به نود اصلي صحنه منو يک اسکريپت اضافه کنيد. سيگنال button رو به اسکريپت متصل کنيد و بعد شروع به کدنويسي کنيد.

براي جابجايي بين صحنه ها من دو روش رو به شما نشون ميدم. هر کدوم در جاي خودش کاربرد داره. در روش اول توي اسکريپت منو، يک متغير ميسازيم که صحنه game_scene رو در خودش ذخيره ميکنه و از قبل لود ميکنه. به اين کار preload ميگن. صحنه رو از قبل و در ابتداي اجراي بازي لود ميکنيم تا وقتي که ميخواهيم نمايشش بديم دچار وقفه نشيم.

در قدم بعدي با زدن دکمه روي منو دستور تغيير صحنه رو ميديم.

کد مربوط به صحنه menu_scene

extends Node2D

@onready var game_Scene = preload("res://Game_Scene.tscn")

func _on_button_pressed():
get_tree().change_scene_to_packed(game_Scene)

  • وقتي از دستور preload استفاده ميکنيم، از ما مسير يا path فايل صحنه مورد نياز رو ميخواد. خود گودو موقع کدنويسي اين رو گزينه ها رو بهمون نشون ميده. ولي يه راهش هم اينه که در قسمت file system روي صحنه مورد نظر کليک راست کنيم و copy path رو انتخاب کنيم تا مسير فايل کپي بشه و بعد در جاي مورد نظر پيست کنيم.
  • در فانکشن متصل به دکمه، get_tree براي رسيدن به درخت نودهاست. بعد به دستور change_scene_to_packed ميرسيم. اين تابع صحنه رو به يک صحنه از پيش لود شده تغيير ميده. نکته، اگه از قبل صحنه رو preload نکرده بوديم، اين جا بايد به جاي change_scene_to_packed از يه تابع ديگه به نام change_scene_to_file استفاده ميکرديم. اين روش رو هم جلوترتوضيح ميدم.

حالا اگه يه تست کنيد و صحنه منو رو اجرا کنيد بايد با زدن دکمه start game وارد صحنه بازي بشيد. اما ما ميخوايم از صحنه بازي هم بتونيم به منو برگرديم.

در صحنه بازي يا game_scene ما يه دکمه براي نمايش پنل منو داريم (من اسمشو گذاشتم show_menu_button)، و يه دکمه داخل اون پنل(menu_panel) براي رفتن به منو داريم(Button). به تفاوت اين دوتا توجه کنيد.

بعد از يه توضيح کوتاه کد مربوط به game_scene رو ميذارم. توي اين اسکريپت ما بايد اول به نودهاي داخل صحنه رفرنس بديم. بعد بايد کد دکمه نمايش پنل رو بنويسيم و در نهايت کد رفتن به صحنه منو. دقت کنيد که بايد سيگنال pressed مربوط به هر دو دکمه موجود در صحنه رو به اسکريپت صحنه متصل کنيد.

اسکريپت Game_scene

extends Node2D

@onready var menu_panel = $menu_panel
@onready var back_button = $menu_panel/Button
@onready var show_menu_button = $show_menu_button

func _on_show_menu_button_pressed():
menu_panel.visible = !menu_panel.visible

func _on_button_pressed():
get_tree().change_scene_to_file("res://menu_scene.tscn")
  • در خطهاي اول اسکريپت به دکمه ها و پنل رفرنس دادم تا بتونم ازشون استفاده کنم.
  • در تابع on_show_menu_button_pressed، يک ترفند به کار بردم. با اين کد هر وقت که دکمه نمايش پنل رو بزنيد، اگه پنل قابل مشاهده بود، مخفي ميشه و اگه مخفي بود، نمايش داده ميشه. visible ويژگي ايه که مخفي يا پيدا بودن يک نود را مشخص ميکنه و به صورت true و false هست. (در اديتور با علامت چشم کنار هر نود قابل تنظيمه).
  • در تابع on_Button_pressed، کد مربوط به تغيير صحنه رو نوشتم. دقت کنيد که اين روش دومه و با روش قبلي متفاوته. توي اين روش صحنه رو در لحظه لود کردم و از load به جاي preload استفاده کردم. اين جا هم بايد مسير فايل رو به تابع بديد.(به يک نکته دقت کنيد. اگه اين جا سعي کنيد که از روش preload استفاده کنيد، احتمالا با خطا مواجه ميشيد. حدس ميزنم دليلش اينه که صحنه منو که يک بار لود شده رو دوباره ميخوايد preload کنيد.).

حالا نتيجه رو با هم ببينيم.

نتيجه نهايي

اين هم از آموزش جابجايي بين صحنه هاي بازي. اميدوارم براتون مفيد باشه.منتظر نظر و سوال هاي شما هستم.

دیدگاه‌ خود را بنویسید

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

پیمایش به بالا