(1399/5/29، 07:53 عصر)oak نوشته است: به نام خدا
در ابتدا فرارسیدن ماه محرم رو به همه دوستان تسلیت میگم امیدوارم از برکات این ماه گرامی نهایت استفاده رو ببرید
سوالی که خواستم بپرسم این بودش که میشه یک مینی مپ کامل مثل بازی های نظیر GTA و نید فور اسپید و اساسینز کرید در کانستراکت درست کرد ؟؟؟
در ابتدا این عکس رو یه نگاهی بهش بندازید :
![[تصویر: 59562852-9866965902.jpg]](https://img.dalfak.com/59/59562852-9866965902.jpg)
میتی مپ در واقع قسمتی از مپ رو داره نشون میده و دایره ای شکله و وقتی کاربر حرکت می کنه قسمت های جدید در مپ میان
من همچین چیزی می خوام
نمی خوام مثل این سورسا تو نت کل مپ باشه یه نقطه سفیدی روش حرکت کنه
می خوام قسمتی رو در لایوت نشون بده و با حرکت کاربر قسمت های جدیدی رو ببینه
می خوام یه چیزی مثل همین بازیا باشه
میشه ؟؟؟
سلام؛
به نظرم چیزی که میخوای بیشتر به درد بازیهای اُپن ورلد و سه بعدی میخوره اما به هر حال ساده ترین راهش رو حسین جان بیان کردن. به نظر من میتونی که یک طرح کامل و جامع از نقشه بازی تهیه کنی، در یک لایوت قرار بدی و با توجه به خصایص (مختصات ها) همون لایوت نقشه رو به دایره هایی تقسیم کنی و برای هر کدوم یک نام مثل A و B و ... مشخص کنی. حالا هر دایره رو از تصویر اصلی نقشه جدا میکنی و در قالب یک فایل به همراه فایلهای بازی به طور مثال با نام
map.json با فرمت Base64 دایره ها رو ذخیره میکنی.
خُب اما چطور ساز و کار مینی مپ رو راه بندازیم؟
قبل از هر چیز شمای کامل نقشه رو داخل یک لایوت قرار میدی. حالا چالش اصلی اینجاست که تصویر دایره ای شکل موقعیتی که کاربر الان در اون قرار داره رو در قسمت مینی مپ نمایش بدی. کارای زیادی میتونی انجام بدی که من به یک روش ریاضی برای پیاده سازی چیزی که میخوای اشاره میکنم.
میتونی برای هر دایره ای که تهیه کردی با توجه به مختصات مرکز دایره یک معادله (تابع) طراحی کنی و اون رو به همراه فرمت Base64 خودش ذخیره کنی. اما معادله یک دایره در دستگاه مختصات دکارتی به چه شکله؟
در معادله بالا
a بیانگر مختصات طول مرکز دایره،
b بیانگر مختصات عرض مرکز دایره و
r هم بیانگر شعاع دایره هست. برای اینکه بهتر متوجه بشی توی نمونه زیر من یک دایره با مرکز (2و4) و شعاع 5 رو هم رسم میکنم و هم معادله اش رو مینویسم.
![[تصویر: 0687283e49f6620d2a5113f513d4146d.png?trs...1c0c0b58ef]](https://i.paste.pics/0687283e49f6620d2a5113f513d4146d.png?trs=bc9708771d20ce5b345905dbbaa915bf044ac8ab421b377fcd19e41c0c0b58ef)
خُب شعاع و مرکز دایره رو که عملاً خودمون مشخص کردیم. حالا سوال پیش میاد که نقاط راست، چپ، بالا و پایین از کجا پیداشون شد؟
شعاع و مختصات مرکزی که تعیین کردیم نقش مهمی توی این نقاط دارن. برای به دست آوردن نقاط راست، چپ، بالا و پایین باید به شکل زیر جلو بریم:
کد:
نقطه بالا => (a,b+r)
نقطه پایین => (a,b-r)
نقطه راست => (a+r,b)
نقطه چپ => (a-r,b)
کمی قبلتر گفتیم که
a بیانگر مختصات طول مرکز دایره،
b بیانگر مختصات عرض مرکز دایره و
r هم شعاع دایره هستند. نقاطی هم که ما به دست آوردیم دقیقاً از ضابطه بالا پیروی میکنه.
حالا که با طریقه رسم و نوشتن معادله شکل یک دایره در دستگاه مختصات آشنا شدیم وقتشه برگردیم سر کار فعلی مون. به شکل زیر دقت کن. دایره ای قرمز رنگ همون دایره هایی هستن که خودت برای نقشه تقسیم بندی شون کردی و دایره نارنجی رنگ هم موقعیت کنونی کاربر هست. در ضمن حواسمون باشه که حرکت کاربر و سایر مسائل باید توی همون لایوت نقشه به صورت زنده پردازش بشن.
![[تصویر: a88d14145dda710f2c075f676ed24c63.png?trs...1c0c0b58ef]](https://i.paste.pics/a88d14145dda710f2c075f676ed24c63.png?trs=bc9708771d20ce5b345905dbbaa915bf044ac8ab421b377fcd19e41c0c0b58ef)
خُب حالا چطور بفهمیم که باید کدوم یک از دایره ها رو توی مینی مپ نمایش بدیم؟ ساده ترین راه اینه که فاصله بین مختصات نقطه ای که الان کاربر قرار داره رو با مختصات تمامی مراکز دایره ها محاسبه کنی و هر کدوم که کمتر شد معنیش اینه کاربر در محدوده اون دایره قرار داره پس رشته Base64 مربوط به اون دایره رو از طریق اکشن
Load Image From URL وارد اسپرایت مینی مپ میکنی. برای محاسبه فاصله نیازی نیست که درگیر فرمول های ریاضی بشی چرا که کانستراکت با اکسپرشن
distance فاصله بین دو نقطه رو حساب میکنه.
یه راه دیگه هم برای تشخیص اینکه کدوم دایره رو باید در مینی مپ نمایش بدی وجود داره.
میتونی با توجه به مختصات پلیر و به دست آوردن شب خط پلیر از طریق زاویه تشکیل معادله خط بدی. توی مثالی که بالا بیان کردم با توجه به موقعیت فعلی پلیر میتونی یک معادله خط تشکیل بدی.
![[تصویر: dee81a05cb231b1d82fe76411f706afc.png?trs...1c0c0b58ef]](https://i.paste.pics/dee81a05cb231b1d82fe76411f706afc.png?trs=bc9708771d20ce5b345905dbbaa915bf044ac8ab421b377fcd19e41c0c0b58ef)
خُب بعد از اینکه معادله خط یعنی
y=0.3x+0.3 رو محاسبه کردیم وقتشه ربطش بدیم به بحث دایره. میتونیم فاصله خط به دست اومده تا مرکز یک دایره دلخواه رو به شکل زیر به دست بیاریم:
![[تصویر: 9877d3b47d585c71eaf64b576f9b9ad6.png?trs...1c0c0b58ef]](https://i.paste.pics/9877d3b47d585c71eaf64b576f9b9ad6.png?trs=bc9708771d20ce5b345905dbbaa915bf044ac8ab421b377fcd19e41c0c0b58ef)
شاید لازم باشه یکسری بررسی های دقیقتر برای موقعیت پلیر انجام بدی که میتونی از قواعد زیر استفاده کنی:
![[تصویر: b20fde20b0ab9899928a1d783939fcc5.png?trs...1c0c0b58ef]](https://i.paste.pics/b20fde20b0ab9899928a1d783939fcc5.png?trs=bc9708771d20ce5b345905dbbaa915bf044ac8ab421b377fcd19e41c0c0b58ef)
موفق باشی.