بسم الله الرحمن الرحیم
آموزش موتور بازی سازی گودات – بخش سوم – گرافیک
[b]در این بخش چه خواهیم آموخت[/b] - ویژگی های گرافیک دو بعدی در گودات
انجام عملیات های ریاضی برداری ساده
- استفاده از دوربین های دو بعدی
- ساختن یک تایل مپ با تایل ست[ساختن محیط مرحله با مجموعه کاشی های گرافیکی]
- ساختن زمینه پارالاکس(خزنده – توضیح آن داده خواهد شد)
موتو گودات ابزارهای خاص کار روی بازی های دو بعدی دارد. بسیاری از موتورهای بازی سازی از یک روش برای بازی های دو بعدی و سه بعدی استفاده می کنند و این در حالی است که برهی از مفاهیم و موضوعات دو بعدی در سه بعدی و بالعکس وجود ندارد. ساز و کار های دو بعدی و سه بعدی از همین گونه مفاهیم هستند. در بازی سه بعدی شما یک جهان سه بعدی برای کاوش دارید و موقعیت اشیاء در این جهان مهم است در حالیکه در بازی دو بعدی شما تنها و تنها صفحه نمایش را دارید و رویش کار می کنید.
در این بخش شما یاد می گیرید که چطور با گرافیک های دوبعدی کار کنید و یاد می گیرید که چگونه گودات با صفحه نمایش کار می کند. شما با ابزارهای خاص ساختن بازی های دوبعدی آشنا می شوید و یاد می گیرید که چگونه کار می کنند، و این که چطور از آن ها استفاده کنید.
اسپرایت ها و نحوه و ترتیب ترسیم آن ها روی صحنه
اساس یک بازی دو بعدی اسپرایت است، بیایید از اینجا به بعد اسپرایت را نمایه بنامیم. نمایه یا اسپرایت را به سادگی می توان یک تصویر دانست که می تواند هر جایی در صفحه نمایشی که در اختیار بازی است ترسیم شود. یک اسپرایت را می توان بزرگ و کوچک نمود(SCALE کرد) آن را چرخاند(ROTATE داد) و برعکس کرد(FLIP کرد) و به این شکل افکت های تصویری مختلفی را ایجاد کرد. قبل از شروع استفاده از اسپرایت ها ابتدا تصویر اصلی (ViewPort) را معرفی می کنیم، که جایی است که اسپرایت ها در آن ترسیم خواهند شد.
مختصات تصویر اصلی (Viewport Coordinates)
این تصویر اصلی با تصویر اصلی که در محیط ویرایشگر هست و از آن گفتیم تفاوت هایی دارد، چرا که ما اکنون درباره نحوه دیده شدن بازی در زمان اجرا می گوییم. شما می توانید تصویر اصلی یا ویو پورت را به مانند یک صفحه دکارتی(ریاضیات دکارتی با مختصات x,y من هم چیز زیادی یادم نمانده هر جا لازم باشد توضیح بیشتری خواهیم داد) که موقعیت مبدا آن، یعنی نقطه (0,0) در گوشه بالا چپ تصویر است. Y به سمت پایین تصویر مثبت می شود و به سمت بالا منفی. X هم به سمت راست تصویر مثبت است و به سمت چپ تصویر منفی. اگر در بازی که عرضه می شود به کاربر اجازه داده شود که پنجره بازی را کوچک و بزرگ کند این سیستم مختصات هم به همان اندازه بزرگ و کوچک خواهد شد.
سیستم مختصات دوبعدی گودات
ترتیب ترسیم شدن نمایه ها در صحنه نمایش در گودات
گره ها به ترتیبی که در درخت صحنه دارند ترسیم خواهند شد. یعنی گره های بالاتر در سلسله مراتب درخت زودتر ترسیم می شوند به همین علت هم در صحنه نمایش پشت سر گره هایی که در سلسله مراتب پایین تر هستند قرار می گیرند. این ترتیب بر عکس لایه هاست که معمولا لایه های بالاتر جلوتر از بقیه نشان داده می شوند مثل فتوشاپ و پینت دات نت.
تصویر بالا به سادگی نحوه ترتیب ترسیم را نشان می دهد اگر می خواهید یک گره را بالاتر نشان دهید باید در پایین درخت قرار بگیرد. نکته: فرزندان یک گره بعد از آن رسم می شوند اما پشت سر گره های هم ردیف در چنین گره ای قرار می گیرند. به درخت صحنه و صحنه ای که ترسیم شده دقت کنید.
نکته
[b]مدیریت مشخصات مکانی و ابعادی(ترنسفورمTransform) گره ها از طریق گره های دیگر[/b]
به یاد داشته باشید که موقعیت مکانی و ضریب بزرگی و کوچکی یک گره از گره والدش متاثر است و تاثیر می پذیرد. گاهی می خواهید این اتفاق بیفتد اما همزمان لازم است که آن گره پیش از دیگر گره های بالای آن گره در درخت ترسیم شود. برای این کار، از گره [b]RemoteTransform2D[/b] استفاده می شود. می توان این گره را به عنوان فرزند یک گره به آن افزود تا مشخصات مکانی ابعادی آن گره را از این طریق تغییر داد و آن را پشت گره ی دلخواه ترسیم کرد. در این صورت شما می توانید این گره را پیش از گره های بالاتر در درخت صحنه ترسیم کنید و با کدی که در گره های دیگر می نویسید موقعیت مکانی و ابعادی این گره را تغییر دهید.
به یاد داشته باشید که شما گزینه های دیگری هم دارید. مثلا با استفاده از مشخصه Z-Index گره می توانید ترتیب ترسیم شدن آن را تغییر دهید و به این صورت هر گره ای که Z-Index بیشتری داشته باشد دیرتر و بالاتر از دیگر گره ها ترسیم خواهد شد. همچنین می توانید با استفاده از مشخصه [b]Show Behind Parent [/b]در گره به گره بگویید که پیش از والدش ترسیم شود و در نتیجه پشت آن قرار گیرد. اما گزینه های دیگر محدودیت هایی دارند. استفاده از Z-Index هم کمتر از درخت صحنه کارآمد است.
نمایه ها (Sprites)
گره نمایه (Sprite) پر استفاده ترین گره بازی های دو بعدی است. این گره تنها یک تکستچر(texture /نگاره-محتوای فایل تصویری که در بازی استفاده می شود) را در بر گرفته است که شما می توانید آن را بچرخانید(rotate)، بزرگ یا کوچک کنید(scale) و موقعیت مکانی آن را به هر جایی از تصویر اصلی بازی یا حتی بیرون از آن تغییر دهید(translate). این گره می تواند برای کاراکترها(انسان ها و هیولاها و حیوانات و …)، اشیاء(درخت و گل و گیاه و میز و صندلی و…)، رابط کاربری (منوها، نوار سلامتی و میزان مهمات و …) و هر چیز دیگری که به تصاویر نیاز دارد مورد استفاده قرار گیرد. نمایه ها مخصوصا در نمایش انیمیشن های برگه نمایه (spritesheet) بسیار عالی هستند. برگه نمایه یک تصویر است که شامل چندین حالت یک موجودیت است مثلا ده تصویر از لحظه های مختلف راه رفتن یک انسان و نمایش پشت سر هم این تکه های تصویر باعث نشان دادن یک انیمیشن خواهد شد. مانند کاری که در گوشه دفترچه یادداشت های دوران مدرسه می کردیم، اگر می کردیم. برای این کار باید ناحیه نمایه(موقعیت اسپرایت ها) در برگه نمایه (اسپرایت شیت) مشخص شده باشد.
ناحیه نمایه (Sprite Regions)
در مستندات گودات دو قابلیت درباره نمایه ها دیده می شود، یکی مشخصه ناحیه([b]Region[/b]) است. که به شما امکان می دهد که تنها بخشی از یک تصویر را در صفحه نمایش بازی نشان دهید. این قابلیت مخصوصا زمانی مفید است که یک برگه داشته باشید که چیزهای زیادی را در آن قرار داده اید و می خواهید بدون اینکه آن برگه تصویر را تکه تکه ذخیره کنید آن را روی صفحه نمایش نشان دهید.
در پایین پنجره ویرایشگر شما می توانید ویرایشگر ناحیه نگاره ([b]Texture Region[/b]) را پیدا کنید. تصویر زیر.
این ابزار را می توان برای تکه تکه کردن تصویری یک عکس و انتخاب دقیق بخش های مختلفی که می خواهید به عنوان یک نمایه نشان دهید استفاده کرد. توجه داشته باشید که این ابزار تنها زمانی در دسترس است که یک گره از نوع نمایه(Sprite) را در انتخاب داشته باشید.
فریم ها
اگ بخواهیم یک انیمیشن برگه نمایه (spritesheet animation) بسازیم، انتخاب تک تک فریم هایی که باید نمایش داده شوند فوق العاده آزار دهنده خواهد بود. گودات ابزاری دارد که به این کار کمک می کند: مشخصه Frame در گره نمایه. شما می توانید [b]Vframes [/b]را به تعداد ردیف های برگه نمایه قرار دهید و همینطور [b]Hframes[/b] را به تعداد ستون های آن. وقتی که مشخصه [b]Frame[/b] را در نمایه تعین کردید فریم جاری از برگه انتخاب می شود، به طور عملی به این موارد خواهیم پرداخت، به یاد داشته باشید که نخستین فریم 0 خواهد بود. تعداد فریم ها برابر ستون ها ضرب در ردیف ها ی برگه نمایه هاست. فریم ها از چپ به راست و از بالا به پایین نشان داده خواهند شد. مانند ترتیب اعداد در تصویر پیشین.
بردار ها و مشخصه های موقعیت مکانی و ابعادی(Vectors and Transforms)
یک وقفه در آموزش ابزارها داریم و به بحث نظری درباره ریاضی مورد استفاده در گرافیک های دوبعدی بر می گردیم. شاید از دور به نظر ترسناک و سخت می رسد، اما اولا آسان است و ثانیا دانستن این ریاضیات کار بازی سازی را هم برای شما به مراتب ساده تر می کند و آزادی عمل شما را بی نهایت افزایش می دهد به علاوه این که برای همه عملیات ریاضی تابع از پیش تعریف شده داریم و کافی است که مثلا بدانید سینوس چیست و کجا ها استفاده می شود و اصلا قرار نیست که معادله ای را حل کنید. با استفاده از ریاضی بردارها شما می توانید بی خیال استفاده از مثلثات و محاسبات زاویه ها شوید. تازه تابع های از پیش تعریف شده موتور گودات هم که جای خود را دارند.
بردار(Vector)
قبلا گفتیم که ویو پورت(تصویر اصلی) یک صفحه ساده دکارتی است یعنی هر نقطه روی آن با دو مشخصه X و Y قابل نمایش است. یک [b]بردار[/b] (Vector) را اغلب با یک (x,y) که نشان دهنده فاصله(حرکت) افقی و عمودی آن از محور های X و Y است نشان می دهند. در تصویر زیر مشاهده می کنید. نقطه شروع (مبدا/Orgigin) جایی است که دو محور مختصات از رو هم می گذرند یعنی نقطه 0,0.
تصویر فوق یک بردار را در فضای دوبعدی نشان می دهد. m نشان دهنده اندازه بردار (magnitude) است یعنی همان طول بردار. d زاویه بردار از محور افقی است که برای آن است در انی تصویر به شما نشان دهیم که جهت بردار چگونه است.
از بردار ها برای نشان دادن موقعیت مکانی استفاده می شود و همچنین می توان به عنوان ترکیبی از جهت و اندازه حرکت به آن ها نگاه کرد. اگر به بردار به چشم یک کمان یا فِلِش نگاه کنیم، که به یک نقطه اشاره می کند. جهت جایی است که مورد اشاره است و اندازه یا بزرگی بردار طول این فلش است.
برای حساب کردن بزرگی بردار می توان از قاعده فیثاغورثی استفاده کرد. طول بردار وتر مثلث فیثاغورثی است X و Y هم دو ضلع مجاور آن. بنابر این…
هر چند که اصلا نیازی به این کارها نیست و گودات خودش برای محاسبه طول بردار تابع از پیش تعریف شده دارد. var m = vector.length() که فعلا با آن کاری نداریم.
عملیات برداری
عملیات های ریاضی زیادی را نمی توان روی بردار ها انجام داد. از همین مقدار هم تعداد کمی در بازی ها کاربرد دارند و پرکاربرد هستند. شما می توانید بردارها را جمع، تفریق یا ضرب در یک عدد کنید.
جمع(addition)، تفریق (subtraction) و ضرب در یک عدد(scalar multiplication) بردار ها را مشاهده می کنید. - [b]جمع بردارها [/b]جزء به جزء انجام می شود به این صورت که X بردار اول با X بردار دوم و Y بردار اول با Y بردار دوم جمع می شود. (1, 2) + (3, 4) = (4, 6). همانطور که تصویر مشاهده می کنید مانند آن است که از انتهای بردار اول بردار دوم شروع شود و نقطه پایان بردار دوم حاصل جمع و بزرگی بردار از ابتدای بردار اول تا انتهای بردار دوم است. اگر آن را مثل حرکت روی صفحه دکارتی ببنیم مثل این است که از مبدا مختصات به انتهای بردار اول بروید و سپس بردار دوم را دنبال کنید تا به انتهای مسیر برسید.
- [b]تفریق بردارها[/b] همانند جمع جزء به جزء است. نتیجه همان برداری است که از انتهای بردار دوم به انتهای بردار اول می رود. این عملیات برای یافتن فاصله دو بردار مورد استفاده قرار می گیرد.
- [b]ضرب بردار در عدد[/b] همانند ضرب اعداد است برای هر یک از اجزای بردار مثلا 3 × (1, 2) = (3, 6). بردار حاصل در همان جهت بردار نخست خواهد بود اما طول آن در یک عدد ضرب شده است. عددی که [b]اسکالر[/b] نامیده می شود چون از Scale به معنای بزرگ و کوچک کردن می آید و بردار را به ضریب خاصی بزرگنمایی می کند.
- ضرب بردار ها نوعی ضرب است که از مجموع حاصلضرب اجزای بردار حاصل می شود و یک عدد خروجی آن است. این عملیات با نقطه نشان داده می شود. مثل (1,2)·(3,4)=1×3+2×4=11. حاصل ضرب دو بردار بزرگی، یا اندازه هر دو بردار است، که ضرب در کسینوس زاویه بین آن دو بردار شده باشد. به صورت ریاضی می توان گفت: a · b = ||a|| ||b|| cos θ این ضرب می توان برای بدست آوردن زاویه بین دو بردار استفاده شود که البته برای این کار هم گودات تابع از پیش تعریف شده دارد. به علاوه می توان برای دانستن این که هر چیزی در کدام سمت بردار قرار گرفته است از آن استفاده کرد.
- [b]حاصلضرب ضربدری:: [/b]یکی دیگر از انواع ضرب برداری است و تنها برای سه و هفت بعد:: تعریف شده است، پس برای نیاز ما که دو بعدی است کارایی ندارد. در ضرب ضربدری بردارها، بردار دیگری حاصل می شود، که بر هر دو بردار عمود است. این عملیات بردار در فصل مربوط به گرافیک سه بعدی توضیح داده خواهد شد.
بردار های واحد (Unit vectors)
یک بردار واحد:: برداری به بزرگی 1 است. این بردارها زمانی که تنها برای بیان جهت بکار می روند بسیار کارایی دارند. از آن جا هر کدام می تواند در یک عدد اسکالر ضرب شود تا بزرگی آن تغییر کند. به علاوه در ضرب نقطه ای بردار ها کاربرد دارد چرا که عدد حاصل همواره در محدوده -1 و 1 خواهد بود و این معنای خاصی دارد، معنای آن این است که اگر بردارها موازی باشند مقدار 1 خواهد بود و اگر کاملا بر خلاف جهت یکدیگر باشند مقدار -1 خواهد بود.
شیوه به دست آوردن بردار واحد:: از یک بردار معمولی را نرمال سازی ([b]normalization) می نامند. و می توان با تقسیم هر جزء(X,Y) بر بزرگی بردار آن را به دست آورد. گودات تابع خاص این کار را نیز در خود دارد.[/b]
var unit = vector.normalized().
مختصات مکانی ابعادی (Transforms)
یکی دیگر از دانش های ریاضی مفید در بازی ها شیوه استفاده از ماتریس ها برای تغییرات مکانی ابعادی در اشیاء است. هر گره (نود) در موقعیت مکانی محلی (Local) خودش مستقر است و از مختصات مکانی ابعادی شی والدش برای تعیین موقعیت خود در فضای کلی (global space) استفاده می کند. شما می توانید این مسئله را با افزودن یک اسپرایت به درخت صحنه و یک اسپرایت دیگر به عنوان فرزند اسپرایت پیشین ببینید. اسپرایت والد را در صحنه حرکت دهید، سپس اسپرایت فرزند را انتخاب کنید و می بینید که مشخصه موقعیت مکانی آن در کادر نظارت برابر (0,0) است. شما حرکت اسپرایت یا نمایه فرزند را در صحنه می بینید اما این حرکت متاثر از حرکت والد و تغییر مختصات مکانی ابعادی آن در صحنه است.
مختصات مکانی ابعادی یا transform ترکیبی است از انتقال (موقعیت مکانی)، چرخش و ضریب بزرگنمایی. انتقال فاصله بین مبدا در فضای عمومی و فضای محلی است. چرخش و ضریب بزرگنمایی را می توان به صورت یک زاویه و یک بردار به نمایش گذاشت اما انتقال در قالب بردار ها نمایش داده می شوند. سه بردار که نهایتا در یک ماتریس 3 در 2 به نمایش در می آیند.
دو ردیف اول X و Y فضای محلی که در این ماتریس ارائه شده را نشان می دهند، خط بعدی هم انتقال است. گودات یک کلاس به نام Transform برای کمک به شما در این زمینه دارد.
[b]عملیات مختصات مکانی ابعادی در گودات[/b]
var transform = Transform2D()
var x = transform.x # X axis vector
var y = transform.y # Y axis vector
var o = transform.o # Origin translation vector
توجه: علامت # در کد بالا نشان کامنت (توضیحات) است و تنها برای نشان دادن توضیحات اضافه در کنار کد به کار می رود و آن چه بعد از آن نوشته شود توضیح در نظر گرفته می شود و در زمان اجرا نادیده گرفته می شود.
توان مختصات مکانی-ابعادی (The Power of Transforms)
کارکرد اصلی ماتریس ها نگهداری عملیات های مختصات مکانی ابعادی است. اگر شما یک ماتریس مختصات را در یک ماتریس دیگر ضرب کنید، حاصل ماتریسی است از ترکیب دو عملیات. کد پایین این پاراگراف را مشاهده کنید. به یاد داشته باشید، ترتیب دارای اهمیت است و در صورت ریاضی مختصات متاخر(دوم/آخر) به روی مختصات مقدم(اول) اعمال شود ولی در گودات این ترتیب عکس است. به صورت پیشفرض یک مختصات که با یک ماتریس همانی (identity/این همانی یا ماتریس واحد) نشان داده می شود.
این یعنی هیچ مختصاتی تغییر نمی کند و شی مختصات پیشفرض خود را نگه خواهد داشت. یعنی موقعیت مکانی، چرخش و ضریب بزرگنمایی پیش فرض خود را.
برای نمونه، می توانید یک ماتریس داشته باشید که چرخش گره را تغییر خواهد داد و آن را با یک ماتریس دیگر ترکیب کنید که بزرگ نمایی را تغییر می دهد و این ماتریس را بر ماتریس مختصات یک شی اعمال کنید تا هم بزرگنمایی آن را تغییر دهید و هم آن را بچرخانید.
[b]ترکیب کردن ماتریس ها[/b]
var rotate_matrix = Transform2D().rotated(deg2rad(90)) # rotate 90 degrees
var scale_matrix = Transform2D().scaled(Vector2(2, 2)) # scale twice in each axis
var translate_matrix = Transform2D().translated
var combined_matrix = translate_matrix * rotate_matrix * scale_matrix # combine the transforms in order
$my_node.transform *= combined # apply the transform to a node
نکته
[b]ماتریس ها مختصات وارونه / عکس (Inverse Transform Matrices)[/b]
یکی دیگر از چیزهای جالبی که به وسیله ماتریس ها ممکن شده، قابلیت معکوس کردن مختصات است. اگر شما یک ماتریس معکوس را بر مختصات اعمال کنید مانند آن است که تمام مختصات مکانی ابعادی را معکوس کرده اید. مثلا می توانید کاری کنید که یک گره مختصات والدهایش را نادیده بگیرد.
به یاد داشته باشید که ماتریس وارونه تنها زمانی که ماتریس های نرمال شده ی راست گوشه:: کار می کند. در غیر این صورت شما باید از وارونگی نسبی برای اعمال معکوس کردن مختصات استفاده کنید. گودات برای همه این ها تابع حاضری دارد.
دوربین ها(Cameras)
داشتن مرحله ای بزرگ تر از پنجره بازی چیز عجیب و غریبی نیست. در یک بازی RPG (رجوع کنید به ژانرهای بازی) بازیکن اغلب یک دنیای بزرگ در اختیار دارد که در آن اکتشاف کند. این همان جایی است که دوربین ها پا به میدان می گذارند. به جای آن که تمام جهان بازی را حرکت دهید تا بخشی که قرار است دیده در تصویر اصلی (ویو پورت) قرار بگیرد، می توانید به سادگی یک دوربین در صحنه قرار دهید و کاری کنید که دنبال بازیکن برود و تصویر دوربین را به روی تصویر اصلی قرار دهید.
گره دوربین دو بعدی ( [b] Camera2D[/b] ) کاملا مانند هر گره دیگری است. آن را در درخت صحنه می گذاریم، هر کجا که می خواهیم باشد. اغلب به عنوان گره فرزند برای گره کاراکتر در صحنه قرار می گیرد. خود گره دوربین چیز خاصی ندارد. اینجا بعضی از مشخصه های آن را معرفی می کنیم. - مشخصه [b]Offset: این مشخصه مرکز دوربین را تغییر می دهد.به جای آن که موقعیت دوربین را تغییر دهیم می توانیم آفست آن را تنظیم کنیم تا دوربین بلغزد(اسکرول کند). برای ساختن انیمیشن ها این شیوه کاملا مفید است و به سادگی می توان آفست را به حالت اصلی اش برگرداند.[/b]
- [b]حالت لنگر (Anchor Mode): این حالت مشخص می کند که گره انتخابی باید در مرکز دوربین بماند و فاصله از اطراف رعایت شود(کشیدن به سمت مرکز) یا اینکه در گوشه بالا چپ ثابت بماند.[/b]
- [b]چرخش (Anchor Mode): این حالت مشخص می کند که زمانی که گره والد دوربین چرخید دوربین هم باید همراه آن بچرخد. اگر دوربین بچرخد به جای آن که چرخش گره والد را ببینید، مشاهده می کنید که جهان در حال چرخش است. و گره والد را ثابت می بینید.[/b]
- [b]دوربین فعال(Current): این مشخصه دوربین فعال را تعیین می کند. تنها یک دوربین به ازای هر تصویری که روی خروجی نشان داده می شود می تواند فعال باشد.[/b]
- [b]بزرگنمایی(Zoom): این مشخصه بزرگنمایی تصویر را تغییر می دهد. هر چه این عدد بزرگتر باشد اشیاء را جلوتر می بینید.[/b]
- [b]محدودیت ها(Limits): این مشخصه تعیین می کند که دوربین تا کجا می تواند پیش برود. از این ویژگی می توان برای جلوگیری از خروج دوربین از مرزهای مرحله استفاده کرد.[/b]
- [b]حاشیه های کشیدن (Drag Margins): می توان کاری کرد که دوربین علیرغم حرکت گره والدش در محدوده حاشیه ها بماند. جتی می توان تنها در جهت عمودی یا جهت افقی این ویژگی را فعال کرد.[/b]
- [b]نرم کردن (Smoothing): اگر فعال باشد دوربین به جای اینکه ناگهان حرکت کند و نا گهان بایستد حرکاتی نرم در افزایش و کاهش سرعت خواهد داشت. می توان تعیین کرد که اگر دوربین به محدودیت ها رسید تصویر نرم بشود.[/b]
نکته
[b]چند تصویری(Split Screens / تقسیم کردن صفحه نمایش)[/b]
وقتی بازیهایی که صفحه نمایش را تقسیم می کنند (مثل کراش پلی استیشن یا بیشتر بازی های دونفره کنسولی) مورد بحث هستند دوربین ها فوق العاده کارآیی دارند. می توان یک دوربین برای هر بازیکن ایجاد کرد و به آن ها گفت که هر کدامشان تصویرشان را روی گره ویوپورت جداگانه ای نشان دهند. این ویژگی را در بخشی که مربوط به ویوپورت ها ست بیشتر توضیح خواهیم داد.
تایل مپ ها (TileMaps / نقشه های کاشه ای)
یک ویژگی معمول دیگر در بازی های دوبعدی تایل مپ است. این ویژگی امکان ساختن مجموعه ای از کاشی ها را فراهم می کند که برای ساختن تصویر محیط های بازی از آن استفاده می شود. نه تنها این کار حجم کاری که باید انجام شود را کم می کند؛ بلکه کمک می کند تا به سرعت مراحل بزرگ و متنوعی را برای بازی خود بسازید. گودات گره تایل مپ [b]TileMap[/b] را خاص این ویژگی دارد.
ساختن مجموعه کاشی ها(Making a TileSet)
قبل از ساختن مرحله های بازی با تایل مپ، لازم است یک منبع تایل ست([b]TileSet [/b]/مجموعه کاشی) بسازید. گودات یک راه پیش روی شما می گذارد که تصاویر دلخواهتان را به عنوان منبع به موتوربازی بشناسانید و از آن استفاده کنید. می توان از یک تصویر برای تمام تایل ها استفاده کرد و آن را تقسیم کرد یا این که برای هر تایل یک فایل تصویر جدا داشت.
تمرین
[b]مجموعه کاشی(تایل ست) خودتان را بسازید[/b]
تصویر یا تصاویر دلخواه خود برای تایل ست را انتخاب کنید و گام ها زیر را انتخاب کنید.
- تصویر یا تصاویری را که انتخاب کرده اید در پروژه کپی کنید.
- یک صحنه جدید بسازید و یک گره
Node2D به عنوان ریشه آن اضافه کنید.
- صحنه را با نام [b]tileset-source.tscn[/b] ذخیره کنید.
- یک گره نمایه یا اسپرایت
به عنوان گره ریشه اضافه کنید و نام دلخواه کاشی مورد نظرتان را روی آن بگذارید. مثلا چمن(grass) یا سنگ(stone) یا صخره (rock) یا هرچیزی که خواستید.
- تصویر دلخواه برای کاشی را در مشخصه نگاره(texture) اسپرایت قرار دهید
- اگر لازم است مشخصه ناحیه (Region) را تنظیم کنید تا کاشی درست مشخص شود.
- اگر قرار است با کاشی برخورد صورت بگیرد مثلا کاراکتر روی آن راه برود و از آن رد نشود باید یک گره
[b]StaticBody2D[/b] به عنوان فرزند نمایه (اسپرایت) ایجاد کنید. همچنین به یک گره [b]CollisionShape2D [/b] همانطور که در بخش مربوط به فیزیک بازی ها مشاهده خواهد کرد نیاز دارد.
- گام های چهار تا هفت را برای تمام کاشی هایی که لازم دارید انجام دهید.
- صحنه را ذخیره کنید.
- روی منوی Scene کلیک کنید و گزینه Convert To و سپس TileSet را انتخاب کنید.
- فایل را به نام [b]tileset.res[/b] ذخیره کنید. این فایل منبع تایل ست ما خواهد بود.
نکته
[b]Grid and Snapping[/b]
چیدن دستی کاشی ها کنار یک دیگر کاری سخت و طاقت فرسات، گودات راه حل ساده ای دارد. استفاده از گرید(شبکه چهار خانه) و توابع قالب زدن است. در نوار ابزاری که روی تصویر اصلی مشاهده می کنید منوی Edit قابل مشاهده است. آن جا شما گزینه های [b]Use Snap[/b] و [b]Show Grid[/b] را دارید. گرید اغلب متناسب با سایز کاشی که شما ساخته اید نیست. اما می توان در همان منو با کلیک روی گزینه [b]Configure Snap[/b] و سپس می توانید با تنظیم گزینه گام های گرید به سایز کاشی این مسئله را حل کنید. استفاده از تایل ست در صحنه بدین صورت به مراتب راحت تر است.
استفاده از تایل مپ ها
حالا که یک منبع مجموعه کاشی را آماده کردیم ایم وقت استفاده از آن برای ساختن مراحل بازی است. استفاده از مجموعه کاشی سخت نیست فقط باید یک گره نقشه کاشه ای [b]TileMap [/b] به صحنه اضافه کنید. و مشخصه مجموعه کاشی [b]TileSet آن را به فایلی که ساخته ایم تنظیم کنید. می توان این کار را با انتخاب فایل تایل ست از کادر فایل سیستم و کشیدن آن به کادر نظارت و رها کردن آن روی مشخصه تایل ست در زمانی که تایل مپ در انتخاب است انجام داد. به علاوه باید مشخصه اندازه سلول (Cell Size[/b]) را هم تعیین کنید تا به اندازه کاشی ها درآید.
وقتی گره تایل مپ را در صحنه انتخاب کنید، ویرایشگر بسته کاشی هارا در سمت چپ تصویر اصلی نشان خواهد داد و یک گرید را هم برای کمک به جایگذاری کاشی ها به شما نشان خواهد داد. فرآیند ساختن صحنه با ترکیب کاشی ها به سادگی انتخاب کردن کاشی دلخواه از لیست و کلیک روی صحنه در جایی است که می خواهید کاشی آن جا قرار بگیرد. اگر جایی از نقشه کلیک راست کنید کاشی حاضر در آن نقطه پاک خواهد شد.
چند مورد قابل مشاهده در نوار ابزار برای ساختن تایل مپ ها در دسترس است که عبارت اند از: - [b]موقعیت کاشی Tile position: گزینه نخست موقعیت کنونی موس در موقعیت کاشی ها را را نشان می دهد. به علاوه نام کاشی که در این موقعیت قرار گرفته را نیز نشان می دهد. این ابزار زمانی مفید است که بخواهید با دقت ریاضی کاشی هایتان را در صحنه جایگذاری کنید.[/b]
- [b]تایل مپ(
نقشه کاشه ای/TileMap): این منو چند تابع دارد که برای ویرایش نقشه کاربرد دارد. موارد زیر موارد حاضر در این منو هستند.[/b]
- [b]سطل (Bucket): مثل سطل برنامه های نقاشی است با این تفاوت که محوطه انتخاب شده را با یک کاشی پر می کند.[/b]
- [b]انتخاب کاشی(Pick Tile): مانند کاری است که ابزار قطره چکان ([/b]eyedropper) در برنامه های نقاشی انجام می دهد. این اکان را می دهد که کاشی حاضر در موقعیت موس را انتخاب کرده و به عنوان کاشی فعال از آن استفاده کنید و آن را در جاهای دیگر قرار دهید.
- ابزار انتخاب ([b]Select[/b]): این گزینه شما را قادر می سازد تا بخشی از نقشه را انتخاب کنید.
- [b]کپی کردن بخش انتخاب شده(Duplicate selection): این گزینه یک کپی از بخش انتخاب شده به شما می دهد و شما می توانید آن را هرکجای دیگری از نقشه که خواستید بگذارید.[/b]
- [b]پاک کردن بخش انتخاب شده (Erase selection): بخشی که انتخاب شده است از کاشی ها را پاک می کند.[/b]
- [b]پس و پیش کردن (Transpose
): این گزینه ردیف کاشی ها را به ستون و بالعکس تغییر می دهد. مانند این است که تصویر را 90 درجه به چپ بچرخانید و برعکسش کنید.[/b]
- [b]معکوس کردن X (
Mirror X) کاشی را روی محور افقی معکوس می کند.[/b]
- [b]معکوس کردن Y (
Mirror Y) کاشی را روی محور عمودی معکوس می کند.[/b]
- [b]دکمه های چرخاندن (
Rotate Buttons) کاشی را به ترتیب 0، 90، 180 یا 280 درجه می چرخاند.[/b]
نکته
[b]ابزارهای خارجی تایل سِت و تایل مپ[/b]
ابزارهایی خارج از گودات وجود دارد که می تواند برای ساختن کاشی ها و نقشه کاشی ها به کار رود. مثل برنامه Tiled Map Editor. گودات به خودی خود آن را نمی شناسد اما افزونه یا پلاگین هایی در کتابخانه محتوای گودات (Asset Library) یافت می شود که به شما کمک می کند. افزونه هایی هم برای جدا کردن تصویر و ساختن مجموعه کاشی به صورت خودکار وجود دارد.
دیگر شیوه های تصویر پردازی (Other Projections)
نقشه کاشه ای های راست(Orthogonal) معمول ترین نوع هستند و در گودات پیشفرض محسوب می شوند. اما استفاده از نقشه های ایزومتریک (2.5D/دو و نیم بُعدی/isometric) و شش ضلعی هم در گودات میسر است.
برای استفاده از حالت ایزومتریک باید حالت TileMap را تغییر دهید برای این کار مشخصه mode آن را از Square به Isometric تغییر دهید. ویرایشگر به صورت خودکار تغییراتی را که اعمال کرده اید نشان خواهد داد. برای حالت شش ضلعی؛ باید mode را روی Square نگاه داشت اما مشخصه Half Offset را به Offset X و یا Offset Y بسته به شیوه تصویر پردازی صحنه تغییر داد. این باعث می شود که گرید شبیه یک دیوار آجری دیده شود که ردیف ها یا ستون ها یک Offset نسبت به خانه پیشین دارند.
حتی می توان یک تصویر پردازی دلخواه را با حالت Custom تغییر مشخصه Custom Transform به مختصات ماتریس خود شکل داد.
پس زمینه چند لایه لغزنده یا پارالاکس (ParallaxBackground)
یک گره جالب و پرکاربرد دیگر ParallaxBackground یا پس زمینه چند لایه لغزان است. با استفاده از این گره می توان به سادگی جلوه پارالاکس را پیاده سازی کرد، به این صورت که اشیائی که دور تر از دوربین قرار دارند بسیار آهسته تر از اشیاء نزدیک به دوربین جابجا می شوند. این افکت(جلوه) در بازی های لغزان از پهلو (مثل بازی قارچ خور و …) معمول است و عمق خاصی به تصویر بازی می بخشد.
گره ParallaxBackground
این گره خود به شما کمک می کند تا جلوه دلخواه را پیاده کنید. این گره با کمک گره ParallaxLayer تمام گزینه هایی که برای ارائه پس زمینه پارالاکس نیاز دارید را فراهم می کند.
بخشی از مشخصات این گره عبارت است از: - [b]Offset[/b]: برای تعیین میزان آفست پس زمینه است. اگر گره Camera2D داشته باشید این مشخصه به صورت خودکار مقدار خواهد گرفت. اما می توان به وسیله کد یا انیمیشن هم آن را مقدار دهی کرد تا جلوه دلخواه ساخته شود. مثلا برای حرکت ابرها در بازی.
- [b]Base offset[/b]: این ویژگی مقدار پایه مشخصه offset در گره های فرزند گره های ParrallaxLayer را مشخص می کند.
- [b]Base scale[/b]:این مشخصه مقدار ضریب بزرگنمایی پایه برای گره های فرزند گره ParallaxLayer را تعیین می کند.
- [b]Limit begin/end[/b]: این مشخصه محدودیت جایی که پس زمینه از آن جا اسکرول می شود و می لغزد را مشخص می کند. آغاز محدودیت محدوده بالا چپ را مشخص می کند و پایان محدودیت محدوده پایین راست را. پس زمینه وقتی به این محدوده ها برسد دست از لغزش برخواهد داشت.
- [b]Ignore camera zoom: اگر این مشخصه فعال باشد، پس زمینه مشخصه بزرگنمایی(zoom) دوربین را در نظر نخواهد گرفت و ترسیم تصویر را در اندازه معمولی انجام خواهد داد.[/b]
گره ParallaxLayer
گره ParallaxBackground با داشتن چند ParallaxLayer به عنوان گره های فرزندش کار خواهد کرد. چنان که در تصویر بعد از این پاراگراف مشاهده می کنید. هر لایه به عنوان یک سطح با فاصله ای متفاوت از دیگر سطح ها نسبت به دوربین کار می کند. با داشتن چندین لایه شما می توانید هر لایه را با سرعت مخصوص به خودش حرکت دهید، که جلوه پارالاکس(چند لایه لغزان) دلخواه شما را ایجاد خواهد کرد. این گره تنها سه مشخصه دارد.
یک نمونه پس زمینه پارالاکس - مشخصه [b]Scale[/b]: میزان حرکت لایه نسبت به افست پس زمینه را مشخص می کند. هرچه کمتر باشد حرکت آهسته تر خواهد بود و برای لایه های عقب تر کمتر خواهد بود. شما می توانید برای هر محور مقادیر متفاوتی قرار دهید.
- مشخصه [b]Offset[/b]: افست شروع لایه است که می تواند شروع لایه از موقعیت متفاوتی را میسر سازد.
- مشخصه [b]Mirroring: اندازه قاب لایه را مشخص می کند. وقتی از اندازه مشخص شده در این مشخصه عبور کند لایه تکرار خواهد شد. به یاد داشته باشید که اگر این مشخصه کمتر از اندازه صفحه نمایش باشد شاید به درستی کار نکند.[/b]
گودوت
|