<?xml version='1.0' encoding='utf-8' ?>
	<rss xmlns:dc='https://purl.org/dc/elements/1.1/' xmlns:content='http://purl.org/rss/1.0/modules/content/' xmlns:slash='http://purl.org/rss/1.0/modules/slash/' xmlns:atom='http://www.w3.org/2005/Atom' xmlns:media='http://search.yahoo.com/mrss/' version='2.0'>
	<channel>
	<title>گودو گیم دو، بلاگ بازی سازی با انجین گودو Godot</title>
	<link>https://godotgamedev.blogix.ir</link>
	<atom:link href='https://godotgamedev.blogix.ir/rss' rel='self' type='application/rss+xml' />
	<description>گودو گیم دو، بلاگ آموزشی و اطلاع رسانی انجین بازی سازی گودو (Godot) است. در این بلاگ مطالب زیادی درباره انجین گودو و بازی سازی یاد میگیرید.</description>
	<language>fa</language>
	<generator>https://blogix.ir</generator>
	<lastBuildDate>Sat, 14 Mar 2026 22:04:20 +0330</lastBuildDate><item>
				<title>تابع clamp در انجین گودو برای محدود کردن یک متغیر</title>
				<link>https://godotgamedev.blogix.ir/post/12</link>
				<description><![CDATA[<p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">سلام به همه دوستداران گودو. یه مدتی نبودم. تو این مدت مهمترین اتفاقی که افتاده اینه که ورژن 4.2 گودو منتشر شد(و من هم تو این آموزش ازش استفاده میکنم) که تو بعضی زمینه ها نسبت به ورژن قبلی بهبود داشت. و خبر خوب دیگه این که فروم یا انجمن گودو به روز شد که جای خیلی خوبیه برای سوال پرسیدن و معاشرت کردن با دیگر توسعه دهندگان گودو. اینم آدرسش :</span></p><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;"> </span><a href="https://forum.godotengine.org" target="_blank" rel="nofollow"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">https://forum.godotengine.org</span></a></p><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">با یه آموزش کاربردی دیگه اومدم. اول مسئله رو مطرح میکنم. وقتی میخواید یه متغیرو بین دوتا مقدار حداقل و حداکثر، یا کمینه و بیشینه محدود کنید، چه کار میکنید؟ خوب، اولین گزینه ای که به ذهن آدم میاد اینه که در تابع proccess  یا physics_proccess از چند تا دستور شرطی استفاده کنه و بگه: اگه مقدار متغیر از x کمتر شد، تو اون رو برابر مثلا 0 قرار بده و اگه از فلان مقدار بیشتر شد، تو این رو برابر یا 1000 قرار بده. این ایرادی نداره و احتمالا کار میده. ولی همیشه اولین راه حل، بهترین راه حل نیست. راه های بهتری هم هست. این راهی کی میخوایم ازش صحبت کنیم، تابع clamp ئه. </span></p><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">تابع clamp یک متغیر رو بین دوتا مقدار کمینه و بیشینه نگه میداره و اجازه نمیده از اون حدود تجاوز کنه.<strong> یک بار برای همیشه بیاید و clamp رو یاد بگیرید و همیشه ازش استفاده کنید. این قدر برای همه چیز شرط if نزنید(خطاب به خودم!).</strong></span></p><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">توی پروژه کوچیکی که برای مثال این مطلب استفاده میکنم، یک آبجکت داریم که با دکمه بالا و پایین حرکت میکنه ولی از بالا و پایین تصویر، اون طرف تر نمیره. </span></p><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">اول scenetree رو لوازم مورد نیاز رو براتون میذارم و بعد کد، و کد رو توضیح میدم. </span></p><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">صحنه ما از یک node2D که سرشاخه است و یک scene به نام animal  تشکیل شده. صحنه animal، خودش شامل یک نود character2d به عنوان سرشاخه و دوتا نود زیر مجموعه که یکی sprite2d و دیگری collisionshape2d ئه و هر دو برای ساخت یک character2d میشه گفت ضروری هستن. </span></p><figure class="image"><img src="https://s6.uupload.ir/files/clamp1_zuw6.jpg"></figure><p> <span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">و حالا صحنه animal و چینش صفحه بازی. من animal رو آوردم وسط صفحه و رنگ پس زمینه رو به آبی روشن تغییر دادم. </span></p><figure class="image"><img src="https://s6.uupload.ir/files/clamp2_ws41.jpg"></figure><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">این از پیش نیازهای پروژه.</span></p><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">حالا دقت کنید که animal  یه اسکریپت داره. کد این اسکریپت به شرح زیره:</span></p><figure class="image"><img src="https://s6.uupload.ir/files/clamp3_gr20.jpg"></figure><p><span style="color:hsl(0, 75%, 60%);"><strong>(خطایی توی تصویر هست، برای این که حرکت درست باشه جای 250 و منفی 250 باید عوض شه)</strong></span></p><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">به ترتیب شماره گذاری توضیح میدم:</span></p><ol><li><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">یک متغیر از نوع vector2 به نام movement تعریف کردم.</span></li><li><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">در تابع پیش ساخته physics_proccess دو تا شرط برای حرکت رو به بالا و رو به پایین نوشتم. به این صورت که وقتی کلید بالای کی برد فشرده شد، متغیر movement برابر بشه با مقداری که میبینید که  x اش صفره و y اش 250. و اون رو ضربدر delta کردم.و همین کار برای دکمه پایین کی برد. دقت کنید هنوز حرکتی صورت نگرفته.</span></li><li><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">اینجا گفتم که position نود مورد نظر هر چی که هست با مقدار movement جمع بشه که بسته به دکمه بالا یا پایین، یا مقدارش کم میشه ( حرکت رو به بالا) یا مقدارش زیاد میشه (حرکت رو به پایین). به خاطر این که در گودو y رو به پایین مقدارش افزایش پیدا میکنه. و بعد هم تابع move_and_slide رو استفاده کردم که از توابع نود character2d ئه و <strong>عملا تغییر پوزیشن رو اعمال میکنه.</strong></span></li><li><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">میرسیم به خط طلایی که مقدار global_position بین 0 و عرض تصویر بازی(get_viewport)، محدود میکنه. </span></li></ol><p> <span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">  اول نتیجه بهتون نشون میدم و بعد چند نکته میگم:</span></p><figure class="image"><img src="https://s6.uupload.ir/files/clamp4_rmo7.gif"></figure><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">تابع clamp  به چند صورت استفاده میشه. میشه به طور ساده ازش استفاده کرد که در این حالت تابع، سه تا ورودی میگیره: متغیر مورد نظر ، مقدار حداقل، مقدار حداکثر. </span></p><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">یا این که مثل من روی یک مقدار که از نوع vector2 ئه به کارش ببرید. چون نوع vector2 خودش تابع clamp برای تعریف شده. در این صورت متغیر وکتور2 خودتون رو مینویسید و بعد clamp و بعد مقدار حداقل و حداکثر رو وارد میکنید. </span></p><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">نکته خیلی مهم:</span></p><blockquote><p style="text-align:center;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;font-size:18px;"><strong>برای این که اثر clamp اعمال بشه، حتما باید برابر با متغیر قرار بگیره. clamp خالی هیچ کاری نمیکنه.</strong></span></p></blockquote><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;font-size:14px;"><strong>توی تصویر ببینید من چجوری نوشتم.</strong></span></p><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;font-size:14px;"><strong>خوب آموزش به پایان رسید. فکر کنید ببینید کجاها این به درد میخوره. مثلا یک بازی  space shooter  که پلیر سمت چپ تصویره و باید مهاجما رو از بین ببره و دامنه حرکتش از بالا تا پایین تصویره. یا فرض کنید میخواید سرعت یه آبجت از یه حدی فراتر نره.</strong></span></p><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;font-size:14px;"><strong>امیدوارم این آموزش استفاده کنید و نظراتتون رو بهم بگید و سوال بپرسید.موفق باشید. </strong></span></p>]]></description>
				<pubDate>Sat, 14 Mar 2026 22:04:20 +0330</pubDate>
				
				<comments>https://godotgamedev.blogix.ir/post/12/comment</comments>
				<dc:creator>danial abdl</dc:creator>
				<guid>https://godotgamedev.blogix.ir/post/12</guid>
				<slash:comments>0</slash:comments>
			<category>آموزش</category><category>مبتدی</category></item><item>
				<title>روش ساده سیو و لود داده ها در گودو در قالب یک پروژه ساده</title>
				<link>https://godotgamedev.blogix.ir/post/11</link>
				<description><![CDATA[<p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">در این پست، روش ساده ای برای سیو و لود کردن داده‌ها توی انجین بازی سازی گودو ارائه میدم. برای این کار روشهای مختلفی وجود داره. این روشی که بهتون نشون میدم برای ذخیره یک داده است. یعنی هر تابع ذخیره و لود کردن، یک داده رو ذخیره و لود میکنه و برای سیو و لودهای ساده کاربرد داره. </span></p><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">آموزش رو در قالب یک پروژه کوچیک انجام میدیم و در آخر فایل پروژه رو براتون میذارم و میتونید دانلود کنید.</span></p><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">با یک پروژه جدید شروع میکنیم. یک صحنه دوبعدی ایجاد میکنیم. در اون صحنه، یک لیبل برای نمایش یک عدد، دوتا دکمه، یکی برای افزایش مقدار عدد و دیگری برای سیو عدد وجود داره. برنامه به این شکل خواهد بود که وقتی عدد رو افزایش میدید و ذخیره میکنید. وقتی که از برنامه خارج بشید و دوباره وارد بشید آخرین عددی که رسیده بودید نمایش داده میشه. در نهایت روشی برای ریست کردن مقدار داده بهتون نشون میدم.</span></p><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">برای اینکه آموزش های پیشرفته تری بتونم بدم، از یه سری کارهای ابتدایی سریع رد میشم. اگه آموزش های قبلی رو ببینید همه این کارها رو یاد خواهید گرفت. </span></p><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">پروژه ما در ابتدا این شکلی خواهد بود.</span></p><figure class="image"><img src="https://s6.uupload.ir/files/savenload_intro1_1nwn.png"></figure><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">همچنین در این پروژه دوتا اسکریپت داریم. یکی که به نود دوبعدی سرشاخه ضمیمه میشه و یکی به نام general که اتولود میشه و توابع سیو و لود و ریست کردن داده اونجا قرار داره. روی دکمه ها متن های لازم رو نوشتم و و لیبل هم همین طور. </span></p><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;"> بخش اتولود که فایل general رو قرار میدیم این شکلی میشه.</span></p><figure class="image"><img src="https://s6.uupload.ir/files/savenload_intro2_k9g5.png"></figure><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">لازمه که برای هر دو دکمه، سیگنال pressed  رو به نود سرشاخه وصل کنیم که با این کار داخل اسکریپت node2d، دوتا تابع برای دو دکمه ایجاد میشه. در اسکریپت node2d، یک متغیر به نام coin مثلا برای تعداد سکه میسازیم. <u>توی تصویر بالا برای لیبل و یکی از دکمه ها متغیر ایجاد کردم که ضروری نبوده و لازم نیست شما انجام بدید. در ابتدا اسکریپت نود 2d به این صورته. </u></span></p><figure class="image"><img src="https://s6.uupload.ir/files/savenload_intro3_0gq0.png"></figure><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">بعد توی اسکریپت general چندتا کار باید انجام بدیم. </span></p><ul><li style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">یک متغیر برای سکه ها (که قراره برای سیو و لود استفاده بشه) ایجاد کنیم که من برای این که با اون یکی متغیر اشتباه نگیریدش به نام G_coin ساختم. </span></li><li style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">یک متغیر رشته ای برای ذخیره مسیر فایلی که متغیر ما قراره توش سیو بشه که اسمش رو گذاشتم coin_save_path. دقت کنید که در ابتدای این آدرس از "</span><span style="color:hsl(0,75%,60%);font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">user</span><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">" استفاده شده و به فرض در موبایل، این ادرس میشه فولدر اصلی گوشی شما یا به اصطلاح root. </span></li><li style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">یک تابع برای سیو. در این تابع کاری که انجام میدیم اینه که یک فایل ایجاد میکنیم و اون رو برای ذخیره کردن یا WRITE باز میکنیم، و متغیر G_coin رو در اون ذخیره میکنیم. </span></li><li style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">یک تابع برای لود کردن. در این تابع اول بررسی میکنیم که اگر فایلی که قراره ساخته بشه وجود داره(برای جلوگیری از خطا) متغیر ذخیره شده رو در متغیر G_coin قرار بده یا لود کنه.</span></li><li style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">یک تابع برای ریست کردن مقدار ذخیره شده. برای این که بتونید برنامتون رو بارها تست کنید. اسکریپت general به این شکل خواهد بود</span><img src="https://s6.uupload.ir/files/savenload_intro4_rrk0.png"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">دقت کنید که برای ذخیره کردن در فایل WRITE استفاده میشه و برای لود کردن از READ. یک نکته دیگه این که من تابع reset_coins رو در تابع ready فراخوانی کردم، ولی فعلا به صورت کامنت درش آوردم تا فراخوانی نشه. بعدا درباره این توضیح میدم. </span></li></ul><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">حالا باید در اسکریپت node2d تغییراتی ایجاد و اون رو تکمیل کنیم. اسکریپت در آخر اینجوری میشه:</span></p><figure class="image"><img src="https://s6.uupload.ir/files/savenload_intro5_205h.png"></figure><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">به این موارد توجه کنید:</span></p><ul><li style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">وقتی دکمه افزایش عدد زده(button2) میشه، مقدار coin ده تا افزایش پیدا میکنه و متن لیبل هم به روز میشه، یعنی دوباره مقدار جدید میگیره. دقت کنید که کلمه score و علامت : به مقدار عدد سکه اضافه میشه. </span></li><li style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">وقتی دکمه ذخیره (button) زده میشه، اول مقدار G_coin برابر با مقدار coin میشه. به این دلیل که ما مقدار coin رو تغییر دادیم. میخوایم مقدار G_coin  که قراره ذخیره بشه هم بروز بشه. و بعد تابع save_coin فراخوانی میشه و مقدار رو ذخیره میکنه. به طور کلی coin  در G_coin ذخیره میشه و بعد در فایل ذخیره میشه. </span></li><li style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">در تابع ready  که در ابتدای برنامه لود میشه، قراره عمل لود کردن رو انجام بدیم. پس اول تابع load رو از general فراخوانی میکنیم. بعد مقدرا coin رو برابر با مقدار G_coin که تازه از فایل لود شده میکنیم. و در نهایت هم متن لیبل رو بروزرسانی میکنیم. چون تا مقدار جدید رو نمایش ندیم نمیتونیم بفهمیم که سیو و لود به درستی انجام شده یا نه. </span></li></ul><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">حالا وقتی پروژه رو اجرا کنید باید با چنین چیزی روبرو بشید:</span></p><figure class="image"><img src="https://s6.uupload.ir/files/savenload_intro6_wcu8.gif"></figure><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">میبینید که هر بار که عدد رو افزایش میدم و ذخیره میکنیم، وقتی که برنامه میبندیم و دوباره باز میکنیم، مقدار سکه ذخیره شده. </span></p><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">در نهایت اگه خواستید مقدار ذخیره شده رو ریست کنید یا صفر کنید، تابع reset_coin رو در ready از حالت کامنت خارج کنید و pass  رو کامنت کنید، یک بار برنامه رو اجرا کنید و خارج بشید. و دوباره reset_coin رو به حالت کامنت دربیارید و pass  رو از کامنت خارج کنید.به این شکل:</span></p><figure class="image"><img src="https://s6.uupload.ir/files/savenload_intro7_dncn.gif"></figure><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">آموزش به آخر رسید. امیدوارم براتون مفید باشه. سوال داشتید حتما بپرسید و نظرتون رو هم بگیدو موفق باشید.</span></p><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">فایل پروژه:</span></p><p style="text-align:justify;"><a href="https://s6.uupload.ir/filelink/tDd6JYpztcUZ_7b42b589c4/savenload_intro_file_412y.zip" rel="nofollow"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">دانلود</span></a></p>]]></description>
				<pubDate>Fri, 13 Mar 2026 13:05:59 +0330</pubDate>
				
				<comments>https://godotgamedev.blogix.ir/post/11/comment</comments>
				<dc:creator>danial abdl</dc:creator>
				<guid>https://godotgamedev.blogix.ir/post/11</guid>
				<slash:comments>0</slash:comments>
			<category>آموزش</category></item><item>
				<title>تجربه پس از انتشار بازی اندروید و راه‌هایی برای دیده شدن</title>
				<link>https://godotgamedev.blogix.ir/post/10</link>
				<description><![CDATA[<p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;font-size:14px;">در این مطلب، به آن‌چه که پس از انتشار بازی </span><a href="https://cafebazaar.ir/app/org.dna.chameleon" rel="nofollow"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;font-size:14px;">معمای آفتاب پرست</span></a><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;font-size:14px;"> در مارکت‌های اندروید ایرانی بر سر من و این بازی اومد، و راه هایی که برای دیده شدن یافتم و به کار بردم، خواهم پرداخت. و در آخر توصیه‌هایی به شما خواهم کرد.</span></p><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;font-size:14px;">بعد از این که بازی خودتون رو در مارکت‌های ایرانی (کافه بازار و مایکت) منتشر کردید، برای مدتی در لیست جدیدترین‌های دسته خود(برای مثال تفننی) قرار میگیرید.این لیست معمولا در پایین ترین بخش صفحه دسته قرار داره. فرض کنید چقدر احتمال داره که یه کاربر، وارد اپ بازار بشه، اسکرول کنه و بره پایین، دسته تفننی رو انتخاب کنه، توی اون صفحه هم بره پایین و در جدیدترین‌ها بازی شما رو ببینه؟ حالا آیا رغبت می‌کنه که وارد صفحه شما بشه و اگر وارد شد، آیا رغبت می‌کنه که بازی رو نصب کنه؟! و اگر نصب کرد آیا...(و این قصه ادامه دارد). از طرفی در روزهای اول انتشار، به عنوان سازنده بازی از طریق کانال‌های مختلف ارتباطی و اجتماعی دیگران رو ترغیب به نصب بازی خود می‌کنید. به دوست و آشنا میگید، توی پیج بازی اطلاع رسانی میکنید و ...</span></p><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;font-size:14px;">با این اوصاف در چند روز اول،(شاید حدود دوهفته) بازی به تعدادی مشاهده و نصب میرسه که دلگرم کننده است. ولی بالاخره بازی شما تا یه مدتی جدیدترینه و کم کم از این لیست هم خارج میشه. حالا سوال این جاست که از این به بعد شما چطور مشاهده و نصب میگیرید؟ به اطلاعتون برسونم که الان در هیچ لیستی از مارکت حضور ندارید و شانس دیده شدن بسیار پایینه. </span></p><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;font-size:14px;">راه هایی که وجود داره:کانال‌های اجتماعی و ارتباطی قوی، تبلیغات و راه‌هایی که به ذهن شما میرسه (توی کامنتها بگید). <i>برای من این طور پیش رفت که بعد از خروج از لیست جدیدترین‌ها، آمار مشاهده و نصب خیلی پایین اومد و در کانالهای ارتباطی که داشتم هم به اندازه کافی اطلاع رسانی کردم. </i>به فکر تبلیغ افتادم. <strong>نوعی از تبلیغات به اسم تبلیغات نصب وجود داره که خلاصه اش اینه که با مقدار مشخصی بودجه، و این که برای هر نصب حاضرید چقدر هزینه کنید، بازی شما اونقدر در مارکت به کاربرا نشون داده میشه تا به اون تعداد نصب برسید. باید احتیاط کنید. هزینه تبلیغات بالاست و باید به فکر برگشت این هزینه باشید. </strong>من از تبلیغات با بودجه بسیار محدود استفاده کردم. برای هر مارکت حدود 500 هزار تومن و برای این که بدونید 500 هزار تومن یعنی چی، با این مبلغ در این تاریخ، میشه حدود 200 نصب گرفت. این جا آمار مشاهده و نصب دو روز تبلیغات در مایکت رو براتون میذارم</span></p><figure class="image image_resized" style="width:42.57%;"><img src="https://s6.uupload.ir/files/cham_xp1_v1mj.png"></figure><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;font-size:14px;">به نسبت نصب به مشاهده صفحه دقت کنید. چیزی حدود 2 درصده. معنی اش اینه که 2 درصد کاربرایی که آیکون بازی شما رو دیدن و وارد صفحه شما شدن، علاقه مند شدن که بازی رو نصب کنن(جهت اطلاع، 2 درصد خیلی کمه).</span></p><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;font-size:14px;"><i>چند روز خوش تبلیغات هم گذشت و باز خشکسالی شد. باز هم آمار مشاهده به حدود 10 تا و نصب به حدود 1 یا حتی هیچی در روز رسید. مشکل این جا بود که بازی من حتی اگه بازی خوبی بود، فرصت دیده شدن نداشت. باید برای این فکری میکردم. شروع کردم و به جستجو و تحقیق.</i></span></p><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;font-size:14px;">حالا میخوام براتون قصه دیگه ای بگم. مایکت و کافه بازار برای گذاشتن بازی ها توی لیست‌ها دو روش دارن:</span></p><ul><li><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;font-size:14px;">سیستمی: به برداشتی که من داشتم، روش سیستمی به تعداد نصب و امتیازها و نظرات ربط داره و اگه اینها خیلی خوب بودن، بازی شما اتوماتیک توی لیستهای پربازدید قرار میگیره. ما که از این روش خیری ندیدیم.</span></li><li><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;font-size:14px;">غیر سیستمی:فرایندی که در اون شما خودتون از طریق ارسال تیکت، درخواست میکنید که بازی شما بررسی و ارزیابی بشه و در صورت شایستگی توی لیست های پربازدید قرار بگیره. این کاری بود که من کردم و نتایج از زمین تا آسمون متفاوت شد.</span></li></ul><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;font-size:14px;"><strong>نکته مهمی که باید این جا بگم اینه که اولین شرط اینه بازی شما بازی خوبی باشه یا حداقل به اندازه کافی خوب باشه. یعنی اصولی ساخته شده باشه، استانداردها رعایت شده باشه، جذاب باشه، روی صفحه بازی در مارکت، کار شده باشه و ... </strong><i>من از روز اول انتشار تا قبل از درخواست قرار گرفتن توی لیست، بازی رو 4 بار بروزرسانی کردم، ایرادهای جزئی رو برطرف کردم، مراحل جدید اضافه کردم و بازی رو ارتقا دادم. در نهایت به طور جداگانه برای هر دو مارکت درخواست ارسال کردم و به طور مفصل از دلایل شایستگی بازی خودم نوشتم و در خواست کردم که بازی معمای آفتاب پرست در لیست های پربازدید قرار بگیره. حتی لیست های مورد نظر خودم رو هم پیشنهاد دادم.</i></span></p><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;font-size:14px;"><i>اعتراف میکنم که خیلی امیدوار نبودم که بپذیرن ولی همون روز پذیرفتن و و همون روز بازی در یکی از لیست ها قرار گرفت (کافه بازار) و در روزهای بعدی هم در لیست های پربازدیدتری قرار گرفت. در واقع اول بازار قبول کرد که بازی رو در لیست "تازهای معمایی" قرار بده و چند روز بعد در لیست "تازه به بازار رسیده" در صفحه اصلی قرار بده. مایکت هم اول بازی رو در لیست "تازه های منتخب" بازی‌های فکری و بعد از چند روز در لیست "تازه های منتخب" در صفحه اصلی قرار داد. </i></span></p><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;font-size:14px;">آمار چند روز رو براتون میذارم</span></p><figure class="image"><img src="https://s6.uupload.ir/files/cham_xp2_6ql4.png"></figure><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;font-size:14px;">دقت کنید که اون نسبت نصب به مشاهده که بالاتر در قسمت تبلیغات گفتم اینجا متفاوته. برای مثال نسبت نصب به مشاهده مایکت در روز 30 مهر، 9 درصده که نسبت به  تبلیغات بالاتره. با تبلیغات من 138 نصب در یک روز رسیدم، در حالی که وقتی در لیست های پربازدید قرار گرفتم بدون هزینه به 625 نصب رسیدم.</span></p><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;font-size:14px;">این بود قصه من. به این ترتیب به بازی خودم فرصت دیده شدن دادم و به جایگاهی که لایق بود رسید.</span></p><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;font-size:14px;">در آخر نتیجه های مهم رو مرور میکنم:</span></p><ul><li><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;font-size:14px;"><strong>داشتن یه صفحه اجتماعی برای گروه یا استدیو که افرادی بتونن کار شما رو دنبال کنن  و بتونید به سرعت به نصب قابل قبولی برسید اهمیت زیادی داره</strong></span></li><li><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;font-size:14px;"><strong>میتونید تبلیغات محدودی برای رسیدن به تعداد قابل قبولی نصب در ابتدای کار انجام بدید.</strong></span></li><li><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;font-size:14px;"><strong>از همه مهمتر سعی کنید بازی خود تا حد امکان بهبود ببخشید، به نظرات و انتقادها گوش بدید، ایرادها رو رفع کنید، روی گیم پلی، رابط کاربری، اقتصاد بازی (اکونومی) و جنبه های دیگه بازی کار کنید</strong></span></li><li><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;font-size:14px;"><strong>روی فرایند غیرسیستمی و درخواست از مارکت ها برای قرار گرفتن در لیست ها پربازدید، حساب کنید. خیلی مهمه.</strong></span></li></ul><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;font-size:14px;"><strong>دوست دارم شما هم تجربه های خودتون رو بگید و هر سوالی داشتید بپرسید. امیدوارم مطالعه این تجربه برای شما مفید باشه.</strong></span></p>]]></description>
				<pubDate>Tue, 24 Feb 2026 10:00:23 +0330</pubDate>
				
				<comments>https://godotgamedev.blogix.ir/post/10/comment</comments>
				<dc:creator>danial abdl</dc:creator>
				<guid>https://godotgamedev.blogix.ir/post/10</guid>
				<slash:comments>0</slash:comments>
			<category>تجربه</category></item><item>
				<title>متغیرهای سراسری و اتولود (autoload) در انجین بازی گودو</title>
				<link>https://godotgamedev.blogix.ir/post/9</link>
				<description><![CDATA[<p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">در هر بازی متغیرها و داده‌هایی وجود داره که میخواید در تمام صحنه‌های بازی بهشون دسترسی داشته باشید. برای این منظور باید از اسکریپت‌هایی استفاده کنید که از همه اسکریپت‌ها و صحنه‌ها قابل دسترسی هستن. به این قابلیت در گودو میگن اتولود (autoload). کاری که باید کنید اینه که یه اسکریپت ایجاد کنید و اون رو اتولود کنید و در اسکریپت‌های دیگه بهش ارجاع میدید. اما چجوری؟</span></p><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">در یه مثال ساده این رو بهتون نشون میدم. </span></p><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">اول از همه یه پروژه جدید ایجاد کنید و یه نود دوبعدی و یه لیبل زیر مجموعه‌اش ایجاد کنید. صحنه رو ذخیره کنید و نام main بهش بدید. این‌کارها رو در آموزش‌های قبلی یاد گرفتید. ساختار صحنه‌تون به این شکل خواهد بود.</span></p><p style="text-align:justify;"> </p><figure class="image"><img src="https://s6.uupload.ir/files/autoload1_xkno.png"></figure><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">میخوایم اسکریپت اتولود رو بسازیم. در بخش filesystem روی res کلیک راست  و بعد گزینه create new و بعد script رو انتخاب کنید.اسمشو بذارید General یعنی عمومی یا سراسری. </span></p><figure class="image"><img src="https://s6.uupload.ir/files/autoload2_3in2.gif"></figure><p>حالا اسکریپت جنرال رو میخوایم اتولود کنیم. از مسیرsetting و بعد project setting، تب autoload رو انتخاب میکنیم. برای اضافه کردن اسکریپت به اتولود روی آیکون فولدر کلیک میکنیم، اسکریپت General رو انتخاب میکنیم و open  رو کلیک میکنیم. در نهایت سمت راست صفحه دکمه Add رو میزنیم تا اسکریپت به لیست اضافه بشه. </p><figure class="image"><img src="https://s6.uupload.ir/files/autoload3_tzvm.gif"></figure><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">برای نشون داده استفاده از اتولود، به نود سرشاخه یه اسکریپت اضافه کنید. دقت کنید که حالا در کل پروژه 2 تا اسکریپت داریم. </span></p><figure class="image"><img src="https://s6.uupload.ir/files/autoload4_5h8.png"></figure><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">توی این قسمت میخوایم داخل اسکریپ General یه متغیر ساده اضافه کنیم تا بتونیم توی اسکریپت main ازش استفاده کنیم و متن اون رو توی لیبل نشون بدیم. اینجا میخوام نحوه تایپ و کدنوشتن هم بهتون نشون بدم. گاهی اوقات وقتی بخشی از کلمه رو تایپ میکنید، برنامه به شما کلمه رو پیشنهاد میده و با کلید Enter میتونید انتخابش کنید. یه متغیر به نام text میسازم و مقدارشو (متنشو) میذارم "General text". متنها همیشه در کدنویسی گودو بین دوتا علامت </span><span style="color:hsl(0,75%,60%);font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;"><u>"</u></span><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;"> قرار میگیرن.  </span></p><figure class="image"><img src="https://s6.uupload.ir/files/autoload5_rilg.gif"></figure><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">حالا توی اسکریپت main از متغیری که توی اسکریپت general هست استفاده میکنیم. دقت کنید که هر چندتا اسکریپت دیگه هم داشتیم و حتی اگه  در صحنه های دیگه هم بودن، میتونستیم به متغیرهای General دسترسی داشته باشیم. </span></p><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">کاری که توی این کد انجام میشه اینه که در فانکشن یا تابع ready ، به لیبل ارجاع میدم و متنشو برابر با متن متغیر text  از اسکریپت general  میکنم.( تابع ready یکی از تابع های پیش ساخته گودوئه و هر اسکریپتی در شروع صحنه، تابع ready رو اجرا میکنه. )</span></p><figure class="image"><img src="https://s6.uupload.ir/files/autoload6_h061.gif"></figure><p style="text-align:justify;">ا<span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">گه دقت کنید از </span><span style="color:hsl(0,75%,60%);font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;"><u>str</u> </span><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">استفاده کردم. این تابع تبدیل به رشته یا متنه. وقتی میخواید یه مقدار عددی رو جایی نمایش بدید یا به متن تبدیل کنید، یا وقتی که میخواید متغیری رو در لیبل نمایش بدید، عادت کنید که از این تابع استفاده کنید، در غیر این صورت با پیام خطا روبرو میشید. General.text درواقع همون متغیریه که توی اسکریپت جنرال بود. </span></p><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">در نهایت وقتی صحنه رو اجرا کنیم، داخل لیبل متن General text نشون داده میشه. </span></p><figure class="image"><img src="https://s6.uupload.ir/files/autoload7_rgzd.gif"></figure><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">فایده اتولود اینه که شما رو از دوباره‌کاری بی نیاز میکنه. فرض کنید 10 تا صحنه داشتید که میخواستید اون متن رو توی همشون نشون بدید. باید در هر 10 تا صحنه متغیری میساختید. ولی با این روش یک بار نوشتید و میتونید 10 بار یا بیشتر استفاده کنید. </span></p><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">درآخر کدها رو میذارم تا داشته باشید.</span></p><figure class="image"><img src="https://s6.uupload.ir/files/autoload8_45y6.png"></figure><p>...</p><figure class="image"><img src="https://s6.uupload.ir/files/autoload9_evcn.png"></figure>]]></description>
				<pubDate>Thu, 01 Jan 2026 04:01:19 +0330</pubDate>
				
				<comments>https://godotgamedev.blogix.ir/post/9/comment</comments>
				<dc:creator>danial abdl</dc:creator>
				<guid>https://godotgamedev.blogix.ir/post/9</guid>
				<slash:comments>0</slash:comments>
			<category>آموزش</category><category>مبتدی</category></item><item>
				<title>تبدیل هر نودی به قابل کلیک و لمس در گودو با یک ترفند ساده</title>
				<link>https://godotgamedev.blogix.ir/post/8</link>
				<description><![CDATA[<p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">اگه بخواید توی بازیتون چیزی قابل کلیک کردن و لمس کردن باشه، ولی الزاما ظاهر دکمه نداشته باشه، از چه روشی استفاده میکنید؟ توی گودو دکمه های مختلفی هست. Button، texture Button و ... انواع دکمه ها هستن. ولی هرکدوم قابلیت و محدودیت خودشون رو دارن. توی ساخت بازی زیاد پیش میاد که میخواید یه چیزی مثل یه متن پیام ساده، یه اسپرایت، یا حتی کامپوننت های پیچیده تری که ساختید، مثل دشمن ها، آبجکت ها قابل کلیک  یا لمس باشن و با کلیک روی اون انتظار دارید، اتفاقی بیفته. برای این کار روش های مختلفی هست که بعضی هاش پیچیده ترن. اما من اینجا یه روش ساده و کاربردی بهتون یاد میدم.</span></p><h4 style="text-align:justify;">مطالبی که توی این آموزش پوشش داده میشه:</h4><ol><li style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;font-size:16px;">معرفی نود Label</span></li><li style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;font-size:16px;">استفاده از سیگنال‌ها</span></li><li style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;font-size:16px;">معرفی ویژگی modulate برای تغییر رنگ و شفافیت</span></li></ol><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;font-size:16px;"><strong>کاری که انجام میدیم به طور خلاصه اینه: یک لیبل میسازیم و زیر مجموعه‌اش یه Button اضافه میکنیم. شفافیت button رو صفر میکنیم تا نامرئی بشه. بعد سیگنال pressed دکمه رو به لیبل متصل میکنیم و در فانکشن کلیک روی دکمه، متن رو ناپدید میکنیم. </strong></span></p><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;font-size:16px;">مثل همیشه با یه صحنه جدید شروع میکنیم. ولی این بار به جای 2D scene، این بار Other node رو انتخاب میکنیم. این بار میخوایم به جای یک صحنه کامل، یه کامپوننت یا آبجکتی بسازیم که داخل هر صحنه ای قابل استفاده است. روند کار فرقی نمیکنه. </span></p><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;font-size:16px;">برای ایجاد صحنه جدید یا از منوی scene، گزینه new scene رو انتخاب کنید یا از بخش file system، کلیک راست کنید و create new و بعد scene رو انتخاب کنید. وقتی میخواید نود سرشاخه رو انتخاب کنید، روی other node کلیک کنید:</span></p><figure class="image"><img src="https://s6.uupload.ir/files/everythingbutton1_u8i6.gif"></figure><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">از صفحه باز شده، Label رو پیدا کنید و انتخاب کنید. حالا نود سرشاخه یه Label ئه. این نود برای نمایش متن به کار میره. فرض کنید میخواید به کاربر پیامی نشون بدید که به راحتی هم ناپدید بشه. </span></p><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">حالا نود label رو انتخاب کنید و از تب inspector در سمت راست، در قسمت Text، به فارسی بنویسید: "کلیک کن تا ناپدید بشم".</span></p><blockquote><p style="text-align:center;"><span style="background-color:hsl(0,0%,90%);font-family:Arial, Helvetica, sans-serif;font-size:20px;"><strong> از بهترین قابلیت‌های گودو پشتیبانی فوق‌العاده خوب از زبان فارسیه.  </strong></span></p></blockquote><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;"> و بعد پایین تر برید و از Theme override و بعد font size فونت در به 30 تغییر بدید تا متن بزرگتر بشه.</span></p><figure class="image"><img src="https://s6.uupload.ir/files/everythingbutton2_o7jh.gif"></figure><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">با کلیک روی نود label، گزینه add child رو کلیک میکنیم و یه Button زیر مجموعه لیبل اضافه میکنیم. توی صحنه اندازه button رو با اندازه لیبل برابر میکنیم.</span></p><figure class="image"><img src="https://s6.uupload.ir/files/everythingbutton3_b0v1.gif"></figure><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">قدم بعدی اینه که دکمه رو نامرئی کنیم. بعد از انتخاب دکمه، از اینسپکتور قسمت visibility رو باز میکنیم . روی modulate کلیک میکنیم. modulate بخشیه که رنگ و شفافیت نود رو مشخص میکنه. ما نمیخوایم رنگ رو تغییر بدیم، بلکه میخوایم شفافیت رو 0 کنیم. یعنی کاملا نامرئی. قسمت modulate، چهار تا اسلایدر داره که سه تای اولی برای رنگ و آخری برای شفافیته. آخری رو میگیریم و میکشیم تا به 0 برسه. خواهید دید که دکمه کاملا نامرئی میشه. همون چیزی که میخواستیم. </span></p><figure class="image"><img src="https://s6.uupload.ir/files/everythingbutton4_6zas.gif"></figure><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">حالا به نود label یه اسکریپت اضافه میکنیم و سیگنال pressed از دکمه رو به label متصل میکنیم. اینها رو توی آموزش‌های قبلی توضیح دادم و توی تصویر هم مشاهده میکنید.</span></p><figure class="image"><img src="https://s6.uupload.ir/files/everythingbutton5_20ru.gif"></figure><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">اینجای کار به یه خط کد نیاز داریم. کدی که میگه با کلیک روی دکمه، لیبل ناپدید بشه. برای این کار از visible استفاده میکنیم. visible که قابل دیدن بودن یه نود رو مشخص میکنه، یه متغیر از نوع boolean هست که دو حالت true و false داره. صحیح و غلط. این نوع متغیر حالت صفر و یک داره. بودن و نبودن و بسیار بسیار کابردی هستن. اینجا ما visible رو false میکنیم تا لیبل دیگه قابل مشاهده نباشه. </span></p><figure class="image"><img src="https://s6.uupload.ir/files/everythingbutton6_uvtd.png"></figure><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">بیاید نتیجه کار رو ببینیم.</span></p><figure class="image"><img src="https://s6.uupload.ir/files/everythingbutton7_o1jf.gif"></figure><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">این ترفند خیلی کاربردیه. توی بازی ای که خودم ساختم ازش استفاده کردم. این ترفند شما رو از کلی دردسر راحت میکنه. با این کار به راحتی هر چیزی رو توی بازی میتونید قابل کلیک و لمس (مناسب بازی‌های موبایلی) میکنه. فکر کنید توی چه بازی هایی میتونید ازش استفاده کنید؟</span><span style="color:hsl(0,75%,60%);font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;"><strong> فرض کنید یه بازی دارید که توی اون، در یه زمان مشخص باید هر چقدر میتونید سنگ طلا جمع کنید و اگه روی دینامیت‌ها کلیک کنید جون از دست میدید. اگه روی 3 تا دینامیت کلیک کنید میبازید.</strong></span><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;"> این جا با این ترفند همه طلاها و دینامیت ها رو قابل کلیک و لمس کنید و بازی خودتون رو بسازید. اگه این تمرینو انجام دادید بهم بگید. موفق باشید. </span></p>]]></description>
				<pubDate>Sat, 28 Feb 2026 00:41:03 +0330</pubDate>
				
				<comments>https://godotgamedev.blogix.ir/post/8/comment</comments>
				<dc:creator>danial abdl</dc:creator>
				<guid>https://godotgamedev.blogix.ir/post/8</guid>
				<slash:comments>0</slash:comments>
			<category>آموزش</category><category>مبتدی</category><category>رابط کاربری (UI)</category></item><item>
				<title>معرفی نود تایمر (timer) با یک مثال ساده ( و فقط سه خط کد)</title>
				<link>https://godotgamedev.blogix.ir/post/7</link>
				<description><![CDATA[<p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">سلام. امروز با یه درس مهم و باحال اومدم. میخوام نود تایمر (timer) رو بهتون معرفی کنم و یه مثال ساده هم بهتون نشون بدم تا مطلب براتون جا بیفته. تایمر یه ابزار خیلی مهمه و توی همه انجین‌های بازی سازی به نوعی وجود داره. حالا ممکنه اسمش چیز دیگه ای باشه. </span></p><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">چیزی که تا آخر این درس انجام میدیم اینه که در صحنه ما، یک اسپرایت وجود داره که هر  1 ثانیه، موقعیت مکانیش در محور افقی (x) به اندازه 128 واحد اضافه میشه و تغییر میکنه(به سمت مثبت محور x). به این شکل:</span></p><figure class="image image_resized" style="width:76.15%;"><img src="https://s6.uupload.ir/files/timer_intro8_b077.gif"></figure><p style="text-align:center;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;"> </span><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;font-size:14px;">به اندازه کافی انگیزه گرفتید که شروع کنیم؟!</span></p><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">سعی کردم که این مطلب بر پایه چیزهایی باشه که قبلا بهتون گفتم تا زیاد سردرگم نشید و راحت متوجه بشید. این درس یه مقدار خیلی کمی کدنویسی داره.( <i>من این جا برای این که تمام زیر و بم کدنویسی با gd script رو بهتون بگم محدودیت دارم. ولی تلاش میکنم هر کدی که استفاده میکنم رو خوب توضیح بدم</i>). <strong>لازمه بگم که من دارم از گودو ورژن 4.1 استفاده میکنم.</strong></span></p><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">شروع میکنیم. یه پروژه جدید ایجاد کنید. یه نود دوبعدی به عنوان سرشاخه ایجاد کنید و با کلیک راست و گزینه add child node دوتا نود ایجاد کنید. اولین نود، timer ئه و دومی sprite2D. فعلا فقط نودها رو اضافه کنید. و در ادامه به نود node2D </span><a href="https://godotgamedev.blogix.ir/post/6/%D8%A2%D8%B4%D9%86%D8%A7%DB%8C%DB%8C-%D8%A8%D8%A7-%D8%B3%DB%8C%DA%AF%D9%86%D8%A7%D9%84-%D9%87%D8%A7-%D8%AF%D8%B1-%D8%A7%D9%86%D8%AC%DB%8C%D9%86-%DA%AF%D9%88%D8%AF%D9%88" target="_blank"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">همونجور که یاد گرفتید</span></a><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">(با دکمه ای که بالای صفحه علامت مثبت سبز داره) یک اسکریپت اضافه کنید. وقتی اسکریپت اضافه میکنید، کنار نود node2D یه علامت کاغذ اضافه میشه. کلیت پروژه این شکلی میشه:</span></p><figure class="image image_resized" style="width:76.31%;"><img src="https://s6.uupload.ir/files/timer_intro_1_ocbo.gif"></figure><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">حالا میخوایم وارد قسمت کدنویسی بشیم. کاری نداره. از بالای صفحه میتونید تب script رو انتخاب کنید. یه راه دیگه هم اینه که روی علامت کاغذ کنار نود node2D کلیک کنید تا قسمت اسکریپت نویسی باز بشه.</span></p><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">اینجا دو خط کد به اسکریپت اضافه می‌کنیم.لازمه توضیح بدم که وقتی که ما نودهایی رو به زیرمجموعه نودی اضافه میکنیم، میتونیم در اسکریپت اون نود سرشاخه (والد)، به نودهای زیرمجموعه یا فرزند ارجاع بدیم، برای این که بتونیم بهشون دسترسی داشته باشیم، دستکاری کنیم و ازشون استفاده کنیم. توی این دو خط کد، من به دوتا نود فرزند، یعنی تایمر و اسپرایت ارجاع دادم و از هر کدومشون یه متغیر ساختم. ببینید، بعد همه چیزو توضیح میدم.</span></p><figure class="image image_resized" style="width:84.57%;"><img src="https://s6.uupload.ir/files/timer_intro2_yqx4.png"></figure><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">به طور کامل توضیح میدم. کلیدواژه </span><span style="color:hsl(0,75%,60%);font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;"><strong><u>var</u> </strong></span><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">وقتی استفاده میشه که میخوایم یه متغیر جدید تعریف کنیم. حالا میخواد یه متغیر عددی باشه یا متنی یا یه نود باشه. درست بعد از var یه اسم دل به خواهی میاد. من گذاشتم timer و my_sprite. بعد علامت مساوی میاد که اون ور مساوی میخوایم بگیم متغیرهای ما چی هستن. دقت کنید که علامت </span><span style="color:hsl(0,75%,60%);font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;"><u>$</u></span><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;"> اومده و بعدش اسم نودهای ما. علامت $ وقتی میاد که میخوایم به زیرمجموعه های یه نود دسترسی پیدا کنیم. معمولا وقتی علامت $ رو بزنید و حرف اول نود رو وارد کنید (مثلا t)، اسم نودها به صورت پیشنهادی برای شما ظاهر میشه و میتونید انتخاب کنید. یه کلمه و علامت دیگه که استفاده شده </span><span style="color:hsl(0,75%,60%);font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;"><u>onready@</u></span><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;"> ئه. این کلمه هم برای ارجاع دادن به نودها معمولا استفاده میشه و داره میگه وقتی که صحنه اجرا شد، منتظر بمون تا نود موردنظر لود بشه(و اگه بلافاصله لود نشده بود، به من پیغام خطا نده).</span></p><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;"><strong>پس ما این جا دوتا متغیر تعریف کردیم و به دوتا نود فرزند ارجاع دادیم. همین. حالا توی این اسکریپت بهشون دسترسی داریم.</strong></span></p><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">قدم بعدی اینه که تایمر رو تنظیم کنیم که در شروع صحنه به طور خودکار استارت بشه. <strong><u>اساسا تایمر، یه نوده  که یه زمان شمارش معکوس داره و وقتی اون زمان به آخر میرسه یعنی timeout اتفاق میفته، سیگنال timeout ارسال میشه و شما میتونید کاری که میخواید رو انجام بدید</u> </strong>و تایمر کاربردهای مختلف و زیادی داره. تایمر سه تا گزینه اولیه مهم داره، زمان (wait time) که به طور پیش فرض روی 1 ثانیه است. گزینه one shot ، یعنی فقط یک بار اجرا بشه و تمام. اگر one shot رو انتخاب نکنید، تایمر تا ابد تکرار میشه، یعنی وقتی به آخر رسید دوباره شروع میشه. گزینه auto start که یعنی خودبخود شروع بشه و لازم نباشه بهش دستور شروع بدی. چیزی که ما ین جا لازم داریم auto start ئه. </span></p><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">پس تایمر رو انتخاب کنید و در قسمت inspector، گزینه auto start رو تیک بزنید. </span></p><figure class="image"><img src="https://s6.uupload.ir/files/timer_intro3_pfih.png"></figure><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">اگه </span><a href="https://godotgamedev.blogix.ir/post/6/%D8%A2%D8%B4%D9%86%D8%A7%DB%8C%DB%8C-%D8%A8%D8%A7-%D8%B3%DB%8C%DA%AF%D9%86%D8%A7%D9%84-%D9%87%D8%A7-%D8%AF%D8%B1-%D8%A7%D9%86%D8%AC%DB%8C%D9%86-%DA%AF%D9%88%D8%AF%D9%88" target="_blank"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">قسمت قبل</span></a><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;"> رو دیده باشید، این بخش باید براتون تکراری باشه. میخوایم سیگنال timeout تایمر رو به نود node2D وصل کنیم. انتخاب نود تایمر، رفتن به قسمت node، و بعد signals و  بعد دابل کلیک روی timeout  و در نهایت انتخاب نود node2D از پنجره باز شده و کلیک روی connect. </span></p><figure class="image"><img src="https://s6.uupload.ir/files/timer_intro4_rke4.gif"></figure><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">خواهید دید که فانکشن on timer timeout در اسکرپت node2D ساخته میشه. </span></p><figure class="image"><img src="https://s6.uupload.ir/files/timer_intro5_66gf.png"></figure><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">در حال حاضر کلمه </span><span style="color:hsl(0,75%,60%);font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;"><u>pass</u></span><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;"> نوشته شده و معنیش اینه که انجین این قسمت رو نادیده بگیره و ازش عبور کنه. یادتون باشه که شما در گودو نمیتونید همینجوری یه تابع بسازید و خالیش بزارید. باید از کلمه pass استفاده کنید. ما این pass رو پاک میکنیم و جاش کدی مینویسیم که اسپرایت رو حرکت بده.</span></p><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">یه کار کوچولوی دیگه انجام بدید. توی صحنه، اسکریپت رو بگیرید و بیاریدش جایی که به خوبی و کامل دیده بشه. </span></p><figure class="image"><img src="https://s6.uupload.ir/files/timer_intro6_iful.gif"></figure><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;"> و حالا قدم آخر. توی فانکشن یا تابع on timer timeout این کد رو بنویسید. (متاسفانه به دلیل این که وقتی کد رو مستقیم توی این وبلاگ مینویسم چینشش به هم میخوره، ناچار شدم عکس کدها رو بذارم).</span></p><figure class="image"><img src="https://s6.uupload.ir/files/timer_intro7_q2ne.png"></figure><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">این خط ساده داره میگه به مکان x اسپرایت، 128 واحد اضافه کن. این کد هر ثانیه یک بار اجرا میشه و هر بار 128 تا به x اضافه میشه.</span></p><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">توی gd script با استفاده از نقطه به ویژگیها و اجزاء یه متغیر دسترسی پیدا میکنیم. این جا  x از position اسپرایت رو گرفتیم و با علامت += گفتیم که مقدار 128 به هر مقداری که الان هست اضافه بشه. این کد معادل my_sprite.position.x = my_sprite.position.x + 128 ئه که کوتاهتر شده.خوب اینم از این</span></p><figure class="image"><img src="https://s6.uupload.ir/files/timer_intro8_b077.gif"></figure><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">توی این مطلب به تایمر و نحوه استفاده ازش آشنا شدید. لطفا توی نظرات بهم بگید که خوشتون اومد یا نه، سخت بود یا آسون. کنجکاو و موفق باشید.</span></p><p> </p>]]></description>
				<pubDate>Sat, 03 Jan 2026 16:21:30 +0330</pubDate>
				
				<comments>https://godotgamedev.blogix.ir/post/7/comment</comments>
				<dc:creator>danial abdl</dc:creator>
				<guid>https://godotgamedev.blogix.ir/post/7</guid>
				<slash:comments>0</slash:comments>
			<category>آموزش</category><category>مبتدی</category></item><item>
				<title>آشنایی با سیگنال‌ها در انجین گودو</title>
				<link>https://godotgamedev.blogix.ir/post/6</link>
				<description><![CDATA[<p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">مفاهیمی که در این مطلب پوشش داده میشن:</span></p><ul><li><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">معرفی نود button</span></li><li><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">نحوه ایجاد و اتصال یک اسکریپت به یک نود</span></li><li><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">نحوه ایجاد یه سیگنال و اتصال به یک نود دیگر</span></li></ul><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">سیگنال‌ها در انجین گودو مفهوم و ابزار مهمی هستن. حتی انجین‌های دیگه بازی سازی و حتی نرم‌افزارهای دیگه برنامه نویسی هم به نوعی از سیگنال‌ها استفاده میکنن. فقط اسم‌های متفاوتی دارن.سیگنال‌ها اونقدر در ساخت بازی مهم هستند که تقریبا میشه مطمئن بود هیچ بازی ای ساخته نمیشه مگه اینکه در اون از سیگنال‌ها استفاده بشه. حالا این سیگنال چی هست؟! من سعی میکنم در این مطلب مفهوم اون رو جا بندازم و با یه مثال ساده روش استفاده از اون رو بهتون نشون بدم.</span></p><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">سیگنال در گودو، نوعی پیامه که از یک بخش به بخش دیگه ارسال میشه و وقوع یه رویداد رو اطلاع میده. سیگنال ها به رویدادها مرتبط هستن. برای مثال، وقتی وقتی یه تایمر، زمانش به آخر میرسه یا وقتی یه دکمه فشرده میشه یه رویداد رخ داده یا یه اتفاق افتاده. توی گودو هر نود دارای چند سیگنال پیشفرضه که هر کدوم یه اتفاق رو درباره اون نود مخابره میکنن به نود دیگه، هر نودی که شما بخواید. در واقع سیگنال‌ها یه فرستنده دارن و یه گیرنده. در آینده وقتی کاملا با سیگنال‌ها آشنا شدید، خواهید دید که قابلیت‌های خیلی زیادی دارن و تقریبا هر رویدادی، حتی تغییر یه متغیر میتونه یه سیگنال باشه. </span></p><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">من در این مطلب، میخوام یک دکمه ایجاد کنم، و سیگنال فشرده شدن دکمه رو به نود والدش وصل کنم، به این معنی که هر وقت دکمه فشرده میشه یه اتفاقی بیفته. تو این مطلب هنوز از کدنویسی خبری نیست و فقط اتصال سیگنال رو بهتون نشون میدم.</span></p><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">حالا شروع کنیم. یه پروژه گودو ایجاد کنید. قبلا یاد گرفتید. و یه نود دوبعدی و یه صحنه دوبعدی ایجاد کنید. روی node2D کلیک راست و گزینه add child node رو انتخاب کنید. از میون نودها Button رو انتخاب کنید. button یه دکمه سادست که معمولا یه متن روش داره.</span></p><figure class="image"><img src="https://s6.uupload.ir/files/signal_intro_1_ci23.png"></figure><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">بیاید نگاهی به سیگنال‌های button بندازیم. در سمت راست برنامه گودو یه تب به اسم node هست و زیر مجموعه اون یه تب دیگه به اسم signals. (یه تب دیگه به اسم group هم هست که بعدا توضیح میدم). از سمت چپ تصویر توی تب scene، button رو انتخاب کنید و بعد سمت راست، از تب نود، signal رو انتخاب کنید.</span></p><figure class="image"><img src="https://s6.uupload.ir/files/signal_intro_2_sda7.gif"></figure><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">می‌بینید که دکمه یا button تعدادی سیگنال داره، وقتی دکمه پایینه، وقتی دکمه بالاست، وقتی دکمه فشرده شده، وقتی دکمه رها شده و ...</span></p><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">یه نکته مهم هست و اون اینه که وقتی میخواید از سیگنال استفاده کنید، نیاز میشه که کدنویسی انجام بدید و به اسکریپت نیاز هست. در واقع نودی که قراره سیگنال بهش وصل بشه، باید حتما یه اسکریپت داشته باشه. حالا میخوایم به نود والد که node2D هست یه اسکریپت اضافه کنیم.</span></p><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">وقتی روی نود در تب scene کلیک میکنیم، بالای تب یه دکمه با یه اضافه سبز ظاهر میشه. کار این دکمه اضافه کردن و اتصال یه اسکریپت به نود انتخاب شدست. روی اون دکمه کلیک کنید:</span></p><figure class="image"><img src="https://s6.uupload.ir/files/signal_intro_3_3pft.gif"></figure><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">بلافاصله یه پنجره باز میشه که از طریق اون یه اسکریپت ایجاد میکنید. این پنجره گزینه هایی داره که الان وقت توضیح دادنش نیست. وقتی این رو بگم که وقتی برای یه نود اسکریپت ایجاد میکنید به طور پیشفرض اسکریپتی مناسب همون نود ساخته میشه مگر اینکه شما چیز دیگه ای بخواید. نگرااز پنجره باز شده گزینه create رو بزنید.</span></p><figure class="image"><img src="https://s6.uupload.ir/files/signal_intro_4_pjao.gif"></figure><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">دقت کنید که الان کنار node2D ما در تب scene، یه آیکون طومار یا کاغذ ظاهر شد. این یعنی نود مورد نظر دارای اسکریپت است. حالا وقتشه که سیگنال button رو به node2D وصل کنیم( یا از button به node2d یه پیام مخابره کنیم).</span></p><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">همون طور که بهتون نشون دادم button  رو انتخاب کنید. به بخش سیگنالها برید. سیگنال ()pressed رو انتخاب کنید و روی اون دابل کلیک کنید. یه پنجره باز میشه که اونجا باید نود Node2D  رو انتخاب کنید و دکمه connect رو کلیک کنید.</span></p><figure class="image"><img src="https://s6.uupload.ir/files/signal_intro_5_ji28.gif"></figure><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">تموم شد. سیگنال متصل شد. حالا اگه button رو انتخاب کنید و به قسمت سیگنالها برید خواهید دید که کنار سیگنال pressed یه فلش سبز هست که نشون میده سیگنال به جایی وصله. </span></p><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">حالا توجهتونو به این قسمت جلب میکنم. یه صفحه برای شما باز میشه که اسکریپت مربوط به نود Node2D ست و یه تابع یا فانکشن توش هست به اسم</span></p><pre><code class="language-python">func _on_button_pressed():
	pass #replace with function body.</code></pre><p style="text-align:justify;"> </p><figure class="image"><img src="https://s6.uupload.ir/files/signal_intro_6_awi.png"></figure><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">میخوام به چند چیز دقت کنید. بالای صفحه از تب 2D به script جابجا شدیم. وارد محیط اسکریپت نویسی شدیم و اسکریپت نود Node2D برامون باز شده.توی اون قسمت کد که هایلایت کردم کدی رو مینویسید که وقتی روی دکمه button کلیک میکنید میخواید اجرا بشه. </span></p><p style="text-align:justify;"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">خوب الان در آستانه شروع کدنویسی هستیم.در مطالب آینده نکته هایی در باره کدنویسی گودو بهتون خوام گفت. </span></p><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">سیگنال‌ها اهمیت زیادی دارن. سعی کنید خوب یادش بگیرید. </span></p><p> </p><p> </p><p> </p><p> </p>]]></description>
				<pubDate>Wed, 04 Feb 2026 14:38:17 +0330</pubDate>
				
				<comments>https://godotgamedev.blogix.ir/post/6/comment</comments>
				<dc:creator>danial abdl</dc:creator>
				<guid>https://godotgamedev.blogix.ir/post/6</guid>
				<slash:comments>2</slash:comments>
			<category>آموزش</category><category>مبتدی</category></item><item>
				<title>چند اصطلاح رایج بازی سازی با انجین گودو</title>
				<link>https://godotgamedev.blogix.ir/post/5</link>
				<description><![CDATA[<p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">امروز میخوام چند اصطلاح رایج که توی بازی سازی به کار میره براتون به طور کاربردی توضیح بدم. توی همین بلاگ در آینده از این اصطلاح ها بیشتر استفاده میشه. </span></p><ul><li>UI<span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;"><strong> یا رابط کاربری:</strong> اجزا و لایه ای از بازی که انسان از طریق اون با بازی شما ارتباط برقرار میکنه. دکمه ها، متن هایی که اطلاعاتی رو از طریق اونها به کاربر نشون میدید، چک باکس ها، نوارهای پیشرفت و... شامل رابط کاربری میشن. توی انجین گودو، معمولا نودهای رابط کاربری به رنگ سبز هستند و زیر مجموعه نود control قرار دارن. </span></li><li><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;"><strong>گیم دیزاین (Game design):</strong> قبل از این که هیچ کدی نوشته باشه، هیچ آرتی برای بازی ساخته بشه و هیچ بازی قابل بازی ای وجود داشته باشه، بازی از روی یک ایده اولیه طراحی میشه، یعنی درباره همه چیز بازی فکر میشه، از سبک آرت، تا سبک خود بازی، مراحل، داستان، رابط کاربری، مدت زمان بازی و هر جزئیاتی که برای ساخت بازی لازمه. تا این حد بگم که تصمیم گیری در این باره که وقتی بازیکن دکمه حرکت رو فشار میده، موقعی که دستشو روی دکمه میذاره بهتره حرکت شروع بشه یا موقعی که دستشو از روی دکمه برمیداره؟ کدوم برای بازی شما مناسبتره؟ معمولا این جزئیات نوشته میشه و بهتر هم هست که نوشته بشه. ولی ممکنه توی ذهن شما باشه. لازمه اینو بگم که فرایند طراحی بازی یه فرایند چرخه ماننده و این طور نیست که از نقطه صفر شروع کنید و به نقطه صد برسید. خیلی وقتها لازمه برگردی و چیزی که قبلا طراحی کنی تغییر بدی و بعضی چیزها در حین کار مشخص میشه. </span></li><li><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;"><strong>اسکریپت و اسکریپت نویسی: </strong>همون بخش برنامه نویسی بازی سازیه. توی انجین گودو، به یه قطعه کد میگن اسکریپت که با پسوند "gd." ذخیره میشه و اسکریپت، معمولا به یه نود متصل میشه و یه مجموعه از کارها رو انجام میده. به طور معمول اسکریپت ها توی گودو یا به زبان gd script هستند یا سی شارپ (#c).</span></li><li><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;"><strong>نود (Node) :</strong> قبلا توضیح دادم، نود مفهوم مهمی توی انجین گودوست. هر آبجکت یا قطعه یا موجودیتی توی بازی شما از اجزائی ساخته شده. مثلا اگه کاراکتری دارید که راه میره، تصویر کاراکتر یا اسپرایت یه جزءاونه، بخشی که انیمیشن کاراکترو کنترل میکنه، یه جزئه، بخش شناسایی برخورد با زمین و چیزهای دیگه یه جزئه، به هر کدوم از اینها میگن یک نود. </span></li></ul><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">اصطلاحات خیلی بیشتری وجود داره ولی این چندتا برای شروع و توی مطالب آینده لازم بود.</span></p>]]></description>
				<pubDate>Fri, 06 Feb 2026 16:39:31 +0330</pubDate>
				
				<comments>https://godotgamedev.blogix.ir/post/5/comment</comments>
				<dc:creator>danial abdl</dc:creator>
				<guid>https://godotgamedev.blogix.ir/post/5</guid>
				<slash:comments>0</slash:comments>
			<category>آموزش</category><category>عمومی</category></item><item>
				<title>ایجاد یک پروژه جدید در گودو و قدم های اول</title>
				<link>https://godotgamedev.blogix.ir/post/4</link>
				<description><![CDATA[<p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">سلام به همه بازی سازهای با انگیزه</span></p><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">توی این پروژه قصد دارم یه موضوع ابتدایی و مهم رو بهتون آموزش بدم. ایجاد یک پروژه جدید در انجین گودو و اولین کارهایی به طور معمول باید انجام داد و توصیه من اینه که به این روش عمل کنید.</span></p><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">فرض کنیم گودو رو دانلود کردید و اون رو باز میکنید. اولین چیزی که جلوی شما ظاهر میشه اینه:</span></p><figure class="image"><img src="https://s6.uupload.ir/files/newproject1_s6e1.png"></figure><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">این جا میتونید پروژه های خودتون رو مدیریت کنید و پروژه جدید ایجاد و چند کار دیگه هم میتونید انجام بدید که در درسهای آینده بهشون میپردازیم.</span></p><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">الان میخوایم یه پروژه جدید ایجاد کنیم. روی گزینه new project کلیک کنید. حالا پنجره ای به این شکل ظاهر میشه:</span></p><figure class="image"><img src="https://s6.uupload.ir/files/newproject2_h4k5.png"></figure><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">به قسمت های های هایلایت شده دقت کنید. میتونید خیلی ساده دکمه create folder رو بزنید و بعد پایین صفحه دکمه create &amp; edit رو بزنید و پروژه رو بسازید. اما من پیشنهاد میکنم کار بهتری کنید. </span></p><p><i><strong>توصیه من به شما اینه که حتما توی کامپیوتر خودتون یک فولدر داشته باشید به اسم "پروژه های گودو" یا "Godot projects" یا هر اسمی مشابه این ها. هدف اینه که همه پروژه هاتون یک جا جمع بشن و سردرگم نشید. نظم یک عنصر خیلی مهم توی کار بازی سازیه.</strong></i> </p><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">رو گزینه browse کلیک کنید.</span></p><figure class="image"><img src="https://s6.uupload.ir/files/newproject3_k3ab.png"></figure><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">درایو مورد نظر رو انتخاب کنید. و در مکانی که مناسب میدونید، فولدر برای مثال Godot projects رو باز کنید. داخل اون فولدر یک فولدر دیگه به نام my project ایجاد کنید و در نهایت گزینه select current folder به معنای انتخاب فولدر فعلی رو انتخاب کنید.</span></p><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">گودو شما به پنجره قبلی برمیگردونه. سمت چپ سه گزینه دارید:</span></p><ul><li><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">+forward</span></li><li><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">mobile</span></li><li><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">compatibility</span></li></ul><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">زیاد شما درگیر تفاوت این سه گزینه نمیکنم. اگه برای کامپیوتر بازی میسازید گزینه اول رو انتخاب کنید. اگه برای موبایل گزینه دوم و اگه با دو گزینه اول مشکل داشتید مثلا با خطا مواجه شدید یا سیستمی که باهاش کار میکنید قدیمیه گزینه سوم یعنی compatibility رو انتخاب کنید. اگر هم تردید دارید گزینه اول رو انتخاب کنید. الان خیلی این موضوع مهم نیست.</span></p><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">خوب، پروژه ایجاد شد. ظاهر برنامه و پروژه در نگاه اول این شکلیه. به قسمت های هایلایت شده دقت کنید:</span></p><figure class="image"><img src="https://s6.uupload.ir/files/newproject4_2840.png"></figure><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">قسمت سمت چپ بالا درخت صحنه یا Scene tree رو به شما نشون میده که فعلا خالیه. سمت چپ پایین هم فایل های پروژه شما رو نشون میده. در حال حاضر فقط یه آیکون یا عکس انجین گودو توش هست. </span></p><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">در این بخش یک توضیح ضروریه. یک پروژه و بازی گودو از صحنه های مختلف تشکیل شده. مثلا صفحه منوی شما یک صحنه یا scene هست. صفحه مراحل یک scene (با تلفظ سین) هست. و هر صحنه از یک سلسله مراتب نود (Node) تشکیل شده. نود رو فعلا اجزاء سازنده در نظر بگیرید. هر صحنه حداقل یک نود به عنوان سرشاخه یا نود اصلی داره. فعلا در همین حد یاد بگیرید. بعدا که بیشتر کار کردید بیشتر متوجه میشید.</span></p><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">نتیجه این حرف ها اینه که الان ما برای این صحنه که جلومون باز شده به یک نود سرشاخه نیاز داریم. 4 تا گزینه داریم. </span></p><ol><li><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">node2d برای ایجاد یک صحنه دوبعدی (برای بازی دوبعدی)</span></li><li><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">node3d برای ایجاد یک صحنه سه بعدی (برای بازی سه بعدی)</span></li><li><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">User Interface برای رابط کاربری مثل منوها، دکمه ها و ...</span></li><li><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">other نودهای دیگر که شامل بالایی ها نیستن</span></li></ol><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">بیاید و گزینه node2d رو انتخاب کنید تا یک صحنه دوبعدی داشته باشید. وقتی که node2d رو انتخاب کنید سلسله مراتب صحنه تون به این شکل میشه:</span></p><figure class="image"><img src="https://s6.uupload.ir/files/newproject5_unma.png"></figure><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">الان در صحنه شما فقط یک نود دوبعدی خالی هست. نود دوبعدی یا node2d معمولا کاربردش همینه که به عنوان سرشاخه باشه و زیر مجموعه هاش ماهیت صحنه رو تعریف کنن. </span></p><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">حالا یک کاری که بهتره انجام بدیم اینه صحنه مون رو ذخیره کنیم. از منو scene و بعد save scene رو انتخاب کنید و یک اسم برای صحنه انتخاب کنید و صحنه رو ذخیره کنید. من اسم main رو برای صحنه خودم گذاشتم:</span></p><figure class="image"><img src="https://s6.uupload.ir/files/newproject6_vzc5.gif"></figure><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">دقت کنید که در قسمت پایینی در file system که فایل ها رو نشون میده، صحنه ما اضافه شده:</span></p><figure class="image"><img src="https://s6.uupload.ir/files/newproject7_a6u4.png"></figure><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">صحنه ها در گودو با پسوند tscn ذخیره میشن.</span></p><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">یک قدم دیگه مونده. پروژه گودو همیشه یه صحنه به عنوان صحنه شروع کننده داره که باید اونو مشخص کنید. الان بالا صفحه سمت راست روی دکمه پلی کلیک کنید. برنامه از شما میخواید که صحنه اول رو انتخاب کنید. شما گزینه select current یعنی انتخاب صحنه فعلی رو انتخاب کنید.</span></p><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">خواهید دید که بعد از چند ثانیه بازیتون اجرا میشه. یک صحنه خاکستری خالی. چقدر هیجان انگیز! بعدا قراره بهترین بازی ها توی این صحنه ساخته بشن.</span></p><p><img src="https://s6.uupload.ir/files/newproject8_2ln1.gif">به این روش پروژه شما ساخته میشه و قدم های اولیه برداشته میشه. سعی کنید به پیشرفت پروژه به طور مرتب پروژه و صحنه های خودتون رو ذخیره کنید تا چیزی از دست نره.</p><p>اگه براتون مفید بود یا نظری داشتید بهم بگید. </p>]]></description>
				<pubDate>Mon, 16 Feb 2026 22:50:47 +0330</pubDate>
				
				<comments>https://godotgamedev.blogix.ir/post/4/comment</comments>
				<dc:creator>danial abdl</dc:creator>
				<guid>https://godotgamedev.blogix.ir/post/4</guid>
				<slash:comments>1</slash:comments>
			<category>آموزش</category><category>مبتدی</category></item><item>
				<title>ساخت یک انیمیشن ساده با نود Animation player</title>
				<link>https://godotgamedev.blogix.ir/post/2</link>
				<description><![CDATA[<p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">توی این پست روش ساده استفاده از نود animation player رو برای ساخت انیمیشن برای اسپرایت ها و اجزاء صحنه بهتون نشون میدم. انیمیشنی که میخوام بسازم، چیزیه که خیلی جاها میشه ازش استفاده کرد. فرض کنید توی بازی یه کلید دارید که کاراکتر میتونه اونو بگیره. ما برای این کلید یه انیمیشن میسازیم که با یه حرکت روون و نرم بالا و پایین بشه و توجه رو جلب کنه.</span></p><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">از این جا شروع میکنیم که یه پروژه خالی ایجاد کردیم. روی نود سرشاخه یا اصلی صحنه کلیک راست میکنیم و add child node رو انتخاب میکنیم.</span></p><figure class="image"><img src="https://s6.uupload.ir/files/animationplayer1_gigo.png"></figure><p>ی<span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">ک پنجره باز میشه که به شما اجازه میده نود مورد نظر خودتون رو انتخاب کنید. ما الان به یک اسپرایت نیاز داریم که همون طور که قبلا گفتم یک عکس ساده دوبعدیه. من از قبل یک فایل png که تصویر یک کلید هست رو به پروژه اضافه کردم. شما میتونید از همون عکس لوگوی گودو که از قبل توی پروژه وجود داره استفاده کنید. </span></p><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">در نوار بالایی پنجره ای که باز شده شروع به تایپ sprite کنید. میبینید که نود اسپرایت رو بهتون نشون میده. اون رو انتخاب کنید.</span></p><figure class="image"><img src="https://s6.uupload.ir/files/animationplayer2_sbq2.png"></figure><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">الان اسپرایت ما هنوز خالیه. یعنی تصویری نداره. پس بیاید از بخش file system، تصویر خودتون رو با موس بکشید روی نود اسپرایت:</span></p><figure class="image image_resized" style="width:35.68%;"><img src="https://s6.uupload.ir/files/animationplayer3_46x.gif"></figure><p>ا<span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">ین جا تصویر کلید رو به اسپرایت دادیم. حالا به همین روش میخوایم یک نود Animation player  به زیر مجموعه اسپرایت اضافه کنیم. در اصطلاح نود انیمیشن پلیر فرزند یا child نود اسپرایت میشه. روی نود اسپرایت کلیک راست کنید و بعد add child node رو بزنید در پنجره ای که باز میشه شروع به تایپ animation player کنید تا نود رو ببینید:</span></p><figure class="image image_resized" style="width:55.92%;"><img src="https://s6.uupload.ir/files/animationplayer4_6u6z.png"></figure><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">حالا باید سلسله مراتب یا درخت نود شما به این شکل باشه:</span></p><figure class="image"><img src="https://s6.uupload.ir/files/animationplayer5_m0a2.png"></figure><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">وقتی که نود انیمیشن پلیر رو انتخاب کنید، پایین صفحه به تب باز میشه که این شکلیه:</span></p><figure class="image"><img src="https://s6.uupload.ir/files/animationplayer6_3ds4.png"></figure><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">ظاهر ساده ای داره ولی خیلی کارها ازش برمیاد!</span></p><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">هنوز هیچ انیمیشنی نداریم. میخوایم یکی اضافه کنیم. به این شکل عمل کنیدو کلیک راست روی دکمه animation و بعد new و یک اسم براش انتخاب کنید. من اسم move گذاشتم:</span></p><figure class="image"><img src="https://s6.uupload.ir/files/animationplayer7_f8cl.gif"></figure><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">الان یک انیمیشن اضافه کردید و میخوام به چند چیز دقت کنید. در تصویر زیر علامتی که دوتا فلش به سمت هم چرخیدن، به معنی تکرار همیشگی یا همون loop یا چرخه است. اگه اون رو بزنید انیمیشنتون وقتی که تموم شد بلافاصله از اول شروع میشه. دکمه ای که به شکل +A است به معنی شروع خودکار یا autoplay است. اگه این روشن باشه با شروع بازی انیمیشن خودبخود اجرا میشه و نیازی به کد نویسی نداره. دکمه add track چیزیه که باهاش خیلی کار دارید. در ادامه توضیح میدم:</span></p><figure class="image"><img src="https://s6.uupload.ir/files/animationplayer8_bcl.png"></figure><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">این جا لازمه یه ذره دقت بیشتری کنید. ما به روش های مختلف میتونیم انیمیشن ایجاد کنیم. وقتی روی Add track کلیک کنید، 6 گزینه ظاهر میشه. من نمیخوام این جا 6 تاش رو توضیح بدم. ما با اولی کار داریم که property track است. پراپرتی در واقع به ویژگی های یک نود میگن. برای مثال position یک نود، یک پراپرتیه، scale یک پراپرتیه، modulate که مربوط به رنگ و شفافیت نوده یک پراپرتیه. حالا توی این درس ما میخوایم یک انیمیشن برای پراپرتی position درست کنیم. به عبارتی میخوایم توی انیمیشن ما پوزیشن یا مکان نود تغییر کنه. </span></p><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">روش add track کلیک کنید. گزینه property track رو انتخاب کنید. یک پنجره باز میشه که توش باید نودی که میخوایم براش انیمیشن بسازیم رو انتخاب کنیم. اسپرایت رو انتخاب میکنیم. بعد باید پراپرتی مورد نظر رو انتخاب کنیم. ما به position نیاز داریم، پس اونو انتخاب میکنیم.</span></p><figure class="image"><img src="https://s6.uupload.ir/files/animationplayer9_3xho.gif"></figure><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">پراپرتی انتخاب شد. حالا باید عملا انیمیشن رو بسازیم. در نوار زمانی که میبینید، در نقطه هایی که میخواید پراپرتی مورد نظر تغییر کنه باید یک فریم کلیدی یا key ایجاد کنید. روی اولین نقطه نوار، یعنی شروع انیمیشن کلیک راست کنید و insert key رو انتخاب کنید:</span></p><figure class="image"><img src="https://s6.uupload.ir/files/animationplayer10_fc19.gif"></figure><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">وقتی کلید رو ساختید، به روی اون کلیک کنید و پنجره ای که در سمت راست انجین باز میشه نگاه کنید. این شکلیه:</span></p><figure class="image"><img src="https://s6.uupload.ir/files/animationplayer11_6a8u.png"></figure><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">این در واقع داره میگه در key که انتخاب کردید(لحظه 0)، x  و y نود برابر با 0 است. </span></p><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">انیمیشن ما به این شکله که در نقطه میانی y نود 10 تا اضافه میشه ( و  اسپرایت کلید، 10 واحد در محور y صفحه میاد پایین) و در پایان انیمیشن دوباره به 0 برمیگرده. حالا به روشی که یاد گرفتید دوتا کلید دیگه در وسط و آخر نوار ایجاد کنید:</span></p><figure class="image"><img src="https://s6.uupload.ir/files/animationplayer12_nzwc.png"></figure><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">کلید یا key وسطی رو انتخاب کنید و در inspector مقدار y رو به 10 تغییر بدید. یه کار دیگه هم کنید. این که نوع حرکت رو از linear به cubic تغییر بدید:</span></p><figure class="image"><img src="https://s6.uupload.ir/files/animationplayer13_b0dv.gif"></figure><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">و :</span><img src="https://s6.uupload.ir/files/animationplayer14_op07.png"><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">تقریبا تموم شده. حالا اگه روی دکمه پلی انیمیشن کلیک کنید باید همچین چیزی رو ببینید:</span></p><figure class="image"><img src="https://s6.uupload.ir/files/animationplayer15_xqj5.gif"></figure><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">دقت کنید که دکمه autoplay و loop که قبلا جاشون رو بهتون گفتم روشن کرده باشید.</span></p><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;"><strong>نکات تکمیلی</strong></span></p><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">انیمیشن ما آمادست. اگر صحنه بازی رو اجرا کنید میبینید که کلید در نقطه 0 بازی در حال حرکته و حتی اگه سعی کنید که اونو به وسط صحنه بیارید وقتی که بازی رو اجرا کنید خواهید دید که بازهم در نقطه 0 است. دلیل این موضوع اینه که هم اسپرایت و هم نود انیمیشن پلیر در صحنه اصلی هستن و مکانشون مطلقه و نسبی نیست. در حالی که ما میخوایم مکان نود انیمیشن نسبت به اسپرایت، نسبی باشه. </span></p><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">چند تا کار مونده. اول روی اسپرایت کلیک کنید و گزینه save branch as scene رو بزنید تا اسپرایت و نود زیر مجوعه اش به صحنه جدا تبدیل بشن. یک اسم براشون انتخاب کنید.</span></p><figure class="image"><img src="https://s6.uupload.ir/files/animationplayer16_0h26.png"></figure><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">حالا همه صحنه ها رو یک بار ذخیره کنید. بعد به صحنه اصلی برید و کلید یا اسپرایت خودتون رو به وسط صحنه اصلی بکشید تا انیمیشن رو به خوبی ببینید. در نهایت چیزی که دارید اینه:</span></p><figure class="image"><img src="https://s6.uupload.ir/files/animationplayer17_13q.gif"></figure><p><span style="font-family:'Lucida Sans Unicode', 'Lucida Grande', sans-serif;">تبریک. راه طولانی ای بود ولی شما موفق شدید.</span></p>]]></description>
				<pubDate>Tue, 17 Mar 2026 04:35:09 +0330</pubDate>
				
				<comments>https://godotgamedev.blogix.ir/post/2/comment</comments>
				<dc:creator>danial abdl</dc:creator>
				<guid>https://godotgamedev.blogix.ir/post/2</guid>
				<slash:comments>0</slash:comments>
			<category>آموزش</category><category>مبتدی</category></item></channel>
	</rss>