پاسخ به پیشنهادات و سوالان
سلام
سیاست من در این تاپیک آن بوده که برای جواب سوالات و پیشنهادات مطرح شده تا حد امکان پست جدیدی نزنم و این مطالب را در انتهای پستهای اصلی آموزشی با دوستان حل و فصل کنم.
ولی برای دومین بار حجم سوال و پیشنهادات مطرح شده (و نتیجتاً جوابیه) زیاد شده که نیاز است در پستی مجزا کلیه آنها یکجا جواب داده شوند.
نقل قول:
نوشته شده توسط dogtag
آخه اگر قضیه بازی سازی بود، می رفتیم موتور Dunya رو می خریدیم و با کیفیت خدا بازی می ساختیم که همه چیز داشته باشه.
اومدیم پیش شما که XNA یاد بگیریم ...
پیش خودمان باشد، به کسی نگویید(!)، نمیدانم چرا یک لحظه فکر کردم، من مسئول سازمان وزین حمایت از منافع مایکروسافت در خاورمیایه و آسیا شرقی هستم! :31::31::31::10:
نقل قول:
نوشته شده توسط L u K e !
می گم یه قسمت بزنید واسه ی منابع اموزشی و کامپوننت ها ی اماده
در حین بیان مطالب اگر کامپونت معتبری باشد که جایش در آن پست باشد، معرفی خواهند شد.
نقل قول:
نوشته شده توسط hamishebahar
به کد زیر نگاه کن کدمشون درسته؟
فرقی ندارند!
جایی که من گفتم باید تعریف متغیر انجام شود برای مواردی بود که شما یک نتیجه را بیش از یک بار نیاز داشته باشید.
مثلاً این دو کد تفاوت بازدهی و سرعت زیادی ندارد و یکی هستند:
کد:
کد اول
string str = "123";
int i = int.Parse(str) * 5 + 2;
کد دوم
string str = "123";
int istr = int.Parse(str);
int i = istr * 5 + 2;
ولی این دو کد با هم متفاوت هستند و کد دوم صحیح تر و بهتر است:
کد:
کد اول
string str = "123";
int i = int.Parse(str) * 5 + 2 + int.Parse(str);
کد دوم
string str = "123";
int istr = int.Parse(str);
int i = istr * 5 + 2 + istr;
تفاوت آنجا است که در بخش اول ما یکبار به عدد int موجود در string نیاز داشتیم و کد اول و دوم فرقی نداشت.
ولی در بخش دوم ما دو بار به عدد int موجود در string نیاز داشتیم و کد اول به صورت مجزا دو بار این تبدیل را تحمیل کرده ولی کد دوم یکبار تبدیل را انجام داده و حاصل را دوبار استفاده کرده.
نتیجتاً چون در کدهای شما هیچ بخش تکراری وجود ندارد، تفاوتی بین کدهای اول و دوم نیست.
البته اگر به فرض مقادیر ورودی ثابت باشند (مثل Str_Main) و بخواهید چند بار این کار را انجام دهید میتوانید یک بار محاسبه کنید و آن را در متغییر محلی ذخیره کنید و دیگر هر کجچا نیاز شد فقط دستور MessageBox.Show را بدهید ولی باز هم کد اول و دومتان فرقی ندارند.
ضمناً در خصوص ان محاسبه string که نوشته بودید، کار وحشتناکی بود!
ولی برای نمایش در MessageBox.Show مشکلی ندارد، چون کاربر چیزی نمیفهمد ولی در یک برنامه عملی اگر خواستید همچین ویرایش های سنگین ترکیبی متدهای مختلف String را انجام دهید، پیشنهاد میکنم یک حلقه for یا foreach برای همه کاراکترهالی string تان بگذارید و خودتان در حلقه مذکور پردازش متنی انجام دهید و نتیجه را در یک StringBuilder ذخیره کنید.
نقل قول:
نوشته شده توسط hamishebahar
و در مورد Using هم اگه میشه بیشتر توضیح و مسال بزنید...واقعاً ممنونم....
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
نقل قول:
نوشته شده توسط hamishebahar
من اصلاً نمیدونم باید این XNA رو از کجا شروع کنم.....بعد از دانلود برنامه....با اینکه زبان سی شارپه ولی یه خط هم نمیتونم بنویسم...شما چه راهی پیشنهاد میکنید برای یادگیری بهتر؟
بله، شما احتمالاً ساختارها و کلاسها را نمیشناسید.
متاسفانه من نمیتوانم سرعتم را افزایش دهم و در عین حال باید مطالب ریاضی و هندسی را هم بیان کنم. (که دلایلش را خواهم گفت)
پیشنهاد میکنم از pdf های معرفی شده استفاده کنید و برای نمونه فعلاً از همان platformer خود VS استفاده کنید که دوبعدی و ساده است.
==============
نقل قول:
نوشته شده توسط L u K e !
با استفاده از Bitmap Font ?
آن کد فارسی سازی کاملاً از کدهای استاندارد XNA استفاده میکند و در هر سه محیط Win و XBox و Zune قابل استفاده است.
طبق روال عادی فایل spritefont.* تعریف میکنید...
همانطور که احتمالاً میدانید، برای نمایش عادی متون انگلیسی همچین دستوری مینویسید:
کد:
string str = "Hello";
spritebatch.DrawString(font, str ...
و برای نمایش متون مخلوط فارسی و انگلیسی به صورت RightToLeft با کمک تابع مذکور همچین دستوری مینویسید:
کد:
string str = "مهدی 114 Mahdi 114";
str = GHNet.Text.PersianText.GetDrawablePersianText(str, true);
spritebatch.DrawString(font, str ...
همانطور که میبینید فقط یک تابع این بین افزوده میشود و دقیقاً مثل همینجا 114 اول فارسی و 114 دوم انگلیسی نمایش داده خواهد شد.
در طراحی تابع مذکور دقت بسیار شده و روی الگوریتم مورد نظر برای شرایط متون فارسی و انگلیسی و عدد و فاصله و... بسیار فکر شده.
ضمن اینکه از کدهای خاص unsafe با دقت فراوان استفاده شده که به این درجه اطمینان رسیده ام که هیچ طور دیگری این تابع قابل پرسرعت تر و پر بازده تر شدن نیست.
تابع مذکور همه کاراکتر های یونیکیدی فارسی را تشخیص میدهد.
(18 نوع "الف" یا 25 نوع "ی" و... نتیجتاً در هر محیط و ویندوزی که کد کامپایل شود، قدیم و جدید و عربی و فارسی و... تضمین کارکرد صحیح برای فارسی دارد.)
نقل قول:
نوشته شده توسط dogtag
ممنون می شم اگر بسورسید!
الگوریتم را توضیح میدهم، خوبه؟ نه سیخ بسوزه و نه کباب! :31:
گمانم توضیح دادن الگوریتم نیمی از کد است.
1- جدولی sort شده و بسیار کوچک به صورت آرایه ای خام تهیه شده که حاوی همه کاراکترهای معنادار در زبان فارسی است که در استاندارد unicode وجود دارد و امکان دارد در هر سیستم و فارسی ساز ویندوز و... استفاده شود.
با روش جستجوی باینری و نصف کردن در کمتر از 8 مقایسه میتوان جایگاه یک کاراکتر را متوجه شد و فهمید فارسی است یا نه و چندمین حرف فارسی است.
2- در یک حلقه پردازش for داریم که کاراکتر به کاراکتر مقدار string ورودی را پردازش میکند.
3- برنامه کلیه کاراکترهای فارسی را با کارکتر مناسب همان حرف (اول و وسط و آخر و تنها) تعویض و جمع میکند تا برسد به عبارت انگلیسی...
4- بعد تمام کاراکترهای فارسی جمع شده تا آن لحظه را معکوس کرده و به خروجی اضافه میکند سپس به جمع آوری کارکترهای انگلیسی مشغول شده و تا رسیدن به کارکتر فارسی آنها را هم جمع میکند و الی آخر ...
5- اعداد هم جداگانه پردازش میشود... و سوییچ اعداد به یونیکدهای معادل فارسی فقط زمانی رخ میدهد که قبل از عدد متن فارسی وجود داشته باشد.
6- فاصله های سفید (هر کاراکتر غیر نمایشی) که پس از عددی باشد که قبل از آن عدد متن فارسی بوده باشد هم باید باعث ذخیره بافر در خروجی آن لحظه شود.
7- در نهایت بلاک های خروجی بعد for یک بار دیگر معکوس شده و تحویل return داده میشود.
در جهت سرعت حداکثری و البته با دقت کافی از یک string معمولی به جای بافرموقت و StringBuilder بارها بارها استفاده شده. و به راحتی با یک دستور intlength = 0 بافر مجازی Clean شده.
جالب انکه در انتها از همین بافر که با روش خاصی new شده برای جمع اوردی نهایی مقادیر استفاده شده و در return باز پس داده خواهد شد. (چیزی هدر نمیرود!)
حتی کدهای جمع دو string هم در قالب کدهای unsafe مدیریت مستقیم حافظه به طرزی بسیار کارامد از نو نوشته شده.
کد نویسی این تابع خاص با رعایت موازین دات نت و اطلاع از بازدهی و سرعت انواع کدها در مقابل کدهای مختلف نوشته شده.
نباید این حرف را بزنم، مخصوصاً که بد اموزی دارد!!!
(برای کسی که آشنایی کاملی ندارد شاید انجام این کار به مراتب سنگین تر و بدتر از کدنویسی عادی دات نتی باشد...)
ولی کد این تابع بیشتر از انکه شبیه کدهای عادی دات نتی باشد شبیه کدهای ++C است. (همانطور که گفتم حتی از جمع دو string هم در این کد استفاده نشده)
در کل تقریباً بعید میدانم بتوان این کد را بهتر و پرسرعت تر کرد.
==============
جمیعاً موفق باشید.:10:
معرفی مفاهیم پایه ریاضی و ساختارهای مربوطه ...
سلام
بردار
XNA.Vector3
بردار یک پاره خط جهت دار است، به بیان ساده تر یک فلش یا پیکان در فضا که جهتی مشخص را نشان میدهد و طولی مشخص دارد.
بردار به ذات یک مکان هندسی نیست و جای خاصی در فضا ندارد و در عین حال میتوانید آن را هر جایی تصور کنید، مهم نوک جهت پیکان بردار و طول ان است.
هر بردار سه مولفه X و Y و Z دارد.
=====
نقطه !
XNA.Vector3
یک تک نقطه را در فضا مشخص میکند.
برای نقطه ساختار و کلاس جداگانه ای نداریم و میتوان از همان XNA.Vector3 استفاده کرد که سه مولفه X و Y و Z دارد.
طبیعی است که اگر منظور از XNA.Vector3 یک نقطه باشد دیگر توابع گفته شده در فوق بی معنی خواهند بود.
(
البته از دید ریاضی نقطه هم در واقع میتواند یک بردار باشد که از نقطه 0,0,0 به سمت آن محل کشیده شده و نام دیگر نقطه، میتواند بردار مکان باشد!
)
=====
بردار رنگی !
XNA.Vector3
لازم به ذکر است که در برخی توابع XNA برای مشخص کردن رنگ یا فیلتر رنگی خاصی باز از بردارد استفاده میشود که در آن شرایط XYZ مشخص کننده طولهایی RGB در یک مکعب فرضی رنگی هستند. به بیان ساده تر از XYZ به جای RGB استفاده شده.
البته ساختاری خاص برای رنگ هم داریم XNA.Graphics.Color
ولی باید این دقت را داشته باشید که لزوماً یک XNA.Vector3 را در کدی دیدی همیشه به عنوان یک بردار فضایی-مکانی عادی تصور نکنید.
=====
بردار ها قابل جمع و تفریق با برداری دیگر و یا ضرب تقسیم در یک عدد هستند که هر مولفه بردار جداگانه رویش عمل فوق انجام میشود و اپراتور این اعمال در ساختار XNA.Vector3 از قبل تعریف شده.
کد:
//C#
XNA.Vector3 v1, v2, v3;
v3 = v1 + v2;
'VB
Dim v1, v2, v3 As XNA.Vector3
v3 = v1 + v2
(در نوشتار جبری از همان چهار علایم اصلی استفاده میشود.)
=====
طول بردار
طول پاره خط بردار برابر جذر مجموع مکعب مولفه هایش است!
کد:
//C#
XNA.Vector3 v;
float len = (float)Math.Sqrt(v1.X * v.X + v.Y * v.Y + v.Z * v.Z);
float len = v.Length();
'VB
Dim v As XNA.Vector3
Dim len As Single = CSng(Math.Sqrt(v1.X * v.X + v.Y * v.Y + v.Z * v.Z))
Dim len As Single = v.Length()
(در نوشتار جبری از علامت قدر مطلق استفاده میشود، چون قدر مطلق یک عدد هم نوعی طول بردار است! مثلاً |x| )
مکعب طول بردار را که در برخی محاسبات نیاز میشود میتوانید با LengthSquared به دست اورید که در واقع دیگر محاسبه رادیکال را ندارد و سریعتر است. ²|x|
=====
نرمال سازی بردار
به عملی اطلاق میشود که طی ان برداری جدید تولید میشود که هم جهت با بردار اولیه است ولی طولش یک واحد است
طبیعتاً برابر است با تقسیم بردار بر طول خودش
کد:
//C#
XNA.Vector3 v, n , n;
n = v / v.Length();
n = XNA.Vector3.Normalize(v);
n = v;
n.Normalize();
XNA.Vector3.Normalize(ref v, out n);
'VB
Dim v, n As XNA.Vector3
n = v / v.Length()
n = XNA.Vector3.Normalize(v)
n = v
n.Normalize()
XNA.Vector3.Normalize(v, n)
(
در نوشتار جبری چنیبن بیان میشود |n/|n
هموراه 1=| |n\|n |
)
=====
ضرب نقطه ای دو بردار
یک عدد میشود که برابر جمع ضرب جفت مولفه ها است.
و نیز برابر ضرب طول دو بردار در Cos زاویه بین آنها است.
کد:
//C#
XNA.Vector3 v1, v2;
float dot = v1.X * v2.X + v1.Y * v2.Y + v1.Z * v2.Z;
float dot = XNA.Vector3.Dot(v1 , v2);
'VB
Dim v1, v2 As XNA.Vector3
Dim dot As Single = v1.X * v2.X + v1.Y * v2.Y + v1.Z * v2.Z
Dim dot As Single = XNA.Vector3.Dot(v1 , v2)
بنابر تعریف دوم ضرب نقطه ...
اگر این ضرب صفر شود یعنی دو بردار عمود بر هم هستند ...
اگر این ضرب یک شود یعنی دو بردار موازی هم هستند ...
با کمک تابع ArcCos میتوان زوایه بین دو بردار را به دست آورد ...
و...
این ضرب کاربرهای بسیاری در هندسه سه بعدی دارد.
(
در نوشتار جبری از یک نقطه برای نمایش ان استفاده میشود v1.v2
هموراه (a.b=|a|.|b|.Cos(β
)
=====
ضرب خارجی یا متقاطع دو بردار
حاصل برداری است برابر با برابر دترمینالی 3 در 3 که سطر اول ان بردارهای یکه سه محور و دو سطر بعدی دو بردار باشند. (که به علت بردارهای یکه سه محور حاصل یک عدد مشخص نمیشود و یک بردار میشود.)
- طول این بردار حاصل برابر ضرب اندازه دو بردار در Sin زاویه بینشان است.
- بردار حاصل در فضا بر هر دو بردار قبلی عمود خواهد بود و جهت آن از قانون دست راست بدست می آید.
- اگر جای بردار اول و دوم عوض شود مولفه های نهایی 1- برابرخواهند شد.
کد:
//C#
XNA.Vector3 v1, v2, v3;
v3.X = (v1.Y * v2.Z) - (v1.Z * v2.Y);
v3.Y = (v1.Z * v2.X) - (v1.X * v2.Z);
v3.Z = (v1.X * v2.Y) - (v1.Y * v2.X);
v3 = XNA.Cross(v1, v2);
'VB
Dim v1, v2, v3 As XNA.Vector3
v3.X = (v1.Y * v2.Z) - (v1.Z * v2.Y)
v3.Y = (v1.Z * v2.X) - (v1.X * v2.Z)
v3.Z = (v1.X * v2.Y) - (v1.Y * v2.X)
v3 = XNA.Cross(v1, v2)
(
در نوشتار جبری از علامت ضرب برای نمایش ان استفاده میشود v1×v2
هموراه (a×b|=|a|.|b|.Sin(β|
)
==============
نقل قول:
اگر برای استفاده ی غیر تجاری بخواهیم و فقط بخونیم و پاکش کنیم، باز هم راهی ندارد؟
dll را قبل از مطالب برای دانلود میگذارم.
الآن هم میتوانم بگذارم ولی در وسط کدنویسی چند کلاس هستم که اصلاً هم قرار نیست در این تاپیک راجب آن چند کلاس صحبت شود ولی خودم ذاتاً چندان خوشم نمی آید که با این چند کلاس ناقص dll را منتشر کنم.
نتیجتاً به همراه پست بعدی و یا زودتر dll را منتشر میکنم و شما فعلاً یک تستی انجام دهید و ببینید اصلاً کار میکند یا نه! :31:
نقل قول:
مگه شما نگفتید که این XNB یه جور فایل ها رو فشرده می کنه ؟
یه مشکل پیدا کردم
این بار فایل های XNB م 5 -6 برابر فایل های اصلی حجم دارن
دو مطلب در این مورد وجود دارد.
اول آنکه بیشتر pipline ها در زمان کامپایل کلاً فایل ورودی را کن فیکن میکنند! و با یک فرمت و استاندارد و سبک دیگری آن را ذخیره میکنند.
دوم آنکه من گفتم همچین قابلیتی وجود دارد ولی شما باید اول فعالش کنید!
در XNA3.1 به صورت پیشفرض قابلیت مذکور برای کامپایل debug غیر فعال و برای کامپایل Release فعال است.
نتیجتاً به عنوان یک راه حل ساده پیشنهاد میکنم پروژه را در حالت Release کامپایل کنید، البته شاید فرق زیادی نکند ولی بحرحال در این صورت است که آن بخش فشرده سازی فعال خواهد شد.
معرفی مفاهیم پایه ریاضی و ساختارهای مربوطه ... 2
سلام
شعاع
XNA.Ray
مکان هندسی نقاط مشخصی در فضا است که همگی از یک نقطه مشخص در یک راستای مستقیم هستند و از یک سمت تا بینهایت امتداد دارد ...
شعاع دو مولفه دارد (خیلی شبیه خط)، یک بردار جهت و یک نقطه (بردار مکان)
یعنی با داشتن یک نقطه در فضا و یک جهت مشخص میتوان یک شعاع فرضی ترسیم کرد.
شعاع در محاسبات راستای کلیک ماوس و یا راستای شلیک یک گلوله مستقیم و... میتواند کاربرد داشته باشد.
==============
صفحه
XNA.Plane
مکان هندسی نقاط مشخصی در فضا است که بردار این نقاط با یک نقطه مشخص بر بردار نرمال صفحه عمود است ...
صفحه دو مولفه دارد، یک بردار نرمال و یک نقطه (بردار مکان)
بردار نرمال صفحه برداری است که بر صفحه عمود است ...
با داشتن یک نقطه و یک بردار نرمال صفحه میتوان صفحه در فضا تصور کرد که از چهار طرف با بینهایت امتداد یافته است.
یعنی اگر از هر نقطه ای در صفحه به سمت نقطه دیگری یک بردار رسم کنیم این بردار با بردار نرمال صفحه عمود خواهند بود.
زمین صاف و صفحه حرکت دوربین و صفحه تشکیل سایه و... میتواند از موارد کاربردش باشد.
==============
ماتریس
XNA.Matrix
به طور مشخص در کار ما یک جدولی دو بعدی و 4 در 4 شامل 16 عدد است!
ماترسی ها کاربرد بسیار بسیار وسیعی در طراحی و کنترل فضاهای سه بعدی دارند که ناشی از قدرت آنها در مبانی ریاضی میشود.
یک ماتریس به تنهایی میتواند برای اعمال مختلفی روی تک نقطه و بردار و یک شی بزرگ مفید باشد.
مثلاً یک ماتریس میتوانید حاوی اطلاعاتی در خصوص ....
- بزرگنمایی مجزا در هر سه بعد
- وضعیت چرخش یک جسم به طور مجزا برای هر سه بعد
- نقطه مرکزی چرخش و دوران جسم
- نقطه مکانی انتقالی که جسم باید بدان جا حرکت کند باشد
!!!!
و با اعمال ان به ماتریس جسم میتوانید همه تغییرات فوق را در یک لحظه اعمال کنید!
این ساختار انواع متدهای C#-Static یا VB-Shared را دارد که ماتریس را برای شرایط مختلف تولید میکند و میتوان آنها را با عمل ضرب با هم ترکیب کرد.
=====
ضرب دو ماتریس
حاصل همچنان ماتریسی خواهد بود که هر عنصر آن از ضرب سطر نظیر در ماتریس اول در ستون نظیر در ماتریس دوم حاصل میشود
این ضرب خاصیت جا به جایی ندارد بدان معنی که m1*m2 برابر نیست با m2*m1
کد:
//C#
XNA.Matrix m1, m2, m3;
m3 = m1 * m2;
m3 = XNA.Matrix.Multiply(m1, m2);
XNA.Matrix.Multiply(ref m1, ref m2, out m3)
'VB
Dim m1, m2, m3 As XNA.Matrix
m3 = m1 * m2
m3 = XNA.Matrix.Multiply(m1, m2)
XNA.Matrix.Multiply(m1, m2, m3)
=====
درک این مطلب بسیار مهم است که این ضرب خاصیصت جابه جایی ندارد.
به کد زیر دقت کنید:
کد:
//C#
XNA.Matrix mxscale = XNA.Matrix.CreateScale(3.0f, 3.0f, 3.0f);
XNA.Matrix mxtrans = XNA.Matrix.CreateTranslation(1.0f, 0.0f, 0.0f);
XNA.Matrix x = mxscale * mxtrans;
XNA.Matrix y = mxtrans * mxscale;
'VB
Dim mxscale As XNA.Matrix = XNA.Matrix.CreateScale(3.0f, 3.0f, 3.0f)
Dim mxtrans As XNA.Matrix = XNA.Matrix.CreateTranslation(2.0f, 0.0f, 0.0f)
Dim mx1 As XNA.Matrix = mxscale * mxtrans
Dim mx2 As XNA.Matrix = mxtrans * mxscale
mxscale اگر به هر مجموعه بردار مکان یا شی ای اعمال شود ابعاد آن را در همه جهات سه برابر میکند.
mxtrans اگر له هر مجموعه بردار مکان یا شی ای اعمال شود آن را دو واحد در جهت محور X ها حرکت میدهد.
فرض کنید یک شی سه بعدی در محل (0,0,0) قرار دارد و ماتریس mx1 و یکبار هم mx2 را به آن اعمال میکنیم.
(در محل مناسب طرز نمایش و این عمل توضیح داده خواهد شد.)
- اگر ماتریس mx1 به شی اعمال شود اول شی سه برابر بزرگتر شده و سپس به نقطه (2,0,0) میرود (با آینطور دیده میشود)
- اگر ماتریس mx2 به شی اعمال شود، اول شی به نقطه (2,0,0) میرود و بعد بردارهای مکان شی که آن را در این محل نشان داده و به شی حجم هم میدهند سه برار میشوند که نتیجه روی مانیتور آن خواهد بود که شی در محل (6,0,0) سه برار نمایش داده میشود.
یعنی خلاصه در mx1 شی در (2,0,0) سه برابر بزرگتر دیده میشود ولی با mx2 شی در (6,0,0) سه برابر بزرگتر دیده میشود.
این فقط یک مثال بود و این رفتار در اعمال دوران و ... هم پیش می آید و باید با دقت و تامل تصمیم بگیرید که اول کدام ماتریس باید در دیگری ضرب شود تا همان نتیجه را بدهد که میخواهید.
=====
متد XNA.Vector3.Transform جهت اعمال یک ماتریس روی یک بردار یا نقطه تکی
به عنوان نمونه جهت اعمال یک ماتریس به یک بردار میتوانید از متد XNA.Vector3.Transform استفاده کنید:
کد:
//C#.Net
XNA.Matrix mx = XNA.Matrix.CreateRotationX(XNA.MathHelper.PiOver4);
XNA.Vector3 v1 = new XNA.Vector3( ... );
XNA.Vector3 v2 = XNA.Vector3.Transform(v1, mx);
'VB.Net
Dim mx As XNA.Matrix mx = XNA.Matrix.CreateRotationX(XNA.MathHelper.PiOver4)
Dim v1 As XNA.Vector3 = New XNA.Vector3( ... )
Dim v2 As XNA.Vector3 = XNA.Vector3.Transform(v1, mx)
کد فوق بردار v1 را 45 درجه حول محور X چرخانده و حاصل را در v2 قرار میدهد.
==============
ما تقریباً چیز خاصی از مباحث ریاضی نگفتیم و فقط ساختارها را معرفی کردیم و موارد پرکاربرد ریاضی را مطرح کردیم ولی با توجه به اینکه تاپیک قصد آموزش پیشرفته ندارد، مباحث ریاضی در این پست تمام میشود.
(یعنی پستهای مخصوص رریاضی و با عنوان ریاضی تمام میشود و گرنه بحث ریاضی ادامه خواهد داشت)
شخصاً به دوستان پیشنهاد میکنم سعی کنند هندسه سه بعدی خود را قوی کنند تا در اعمال دستورات و چیزهایی که میخواهند در صحنه بازی مشکل نداشته باشند و دوربین دور سرشان نچرخد!
پست بعدی یا در خصوص نمایش طرح های دو بعدی خواهد بود و یا در ضمینه کنترلر دوربین (که طبیعتاً باز کمی ریاضیات دارد.)
==============
ghnet.xna.dll به پک معرفی شده در پست اول اضافه شد.
support.h02.ir/fwlink/?LinkId=1005808167
کسانی که خودشان ترسیم دوبعدی را بلد هستند میتوانند از تابع گفته شده (در انتهای پست 40) به همان شکل در نمایش متن فارسی استفاده کنند ولی در فایل spritefont.* باید مجموعه کاراکترهای فارسی را هم اضافه کنند:
اعداد فارسی
کد:
<CharacterRegion>
<Start>&-#-1632;</Start>
<End>&-#-1642;</End>
</CharacterRegion>
(به علت مشکل در نمایش اینجا خط تیره اضافه شده و شما باید، خط تیره ها را حذف کنید)
حروف فارسی
کد:
<CharacterRegion>
<Start>&-#-64342;</Start>
<End>&-#-64345;</End>
</CharacterRegion>
<CharacterRegion>
<Start>&-#-64378;</Start>
<End>&-#-64405;</End>
</CharacterRegion>
<CharacterRegion>
<Start>&-#-65153;</Start>
<End>&-#-65268;</End>
</CharacterRegion>
(به علت مشکل در نمایش اینجا خط تیره اضافه شده و شما باید، خط تیره ها را حذف کنید)
البته میتوان مجموعه حروف فارسی را در spritefont.* به هم چسباند ولی این کار سرعت کامپایل را کند و حجم xnb را افزایش میدهد
کد:
<CharacterRegion>
<Start>&-#-64342;</Start>
<End>&-#-65268;</End>
</CharacterRegion>
(به علت مشکل در نمایش اینجا خط تیره اضافه شده و شما باید، خط تیره ها را حذف کنید)
یک سمپل ساده از امکانات دو بعدی ghnet.xna هم به همراه نسخه exe به پک اضافه شد.
==============
نقل قول:
نوشته شده توسط test84
دوستان, آیا این کتاب دوباره یافت شد؟
در مورد کتاب مذکور متاسفانه مجدد وقت نکردم جستجویی کنم.
==============
از صبر دوستان تشکر میکنم :11: و جمیعا موفق و پیروز باشید. :10: