روش ساده save و load داده ها در انجین گودو در قالب یک پروژه ساده

در ادامه مجموعه آموزش گودو، در این پست، روش ساده ای برای سیو و لود داده‌ها توی انجین بازی سازی گودو آموزش میدم. برای این کار روشهای مختلفی هست. این روشی که بهتون نشون میدم برای ذخیره یک داده (متغیر) هست. یعنی هر تابع ذخیره و لود کردن، یک داده رو ذخیره و لود میکنه و مناسب سیو و لودهای ساده است.

این آموزش گودو رو در قالب یک پروژه کوچیک انجام میدیم.

شروع کار با یک لیبل و دو دکمه

یه پروژه جدید بسازید. یک صحنه دوبعدی ایجاد کنید. در اون صحنه، یک لیبل برای نمایش یک عدد، دوتا دکمه، یکی برای افزایش مقدارعدد و دیگری برای سیو کردن عدد بسازید. توی این برنامه بعد از افزایش عدد و عمل ذخیره، با خروج و ورود دوباره به برنامه،‌مقدار ذخیره شده رو میبینید. در نهایت روش ریست مقدار رو یاد میگیرید.

از یه سری کارهای ابتدایی سریع رد میشم. پیشنهاد می‌کنم آموزش های قبلی رو ببینید.

پروژه ما در ابتدا:

ساختار اولیه پروژه

توی این پروژه دوتا اسکریپت داریم. یکی که به نود دوبعدی سرشاخه ضمیمه میشه. یکی به نام general. جنرال رو اتولود میکنیم و توابع سیو و لود و ریست کردن داده رو اون جا می‌نویسیم. روی دکمه ها ولیبل متن های لازم رو نوشتم.

 ظاهر بخش اتولود. General رو اتولود کنید.(از منو و گزینه project settings دستریسی دارید).

اتولود اسکریپت General

سیگنال pressed هر دو دوکمه رو به نود سرشاخه وصل کنید. با این کار داخل اسکریپت node2d، دوتا تابع برای دو دکمه ایجاد میشه. در اسکریپت node2d، یک متغیر به نام coins مثلا برای تعداد سکه میسازیم. در ابتدا اسکریپت نود 2d به این صورته. 

اسکریپت Node2D.gd در ابتدا:

extends Node2D

var coins = 0

func _on_button_pressed():
pass #Replace with function body

func _on_button_2_pressed():
pass #Replace with function body

بعد توی اسکریپت general باید چندتا کار انجام بدید:

  • یک متغیر برای سکه ها (که قراره برای سیو و لود استفاده بشه) ایجاد کنید. من به نام G_coins ساختم تا از خطا جلوگیری بشه. 
  • یک متغیر رشته ای برای ذخیره مسیر فایلی که متغیر ما قراره توش سیو بشه بسازید. من اسمش رو گذاشتم coins_save_path. به user در ابتدای آدرس دقت کنید و به فرض در موبایل، این آدرس میشه فولدر اصلی گوشی شما یا به اصطلاح root. 
  • یک تابع برای سیو بسازید. در این تابع یک فایل میسازیم و اون رو برای ذخیره کردن یا WRITE باز میکنیم، و متغیر G_coins رو در اون ذخیره میکنیم. 
  • یک تابع برای لود کردن بسازید. در این تابع اول وجود فایل مورد نظر بررسی میشه(برای جلوگیری از خطا) و بعد مقدار ذخیره شده رو در متغیر G_coins قرار بده.
  • یک تابع برای ریست کردن مقدار ذخیره شده بسازید. برای این که بتونید برنامتون رو بارها تست کنید. اسکریپت General در آخر به ایم شکل خواهد بود.

اسکریپت General.gd :‌

extends Node

var G_coins
var coins_save_path = "user://coins.save"

func _ready():
#reset_coins()
pass

func save_coins():
var file = FileAccess.open(coins_save_path,FileAccess.WRITE)
file.store_var(G_coins)

func load_coins():
if FileAccess.file_exists(coins_save_path):
var file = FileAccess.open(coins_save_path,FileAccess.READ)
G_coins = file.get_var()

func reset_coins():
var file = FileAccess.open(coins_save_path,FileAccess.WRITE)
file.store_var(0)
  • برای ذخیره کردن در فایل از WRITE استفاده میشه و برای لود کردن از READ. من تابع reset_coins رو در تابع ready فراخوانی کردم، ولی فعلا به صورت کامنت درش آوردم تا فراخوانی نشه. بعدا درباره این توضیح میدم. 

حالا باید در اسکریپت node2d تغییراتی ایجاد کنیم و اون رو تکمیل کنیم. اسکریپت در آخر اینجوریه.

اسکریپت Node2D.gd در پایان کار

extends Node2D

var coins = 0

func _ready():
General.load_coins()
coins = General.G_coins()
label.text = "score:" + str(coins)

func _on_button_pressed():
General.G_coins = coins
General.save_coins()

func _on_button_2_pressed():
coins+=10
label.text = "score:" + str(coins)

به این موارد توجه کنید:

  • وقتی دکمه افزایش عدد رو میزنید (button2) ، مقدار coins ده تا بیشتر میشه و متن لیبل هم به روز میشه، یعنی دوباره مقدار جدید میگیره. به اضافه شدن کلمه :score به مقدار عدد سکه دقت کنید.
  • وقتی دکمه ذخیره (button) رو میزنید، اول مقدار G_coins برابر با مقدار coin میشه. به این دلیل که ما مقدار coins رو تغییر دادیم. میخوایم مقدار G_coins هم قبل از ذخیره شدن بروز کنیم. و بعد تابع save_coin فراخوانی کنیم و مقدار رو ذخیره کنیم. به طور کلی coins اول در G_coins و بعد در فایل ذخیره میشه. 
  • در تابع ready، مقدار رو لود میکنیم. اول تابع load از General ر وفراخوانی کنید. بعد مقدار coins رو برابر با مقدار G_coins که تازه از فایل لود شده میکنیم. و در نهایت هم متن لیبل رو بروزرسانی میکنیم. باید مقدار جدید رو نمایش بدید تا بفهمید که آیا سیو و لود به درستی انجام شده یا نه. 

نتیجه اجرای پروژه:

نتیجه نهایی

میبینید که ذخیره مقدار درست انجام شده.

نکته تکمیلی، ریست کردن مقدار سکه‌ها

در نهایت اگه خواستید مقدار سکه رو ریست یا صفر کنید، تابع reset_coin رو در ready از حالت کامنت خارج کنید و pass رو کامنت کنید، یک بار برنامه رو اجرا کنید و خارج بشید. و دوباره reset_coin رو به حالت کامنت دربیارید و pass رو از کامنت خارج کنید. به این شکل:

ریست کردن مقدار سکه

آموزش به آخر رسید.امیدوارم براتون مفید باشه. ساخت بازی یه فرایند جالب و چالش برانگیزه. من سعی می کنم این مسیر رو برای شما هموارتر کنم. سوال داشتید حتما بپرسید و نظرتون رو هم بگید. موفق باشید.

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

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

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