PDA

نسخه کامل مشاهده نسخه کامل : اموزش ساخت بازی به وسیله MonoGame



silsin
13-04-2013, 22:09
یا سلام به خدمت اعضای محترم انجمن ارواح :n02:
می دونم دیگه اینجا پرنده هم پر نمیزنه ولی گفتیم جهت شادی اموات هم شده این رو بزاریم :n02:

کلا یه توضیح در باره این بدم که MonoGame یکی از پسرعمو های xna که با شدتی بسیار خفن تر جدیدا خیلی طرفدار پیدا کرده . یعنی همه چیزش به کنار اینکه می شه روی اندروید و اویا و ios هم خروجی گرفت به کنار :n02: روندش مثل xna ولی صد البته خوبی نسبت به اون اینه که ساده تر هم هست .
در مورد این چیزی که دارم میزارم توی سایت یه سری اموزشه که ابتدای به امر توی سایت udk.ir شروع کردم و اگه یادم بمونه هر وقت ادامه اش رو می نویسم اینجا رو هم اپدیت می کنم .
اگه سوالی بود همینجا بپرسین بلد باشم جواب می دم



------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
بخش اول :
نصب MonoGame :
جهت استفاده کردن از این فریم ورک برای ساخت بازی های رایانه ای مولتی پلتفرم تا کنون دو محیط کار معرفی شده :
1- Visual Studio
2- Xarmin Soft
که به طبع انتخاب میان هر کدام از انها به نظر و شیوه کار برنامه نویس بستگی دارد . اما از نقطه نظر کار این دو محیط تقریبا شبیه به هم هستند توجه کنید شیوه کار در این فریم ورک کد نویسی است و این دو نرم افزار هر دو محیط کد نویسی می باشند .
جهت دسترسی به IDE زیبای Xarmin Soft می توانید به آدرس :
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]


برای شروع به کار ابتدا باید تعدادی Add-in را به سیستم عامل اضافه کنیم !!
ابتدا Gtk# را از طریق ادرس زیر دریافت کنید :
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
یا :
Download - Mono ([ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ])
همانطور که پیش از این نیز گفته شده محیطی که ما برای کار انتخاب می کنیم بر اساس انتخاب خودمان است . در اینجا ما با ویژوال استدیو بازی های خود را خواهیم ساخت .
برای استفاده از MonoGame در محیط ویژوال استدیو باید Add-In ان را از طریق آدرس زیر دریافت کنید :
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
پس از دریافت ان را نصب کنید !
همچنین باید اخرین نسخه از میان افزار OpenAl را نیز پیش از اجرای فریم ورک در سیستم نصب کرده باشید
پس از انجام تمامی این قسمت ها اکنون می توانید ویژوال استدیو را اجرا کنید :
می توانید در قسمت New Project ویژوال استدیو مشاهده کنید که قسمت جدیدی با نام MonoGame به آن اضافه شده است
همانطور که در تصویر نیز می بینید انواع پلتفرم های موجود و قابل دسترسی در لیست زیر قرار دارند که شما می توانید بازی خود را بر اساس آنها ایجاد کنید
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]



قسمت دوم




بخش 2 :
ایجاد اولین پروژه MonoGame :
در بخش 1 توانستیم موارد لازم برای استفاده و ورد به محیط این فریم ورک را ایجاد کنیم . همانطور که در قبل هم به ان اشاره شد محیط کاربری ما Visual Studio 2010 می باشد که با استفاده از نصب نرم افزار های مورد نیاز بخش توانستیم MonoGame را بر روی ان نصب کنیم . اکنون و در ادامه کار اولین پروژه خود را ایجاد خواهیم کرد :
توجه به این نکته هم بسیار ضروری است که بر روی سیستم شما باید حداقل یک درایور حاوی اخرین نسخه Open Gl وجود داشته باشد درصورت عدم نصب آن در محیط کد نویسی با ارور عدم توانایی در یافتن opengl.dll روبه رو خواهید شد
برای ایجاد یک پروژه جدید مطابق MonoGame :
1-با استفاده از کلید های Ctrl + shift + n یک پروزه جدید ایجاد کنید
2-سپس از منوی سمت چپ بر روی MonoGame کلیک کرده پس از آن در ListItem وسط صفحه بر روی MonoGame Windows OpenGl Project کلیک کنید .
پس از آن نام GameTest1 را برای نام ان وارد کرده و در انتها کلیک OK را برای ساخت فشار دهید.
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
اکنون به اصطلاح پی بازی ما اماده است !!!
برای شروع خروجی ابتدایی بازی را با هم مشاهده می کنیم :
برای این کار در محیط VisualStudio دکمه میانبر F5 را فشار دهید
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
برای شروع کار مقداری را به صورت ازمایشی اضافه کرده تا عملکرد را مشاهده کنیم .
بر روی کلاس GameTest1 در سمت راست دوبار کلیک کرده تا وارد محیط کد نویسی آن شوید
اکنون در داخل این خط :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

تکه کد زیر را اضافه کنید :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
سپس بار دیگر با زدن کلیک F5 محیط را اجرا کنید .
می توانید مشاهده کنید با همین تکه خط کد توانستیم قابلیت Full Screen شدن را در سکانس باز انجام دهیم .
تبریک می گوییم شما توانستید اولین پروژه خود در محیط MonoGame را انجام دهید !!!!!!


قسمت سوم :




بخش سوم :
چگونه در MonoGame کد نویسی کنیم ؟؟!!


در بخش های گذشته توانستیم مقدمات کار با فریم ورک فوق را فرا گرفته و از اولین پروژه خود Run بگیریم .
در صورتی که در ویژوال استدیو بر روی کلاس Game در Solution Explorer دوبار کلیک کنیم خواهیم دید که بلاک کد نویسی آن اجرا خواهد شد !!
در بلاک رویداد های آن با کدهای فوق روبه رو خواهیم شد :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
به واقع عملکرد این رویدادها چیست ؟؟
چگونه می توانیم از آن ها استفاده کنیم؟؟؟


اکنون و در ادامه هر یک از آن ها را بررسی خواهیم کرد :


در پروژه ما دو قسمت جهت کد نویسی وجود دارد
ابتدا کلاس Program.cs
و سپس کلاس Game1.cs
کلاس ابتدایی که همان کلاس اصلی در زبان برنامه نویسی c# بوده نگه دارنده مقادیر ابتدایی و اجرای بازی است . می توان آن را نقطه ابتدایی و اجرایی پروژه نیز نامید .همچنین این فایل تعیین کننده اجرای بازی ما نیز خواهد بود . البته این امر بسیار معدود پیش خواهد امد که ما بخواهیم کلاس اصلی را تغییر دهیم . اغلب فعالیت ما در حیطه کلاس Game1.cs خواهد بود
کلاس دومی که با نام Game1.cs تشکیل شده است در برگیرنده تمامی اعمال ما در حین اجرای پروژه می باشد .
نکته : لزومی به همین نام بودن این کلاس نیست و می توان آن را در حین پروژه تعویض نام نیز داد !
اکنون بررسی کدها را اغاز خواهیم کرد :


جهت برنامه نویسی در یک زبان باید لیستی از statement ها آن را نیز فراخوانی کرد همانند اینکه در c++ با استفاده از include# فایل هدر را می توان فراخوانی کرد در اینجا نیز با استفاده از using این امر امکان پذیر خواهد شد . جهت کار در محیط MonoGame تعدادی فایل هدر به همراه فریم ورک مربوطه ارائه شده که از طریق تعریف Statment به انها دسترسی پیدا خواهیم کرد

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
همانطور که می توان مشاهده کرد به خاطر Extend بودن MonoGame از MicrosoftXna در اینجا هدر های فریم ورک Xna را می توان مشاهده کرد
در ادامه بررسی کدها به قطعه زیر برخواهیم خورد :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
همانطور که می توان مشاهده کرد شروع کلاس Game1 در اینجا تعریف شده است. می توان مشاهده کرد که کلاس فوق از کلاس Game ارث بری شده است



در اداه به قسمت زیر می رسیم :

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


در خط بعد به کد زیر خواهیم رسید :


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
در این قسمت می توان مشاهده کرد که مقادیر GraphicsDeviceManager و مدیریت Content ها برای کار در حین پروژه در سازنده کلاس مقداردهی شده اند
(این قسمت ها در بخش های اینده بررسی خواهند شد)


* البته کد فوق : graphics.IsFullScreen = false; از ابتدا وجود نداشته و ما از بخش قبل به آن اضافه کرده ایم


متدها :
متد اولیه!! :
در خط بعد می توان کد زیر را مشاهده کرد :

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




متد بعدی مربوط به مدیریت و اجرا Content ها می باشد :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
همانطور که می توان مشاهده کرد تابع SpriteBatch در اینجا مقدار دهی شده است
این تابع جهت فراخوانی content ها (چه سه بعدی و چه دو بعدی - چه تکسچر ها و غیره ... ) برای بازی به کار می رود و می تواند به هر صورت و در هر زمانی Content های مورد نیاز را فراخوانی کند
همانطور که می توان مشاهده کرد این متد Override شده است برای همین این قابلیت در آن وجود دارد که دسترسی برنامه نویس را برای وارد کردن Content ها کاملا باز بگذارد !!


همچنین در خط بعد متد :


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

نیز جهت خارج کرد Content های Load شده در اختیار برنامه نویسی می باشد!!
در ادامه با متد زیر مواجه خواهیم شد :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

هنگامی که پروژه شما اجرا خواهد شد به ساختار نیاز است که اعمال را در حین اجرا بازی انجام دهد . وظیفه این متد در اینجا این است که کنترل تمامی اعمال اجرای بازی را بر عهده بگیرد (کنترل ورودی های کاربر - پخش صدا - تشخیص برخورد و غیره ....)


به صورت پیش فرض این قسمت هر 30 ثانیه یک بار در حین بازی اجرا می شود که در ادامه خواهیم دید که چگونه می توانیم به همین اجرا نیز دسترسی داشته باشیم .
حتی اگر کاربر متد های دیگری نیز برای اجرا عملکرد های اجرایی نیز تعریف کند تمامی ان ها باید از طریق متد فوق صدا زده شوند!!


در انتها با متد زیر رو به رو خواهیم شد :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
همانند متد Update این متد نیز به صورت پیش فرض هر 30 ثانیه یک بار اجرا میشود .
در حال حاظر ما کاری به این متد نخواهیم داشت (در بخش های بعد دلایل آن بررسی خواهد شد)


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


پایان بخش 3




قسمت 4 ام از سه شنبه به بعد میشینم می نویسم
در ضمن یه مسئله احتمالا ادیتور برنامه نویسی رو از ویژوال استدیو به xarmin studio تغییر میدم حالا سه شنبه میام توضیح می دم چرا
فعلا با تشکر:n02:

silsin
17-04-2013, 11:22
قسمت 5 :

قسمت 5 :
تا اینجای کار با ساختاری ابتدایی از چگونگی کار در محیط MonoGame آشنا شده ایم اکنون قدمی جدید را بر خواهیم داشت.
همانطور که در ابتدای اموزش ها هم به آن اشاره شد یکی از برتری های MonoGame نسبت به Xna قابلیت خروجی بر روی پلتفرم های مختلف همانند Andriod و ios و غیره ....
می باشد . یکی از محدودیت هایی که ساختار فعلی (کد نویسی با ویژوال استدیو ) برای ما ایجاد می کند عدم قابلیت دسترسی به پلتفرم های اضافه است . سازندگان MonoGame برای رفع این مشکل افزونه ای را علاوه بر ویژوال استدیو برای نسخه های نرم افزار برنامه نویسی Xarmin Studio فراهم کرده است .
این نرم افزار علاوه بر زیبایی ادعای رقابت با ویژوال استدیو را هم دارد !!!!!
در حال حاظر به جهت به مشکل بر نخوردن در روند ساخت پروژه های مولتی پلتفرمی در طی این اموزش ها ناچارا محیط برنامه نویسی را به Xarmin تغییر خواهیم داد .




نصب و فعال سازی Xarmin :
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]@api/deki/files/201/=ss-main-window.png


ابتدا وارد ادرس زیر شده و با توجه به سیستم عامل خودتان نسخه مناسب را دریافت کنید :
Xamarin Studio 4.0.1 installer
این نسخه را دریافت و نصب کنید
اکنون به مسیر زیر رفته و افزونه Mono Game که مخصوص این نرم افزار تهیه شده است را دریافت کنید :
MonoGame - Write Once, Play Everywhere - Download: MonoGame 3.0.1 ([ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ])


MonoGame 3.0.1 for Xamarin Studio
پس از دریافت وب سایت فوق فایلی با پسوند mpack دریافت خواهید کرد
ابتدا نرم افزار Xarmin را نصب کنید
آن را اجرا کرده و مطابق تصویر زیر پکیج را وارد نرم افزار کنید
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
پس از انجام این کار زمانی که بخواهید پکیج جدیدی را ایجاد کنید با مجموعه جدید اضافه شده رو به رو خواهید شد :
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
پس از اینجا تمامی روند کار همانند ویژوال استدیو می باشد و شما می توانید همانند آن با این نرم افزار کار کنید
دوباره از ابتدا اموزش ها را مطالعه و اینبار در قالب xarmin stdio آن ها را بررسی کنید


نکته : در حال حاظر دسترسی به ساخت بازی برای اندروید نخواهید داشت . در اینده اقدامات لازم جهت ساخت بازی با اندروید نیز بررسی خواهند شد


قسمت 6 :
مدیریت منابع در MonoGame بخش اول :
تعاریف اولیه
در ابتدا با تعریف چند اصطلاح به پیش اغاز می کنیم :
ابتدا منابع بازی شما همه چیز شما هستند!! منابع شامل همه چیز بازی در کنار کد های برنامه نویسی شما هستند . مدل های سه بعدی - فونت ها - تصاویر - جلوه های صوتی , موسیقی و غیره ..... که برای ساخت یک بازی ما به بیشتر این منابع خواهیم داشت . این بخش از اموزش ها بر روی چگونگی ساخت این منایع تمرکز نخواهد داشت بلکه نکات و چگونگی استفاده از ان ها را مرور خواهد کرد .
نکته دوم در مورد سیستم مدیریت منابع بازی می باشد . سیستم مدیریت منابع بازی جزئی از بازی , انجین بازی , است که منابع مورد نیاز خود را از فایل های خامی که نام برده شد دریافت و قابل استفاده جهت سازنده می کند . توجه به این سیستم در بازی نقش مهمی دارد چرا که با این کار اعتبار محصول نهایی خود را تضمین خواهید کرد چرا که کاربران محصول شما در خروجی نهایی تماما این گونه منابع را خواهند دید نه کدهای برنامه نویسی شده.استراتژی های گوناگونی جهت این بخش وجود دارد که می توان ان را به صورت دستی نیز پیکربندی کرد همانند استراتژی xna که فقط نام فایل را عوض کرده و پس تبدیل آن به منابعش مورد نیاز خود هم دسترسی را به آن اسان تر می کند و هم سرعت استفاده از ان .
به این نکته توجه داشته که ما در MonoGame نیز با همین روند فوق روبه رو خواهیم بود که در بخش دوم این قسمت به ان اشاراتی خواهد شد .
در ادامه جدول منابع قابل استفاده جهت ساخت پروژه را می توانید مشاهده کنی







فایل های سه بعدی : .x, .fbx
تصاویر و تکسچرها : .bmp, .dds, .dib, .hdr, .jpg, .pfm, .png, .ppm, .tga
اصوات : .xap (an XACT audio project), .wma, .mp3, .wav
فونت : .spritefont
و همچنین افکت ها : Effects
همانطور که می توان مشاهده کرد همان فایل های قابل پشتیبانی توسط xna نیز در اینجا کاربرد دارند و این به خاطر Port بودن این فریم ورک از xna می باشد .
همچنین نکته قابل توجه دیگری نیز وجود داشته که با گسترش هرچه بیشتر این فریم ورک دامنه فایل های قابل پشتیبانی نیز به همراه آن بیشتر شده که در اینده و در طی انجام پروژه های عملی آن ها را نیز مشاهده خواهیم کرد .



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

فایل های سه بعدی : .x, .fbx
تصاویر و تکسچرها : .bmp, .dds, .dib, .hdr, .jpg, .pfm, .png, .ppm, .tga
اصوات : .xap (an XACT audio project), .wma, .mp3, .wav
فونت : .spritefont
و همچنین افکت ها : Effects

این سری از فایل ها به همراه چند گروه دیگر که در MonoGame به قابلیت های ان اضافه شده است را اجزای تشکیل دهنده بازی خود خواهیم نامید . اکنون می خواهیم بدانیم که چگونه می توانیم از این فایل ها استفاده کنیم .
ادیتور برنامه نویسی مورد نظر خود را اجرا کنید (در اینجا ما از Xarmin Studio استفاده می کنیم) سپس پروژه جدیدی از نوع MonoGame Windows OpenGl Studio ایجاد کنید .
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ] ([ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ])

همانطور که در تصویر فوق مشاهده می کنید در میان فایل های پروژه شما پوشه ای با نام Content وجود دارد . در واقع این پوشه محل منابع مورد استفاده در ساخت بازی شما هستند و در کل و در صورت عدم تغییر تمامی منابع شما از این مکان توسط فریم ورک قابل استفاده خواهند بود .
اکنون می خواهیم یک فایل به عنوان نمونه به این قسمت اضافه کنیم .
جهت انجام این کار بر روی پوشه Content راست کلیک کرده و سپس از طریق گزینه Add و سپس AddFile یک فایل تصویری تحت قالب همان جدول بالا انتخاب و وارد کنید
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ] ([ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ])[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ] ([ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ])[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ] ([ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ])
همانطور که می بینید پس از انجام این کار فایل مورد نظر به این قسمت اضافه شده اکنون باید آن را به پروژه خود منتقل کنیم
برای این کار بر روی آن راست کلیک کرده و مطابق تصویر عمل کنید:
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ] ([ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ])
پس از انجام این کار فایل شما مستقیما به پروژه اضافه میشود. اکنون ان را عملا ازمایش کنیم .
برای انجام این کار کدهای زیر را به کلاس Game خود اضافه کنید.

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید }


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


پس از اضافه کردن خطوط جدید با build کردن پروژه آن را اجرا کنید تا خروجی را مشاهده کنید :
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ] ([ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ])

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

M0hsen3D
17-04-2013, 16:14
واسه ساخت بازی برای اندروید و IOS گزینه های خیلی بهتری مثل andEngine و Cocos2D و ... هست. این به درد دولوپر های XNA میخوره که چند سالی که وقت گذاشتن رو این تکنولوژی به باد فنا نره (که رفته) و همینجوری ادامه بدن.
تازه ساخت بازی و app برای Android و IOS هم که با Xarmin پولی هست!

silsin
17-04-2013, 17:46
چی ؟ یعنی الان مایکروسافت گفته ساپورت نمی کنم دیگه همه چیزش به باد رفت ؟؟؟
زمینه مقایسه کردن چیزی با یه چیز دیگه اینه که اول باهاش کار کرده باشی و چیزی ساخته باشی اگه تا به حال کار نکردی باهاش و از این نظر می گی گزینه های خیلی بهتریه خب حرفت کاملا مردوده


تازه ساخت بازی و app برای Android و IOS هم که با Xarmin پولی هست!
رد میشه!!
وقتی می خوام اموزشش رو بدم حتما انجامش دادم
کمی هم به این موضوع فکر بشه بد نیست

mohammd1
17-04-2013, 18:17
سلام یه مشکلی هستش: من به آموزش های 1-2-4 دسترسی ندارم...خدا خیرتون بده اونا رو هم بذارید

M0hsen3D
17-04-2013, 18:49
چی ؟ یعنی الان مایکروسافت گفته ساپورت نمی کنم دیگه همه چیزش به باد رفت ؟؟؟
زمینه مقایسه کردن چیزی با یه چیز دیگه اینه که اول باهاش کار کرده باشی و چیزی ساخته باشی اگه تا به حال کار نکردی باهاش و از این نظر می گی گزینه های خیلی بهتریه خب حرفت کاملا مردوده


رد میشه!!
وقتی می خوام اموزشش رو بدم حتما انجامش دادم
کمی هم به این موضوع فکر بشه بد نیست
نه هنوز مایکروسافت نگفته که ساپورت نمیکنم اما اینکه تقریبا 2 ساله که اپدیت نشده معنیش اینه که برنامه ای واسه بروزرسانیش ندارن دیگه! ببینم نسخه ای ازXNA مخصوص VS2012 مایکروسافت داده تا الان؟ یا امکان ساخت بازی برای محیط Metro یا Windows 8 Style وجود داره؟ رو چیزی که رو هواست و اینده ای نداره خب چرا وقت بزاره ادم!
اره قبلا باهاش کار کردم بازی هم ساختم! تو همون Windows سرعت و Performance پایین تری نسبت به SharpDX و SlimDX داره(البته این 2 تارو کم کارکردم چون تقریبا باید DirectX DSK رو واسه کار باهاشون بلد باشی مثل XNA نیستن) حالا تو اندروید یا آی او اس دیگه خبر ندارم!(البته چون از OpenGL ES استفاده میشه برای اندروید یا آی او اس فکر میکنم خروجیش بد نباشه)
درکل به نظر من اینکه هنوز رو هوسات هیچی معلوم نیست ادم میترسه وقت بزاره وگرنه برای دولوپر های C# حتما گزینه خوبیه.

پ.ن: 1 سال یا بیشتر تقریبا اینجا بحث نشده بود تعجب کردم بعد این همه مدت!:n02:

silsin
17-04-2013, 20:18
نه . واقعا مایکروسافت گفته تموم شد رفت دیگه ساپورت خبری نیست . خبرش هست رو نت

درکل به نظر من اینکه هنوز رو هوسات هیچی معلوم نیست ادم میترسه وقت بزاره وگرنه برای دولوپر های C# حتما گزینه خوبیه.

موافقم . صرف همین سی شارپش ادم رو جذب می کنه :n02:



پ.ن: 1 سال یا بیشتر تقریبا اینجا بحث نشده بود تعجب کردم بعد این همه مدت
تیتر اول اموزش ها رو داشته باش
:n02:


سلام یه مشکلی هستش: من به آموزش های 1-2-4 دسترسی ندارم...خدا خیرتون بده اونا رو هم بذارید

سلام . اموزش های 1 تا 4 توی اولین پست با همه

silsin
20-04-2013, 20:52
قسمت دو بخشی :n02: 6 ام به پست 2 اضافه شد

[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

silsin
22-04-2013, 21:07
قسمت 7 ام اموزش ها از فردا
نگین یارو ول کرد :n02:

parvizamd
25-04-2013, 11:25
دمت گرم داش

silsin
25-04-2013, 13:06
* یکمی دیر شد ولی بلاخره این قسمت رو هم نوشتم :n02:
قسمت 7 :


همانگونه که این فریم ورک از کارایی بالایی برخوردار است به طبع نیز دارای مشکلاتی جدی نیز می باشد.
در ابتدای شروع این تاپیک نیز به این نکته اشاره کرده ایم که MonoGame یک پورت از فریم ورک XNA شرکت مایکروسافت می باشد . بنابراین به طبع اکثر ویژگی های پدر خود را نیز به ارث خواهد برد.
اگر چه مشکلات عمده فریم ورک MonoGame که هنوز هم در حالت توسعه می باشد در نسخه های متعدد که تا کنون ارائه میشود برطرف شده ولی هنوز به خاطر وابستگی به XNA برخی از محدودیت ها در آن به اسانی مشاهده می شود.
یکی از این مشکلاتی که به این قسمت از اموزش ها نیز ارتباط دارد مربوط به بخش ساخت Content و پکیج گیری آن به سبک خود فریم ورک جهت استفاده و امنیت آن می باشد.
سابقا در xna شیوه content managment ای به صورت طبقه بندی کردن فایل ها و سپس تغییر فرمت آنها در قالب پسوند XNB می باشد که در بخش های قبلی مورد بررسی قرار گرفت .
متاسفانه با قطع شدن پشتیبانی مایکروسافت از XNA علاوه بر عرضه نشدن این فریم ورک پشتیبانی آن نیز در ویندوز 8 و ویژوال استدیو 2012 نیز تقریبا قطع شده و اگر می توان آن را با ترفند هایی بر روی نسخه های بالاتر نصب کرد اما به واقع ویندوز 8 محدودیت های بسیاری را ایجاد خواهد کردکه البته چاره این مشکل در اینجا استفاده از پورت های xna نظیر همین MonoGame می باشد .
در XNA ساختار مدیریت Content ای وجود دارد که همانند توضیح قبل می توان مدیریت انواع منابع شامل تصاویر - صوت و غیره ... را در بازی بر عهده بگیرد و این مسئله مهمترین جزئ یک بازی می باشد بنابراین به طبع ما انتظار خواهیم داشت که MonoGame نیز همین امکانات را نیز داشته باشد اما متاسفانه در حال حاظر استفاده از این بخش در ویندوز 8 و ویژوال استدیو 2012 و نسخه ultimate ویژوال استدیو 2010 امکان پذیر نمی باشد . همچنین افزونه ان تا این نسخه هنوز به Xarmin Studio اضافه نشده که خود این امر می تواند برای محصولات تولیدی ما مشکل ایجاد کند . ( که البته با پیگیری هایی که به شخصه انجام دادم گفتن که توی نسخه جدید این مشکل رو برطرف می کنند) . برای رفع مشکل چندین راه پیشنهاد شده است :
1- استفاده از windows mobile sdk :
استفاده از این sdk به خاطر اینکه هنوز پشتیبانی مایکروسافت بر روی این پلتفرم قطع نشده می تواند امکان استفاده از بخش مربوط را برای ما فراهم کند .
2- استفاده از Content Manegment خود Xna :
می توان با استفاده از این قسمت در خود xna ابتدا منابع را به فرمت فریم ورک تبدیل کرد و سپس آن را در MonoGame استفاده کرد
اگر چه به این نکته اشاره شد که نمی توان به صورت مستقیم xna را بر روی ویندوز 8 نصب کرد اما می توان به صورت نصب اجزای آن به این قسمت دسترسی داشت
در حال حاظر به خاطر این باگ کار را بر روی ویژوال استدیو سویچ می کنیم
((همچنین یک راه ترکیب نیز وجود دارد که درصورت به وجود نیاوردن مشکل در بخش های اینده به آن اشاره خواهد شد))



برای این کار ما باید ابتدا xna را بر روی ویژوال استدیو نصب کنیم .
پس از نصب و جهت ساخت XNA Content Project مراحل زیر را انجام دهید :
ویژوال استدیو را اجرا کرده و یک پروژه جدید از نوع Windows Game ایجاد کنید
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
همانطور که در سمت راست پروژه نیز مشاهده می کنید ساختاری همانند MonoGame به وجود امده و این دلیل آن است که گفته بودیم این پورتی از Xna است .
حال باید منابع خود را وارد آن کنیم .
برای چندمین بار جدول منابع قابل پشتیبانی توسط این فریم ورک را تکرار می کنیم :




فایل های سه بعدی : .x, .fbx
تصاویر و تکسچرها : .bmp, .dds, .dib, .hdr, .jpg, .pfm, .png, .ppm, .tga
اصوات : .xap (an XACT audio project), .wma, .mp3, .wav
فونت : .spritefont
و همچنین افکت ها : Effects







جهت انجام این کار فایلی را در نظر می گیریم .
به عنوان مثال فایل زیر :


[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
در محیط ویزوال استدیو و پروژه windows Game فریم ورک Xna در سمت راست بر روی windowsGame4content در شکل زیر راست کلیک کرده و پوشه جدیدی با نام دلخواه مثلا (Content) ایجاد کنید
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
حالا باید فایل خود را وارد این پوشه کنیم . بر روی پوشه راست کلیک کرده و سپس از طریق کلیک بر روی گزینه شکل زیر و یا فشردن کلید های shift + alt + a فایل فوق را وارد کنید .
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
بر روی فایل کلیک کنید در قسمت Properties آن می توانید مشاهده کنید که گزینه های متعددی وجود دارد که از طریق ان ها می توانید نوع کامپایل و پکیج شدن فایل منبع خودتان را تعیین کنید به عنوان مثال در فایل فوق من Content خود را بر روی Texture تعیین کردم .
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
توجه کنید که دو گزینه فوق تنظیماتی جهت وارد کردن منابع و همچنین نوع پردازش آن ها در بازی است . که باید تنظیم ان ها برای بازی مورد توجه قرار گیرد . (بررسی بیشتر گزینه های این بخش در قسمت های اینده)
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
سپس با استفاده از Build > Build Solution
و یا گزینه ctrl + shift + b پروژه را یک باز از اول Build کنید .
حالا با رفتن به مسیر
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید می توانید مشاهده کنید که فایل شما با نام Arrow.xnb ایجاد شده است .
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
1124


* مسیر پیش فرض ویژوال استدیو برای ذخیره پروژه ها : C:/Users/[Username]/Documents/Visual Studio 2010
حالا باید این پکیج را وارد MonoGame کنیم .
پروژه جدیدی از نوع MonoGame Windows OpenGl ایجاد کنید .
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
سپس بر روی پوشه Content خود راست کلیک کرده و پس از انتخاب گزینه Add > Add Existing فایل Arrow.xnb که در xna و پوشه مربوط به آن ساخته شده را وارد کنید .
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
توجه داشته باشید که برای وارد کرد آن نیاز است تا در پنجره انتخاب فایل نوع فایل را All File انتخاب کنید .
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
پس از وارد کردن آن بر روی فایل وارد شده کلیک کرده تا تنظیمات آن در سمت راست و پایین صفحه نمایش داده شود.
سپس Build Action آن را بر روی Content و Copy to Output Directory آن را بر روی Copy Always قرار دهید
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
سپس پروژه را یک بار Build کرده تا فایل به پوشه پروژه شما منتقل شود .
با استفاده از این کار ما توانستیم فایل را وارد MonoGame کنیم . اکنون باید از آن استفاده کنیم
در بخش قبل با چگونگی استفاده از یک تکسچر اشنا شدید . اکنون دوباره آن مراحل را برای فایل فوق تکرار می کنیم .
متغییری از نوع Texture2d با نام Arrow ایجاد کنید . ما این متغییر را از نوع سراسری تعریف می کنیم

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
حال در متد LoadContent تکسچر فوق را وارد می کنیم

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


سپس آن را بر روی سکانس بازی ترسیم می کنیم .
برای این کار کد ترسیم این تکسچر را به متد Draw کلاس Game خود اضافه می کنیم .

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


همانطور که مشاهده می کنید فایل شما به راحتی پکیج شده و در بازی قابل استفاده است .


[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]






پایان بخش 7

silsin
26-04-2013, 12:04
قسمت 8 :
گرافیک دو بعدی !!!!
در این قسمت ما نگاهی به موجودیت گرافیک دو بعدی خواهیم داشت. گرافیک 2 بعدی و یا به اختصار 2d یکی از شیوه های نمایش تصویر بوده که در آن تنها شاهد طول و عرض یک تصویر هستیم . به عبارت دیگر استفاده از گرافیک دو بعدی می تواند در ساخت یک بازی بسیار کاربردی باشدبعلاوه اینکه ما می توانیم تماما بازی خود را به صورت دو بعدی بسازیم . برای درک بهتر این موضوع می توان موارد کاربرد گرافیک های دو بعدی را از جمله : منو ها - HUD ها و یا Spash Screen ها نام ببریم که از موارد بسیار کاربردی این گونه گرافیک ها است که در دنیای بازی های سه بعدی امروزی بیشتر به چشم ما امده است . در ادامه می خواهیم دنیای دو بعدی را بیشتر بررسی کنیم .


در واقع ابتدایی ترین تعریفی که می توان از این سیستم داشت دو بعدی بودن آن است . یعنی در سیستم محاسبات دو بعدی ما تنها طول را در اختیار داریم و عرض ولی به عنوان مثال در سیستم سه بعدی مقوله ارتفاع نیز به میان خواهد امد . همچنین یکی دیگر از تفاوت های عمده سیستم فوق با سه بعدی در حقیقت این است که در جهان دو بعدی ما تمامی مختصات ما بر اساس پیکس انجام می شود .
نکته دیگری که باید به آن توجه داشت این است که این سیستم همانند سیستم سه بعدی نسبی نیست مثلا در صورتی که بخواهیم تکسچری یا تصویر دو بعدی را در نیمی از سکانس ترسیم کنیم حتما باید محاسبه کنیم که اندازه ای که به آن اختصاص می دهیم چه مقدار از طول صفحه نمایش ما را خواهد گرفت و همچنین برای تمامی موارد دیگر نیز این مسئله صدق خواهد کرد که باید طول صفحه نمایش را هنگام ترسیمات در ذهن خود نگه داریم .
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]


در تصویر فوق می توانید نحوه ترسیم یک تصویر دو بعدی را مشاهده کنید.
همانطورکه پیش از این نیز بیان شد تصاویر دو بعدی تنها دو محور را در اختیار دارند x و y طول و عرض همانطور که در تصویر فوق می بینید تصویر فوق از مبدائ 0 و صفر شروع می شود و دو عنصر مختصاتی این سیستم تشکیل عرض و ارتفاع را در تصاویر رسم شده خواهند داد .




اسپرایت ها :
در گرافیک کامپیوتری ما اسپرایت را به صورت یک تصویر دو بعدی مشاهده می کنیم . در حقیقت این تصاویر در بازی و محصول ما کاربرد بسیاری دارند . چه ار ترسیمات دو بعدی در بازی و چه حتی در محیط سه بعدی . به عبارت دیگری می توان اسپرایت ها را تصاویر متحرک دو بعدی نیز نامید چرا که تقریبا اگر بخواهیم در محیط اینترنت به دنبال این چنین تصاویری بگردیم بیش از 80 در صد نتایج به تصاویر کوچک پیکسلی مترحک ختم خواهد شد. می توان این گونه نیز تعریف کرد که تقریبا تمامی اجزای دو بعدی سکانس ما را می توان به صورت اسپرایت در نظر گرفت (توجه داشته باشید تقریبا !! ) همچنین این اسپرایت ها علاوه بر محیط های دو بعدی در محیط های سه بعدی نیز کاربرد دارند . همانند کاربرد این تصاویر متحرک در ساخت سیستم های پارتیکل و یا حتی استفاده از آن به عنوان یک مدل (محیطی را در نظر بگیرید که از اسپرایت به عنوان عمق یک محیط استفاده شود . مثلا برای نمایش کوه ها و غیره .....)
در ادامه بخش های اینده به چگونگی استفاده از این گونه تصاویر خواهیم پرداخت
پایان بخش 8

silsin
26-04-2013, 12:05
قسمت 9 :
تمرین 1 : نقاشی فضایی!!
در این قسمت چگونگی استفاده از تصاویر و در کل رسم سکانس های دو بعدی را در صفحه بازی خواهیم اموخت .
منابع مورد استفاده :
زمین ([ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ])
ستاره ([ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ])
شاتل ([ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ])


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




شروع تمرین :
در قسمت های قبلی با مفاهیم مورد نیاز این مثال و تمرین اشنا شده ایم .
اموختیم که چگونه منابع را وارد کنیم
و مفاهیم سیستم مختصات دو بعدی را نیز تا حدودی بررسی کرده ایم .
اکنون با مثالی این مفهوم را به صورت عملی نمایش خواهیم داد.
نرم افزار کد نویسی خود را اجرا کنید :
(همانطور که در قبل نیز به آن اشاره شد برای مقایسه کاربرد دو ادیتور معرفی شده ویژوال استدیو و Xarmin Studio به تناوب هر دو را مورد استفاده قرار خواهیم داد)
من در این تمرین از ویژوال استدیو استفاده خواهم کرد .
پروژه جدیدی از نوع MonoGame Windows OpenGl Project ایجاد کنید
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
همانطور که با چگونگی وارد کرد کنتنت ها یا همان منابع در قسمت های قبل اشنا شده اید سه تصویر تمرین فوق را وارد بخش Content های این پروژه کنید .
اکنون کلاس Game را اجرا کرده و شروع به کد نویسی می کنیم .
ابتدا باید متغییر هایی برای نگه داری این سه تصویر تعریف کرد .
سه متغییر فوق را به صورت سراسری تعریف می کنیم .

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


تا اینجای کار ما سه متغییر مورد نیازمان را که از نوع تصاویر دو بعدی هستند را تعریف کرده ایم .
اکنون باید آن ها را وارد کنیم .
همانطور که می دانید برای این کار باید وارد کردن این منابع را در متد LoadContent انجام دهیم .
سه دستور زیر را به این متد اضافه کنید :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید




حالا سه تصویر شما در بازی بارگزاری شده و اماده استفاده هستند
اکنون باید آن ها را رسم کنیم .
SpriteBatche :
SpriteBatche یکی از دستورات مهم در زمینه رسم تصاویر دو بعدی می باشد . SpriteBatche شامل متدهایی است که برای رسم تصاویر دو بعدی در سکانس به کار می رود.
برای استفاده از ان باید ابتدا یک نمونه سازی از ان را انجام دهیم .
اگر چه به صورت پیش فرض این متغییر و نمونه سازی ان انجام شده است اما جهت انجام این کار ابتدا متغییر را به صورت زیر :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


و سپس نمونه سازی ان را در متد LoadContent به صورت زیر انجام می دهیم :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


جهت رسم تصاویر دو بعدی با استفاده از این دستور ما باید به متد Draw آن دسترسی داشته باشیم .
متد Draw این دستور شامل بخش های زیر می شود :
1- نام تکسچر : همان تکسچری که در متد LoadContent آن را مقدار دهی کرده ایم .
2 - مختصات طول - عرض و محل قرار گیری بر روی تصویر
3 - رنگ


برای رسم باید این کار را در متد Draw انجام دهیم .
در متد Draw ایتدا شروع و پایانی برای این رسم در نظر می گیریم .

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
حال با استفاده از متد Draw شیئ ایجاد شده Sprite Batch اولین تکسچر را رسم می کنیم .

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
پس از اجرای پروژه می توانید خروجی آن را مشاهده کنید :
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]


در ادامه دو تصویر بعدی را نیز با قرار دادن در ادامه این دستور و در متد Draw رسم خواهیم کرد .

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


* پارامتر های به کار برده شده در قسمت مختصات رسم تصاویر :
در اولین رسم ما Rectangle را داریم که شامل مختصات زیر است :
محل قرار گیری در صفحه :
طول - عرض
اندازه رسم :
طول - عرض


در دو رسم بعدی ما تنها یک محور 2 بعدی با نام Vactor داریم که فقط مختصات رسم ها را دریافت کرده و بر روی نمایش تکسچر اعمال می کنند و برعکس اولی نقشی در تغییر طول آن ها ندارند.
پس از اجرا می توانید خروجی را مشاهده کنید :


[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]


ما به خوبی توانستیم با استفاده از مفاهیمی که تا اینجا اموخته ایم یک سکانس را پیاده سازی کنیم . پیشنهاد می کنم برای تمرین بیشتر این رسم ها را با تصاویر دیگر و یا بیشتری انجام دهید .
پایان بخش 9

silsin
26-04-2013, 12:07
قسمت 10 ام از سه شنبه هفته اینده (کار دارم به خدا :n02:)

lord arthas
26-04-2013, 20:14
اینا که کداش تقریبا همون XNA عه :|

silsin
27-04-2013, 21:33
بله بله تقریبا شبیه هم هستن با این فرق که امکاناتش MonoGame رو بیشتر کردن - کد نویسی رو تا حدودی ساده تر کردن - و صد البته پلتفرم های خروجی اون رو هم اضافه کردن و یه سری چیزای دیگه .......
بد نیست یاد گرفتنش میشه یه جور یادگیری تکمیلی در کنار xna دونستش که اگه xna بلد باشی این رو هم می تونی خیلی سریع یاد بگیری

parvizamd
28-04-2013, 17:16
حسین جون ای ول داری هرچند من از هیچ کدومش خوشم نیمی اد.

iload
29-04-2013, 08:16
حسین جون ای ول داری هرچند من از هیچ کدومش خوشم نیمی اد.

سلام

پرویز یعنی این حسن رو بیچاره کردیا ! بابا حسین نیست حسنه . حسن - حسن . چند بار بگو یادت بمونه . :n02:

silsin
30-04-2013, 23:12
قسمت 10 :
بخش اول
اشنایی با تکنیک تکسچر اطلس :

قاعدتا تمام تعریف تکسچر های دو بعدی مربوط به اشکال ثابت آن ها نیست . همانطور که اشکال و مدل های سه بعدی می توانند حرکت داشته باشند و به اصطلاح انیمیشن داشته باشند این تعریف در مورد تصاویر دو بعدی انیمیشنی نیز صادق است . می توان استعاره مستقیمی از این گونه انیمیشن ها در مورد فایل های Gif داشت همانطور که همه جا این گونه فایل ها را می بینیم اینها مسئول نمایش تعداد زیادی از تصاویر هستند که ممکن است در هر فریم تنها میزان کمی تغییر داشته باشند اما اگر تمامی آنها پشت سر هم قرار داده شوند خواهید دید که مثلا تشکیل به حرکت در امدن یک کارکتر را در سکانس می دهند . توجه به این مسئله مهم است که در تکنیک انیمیشن دو بعدی حتما باید برای هر کدام از حرکات مجموعه ای این گونه تصاویر به وجود بیایند . به عنوان در شکل زیر :

[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ] ([ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ])

می توان مشاهده کرد که برای به حرکت در امدن یک و یا دو قدم مجموعه تصاویر پشت سر همی از هر فریم تغییر حرکت به وجود امده که با نگاه به این تصویر اگر ان را ده فریم فرض کنیم در هر فریم تغییرات از شروع به حرکت تا پایان حرکت رسم شده است .
از کاربرد های این گونه های اسپرایت ها یا همان تصاویر انیمیشنی دو بعدی می توان به اکتور های صحنه اشاره کرد . کارکتر اصلی - دشمنان - اسلحه - پارتیکل - پرنده و حتی ایتم ها .....
در مثالی دیگر می توان کارکتر زیر را در نظر داشت :
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
در صورتی که مثلا بخواهیم مثلا این کارکتر را در حالت راه رفتن مشاهده کنیم ابتدا باید به اندازه کافی کنترل آن را در اختیار بگیریم تا در هر جای سکانس که می خواهیم به حرکت در بیاید و سپس باید حالات حرکت آن را نیز بر روی صفحه ترسیم کنیم . در حالت تصاویر Gif مشاهده می کردیم که هر کدام از حالات انیمیشن به صورت تصاویر جداگانه پشت سر هم اجرا می شد که در اینجا مطمئنا کاربردی ندارد که چون ابتدا سرعت اجرای آن و کیفیت نسبتا پایین است و در ضمن نمی توان از تصاویر پشت سر هم در اکثر انجین های ساخت بازی جهت خلق اسپرایت انیمیشن استفاده کرد (اکثرا) جهت بر طرف شدن این مشکل از تکنیکی که آن را اطلس می نامیم استفاده می کنند . در این تکنیک به جای استفاده از تصاویر جدای تکنیک Gif که پشت سر هم اجرا می شوند تمامی تصاویر را به همراه تغییرات در کنار هم قرار می دهیم . مانند تصویر زیر :
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
که در ان می توان بازه تمامی حرکات مورد نیاز را ترسیم کرد که در اینجا تمامی تکسچر های حرکتی که در قبل برای انجام و بارگزای آن ها به عنوان زمانی که کارکتر اقدام به حرکت می کرد که باید هر کدام را جداگانه در زمان بارگزاری و اجرا می کردیم در اینجا برعکس همه ان تصاویر را بر روی قالب بزرگ و اطلس واری قرار داده و آن گاه به آنها دسترسی پیدا می کنیم .
نحوه اجرا شدن این گروه از تکسچر ها نیز به صورت مقابل می باشد :


4 3 2 1
8 7 6 5
12 11 10 9
16 15 14 13

ehsan_wwe
01-05-2013, 22:43
مرسی خیلی عالی بود شرمنده یه نه ماهی درگیر کارو زندگی شدم
خیلی آموزش خوبی بود ممنون:n12:

lord arthas
02-05-2013, 00:42
کـــاش منبعو ذکر میکردی :n15:

[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

silsin
02-05-2013, 08:57
یعنی اول سوال نمی کنن فقط می خواد یه چیزی گفته باشن .
مرد حساب منبع کیلو چنده ؟؟؟ تنها کمکی که من دارم از اون سایتی که دادی می گیرم اینه که بر اساس سرفصل هایی که گفته دارم جلو می رم
یعنی واقعا .......

silsin
21-05-2013, 21:48
قسمت 10 :
محتوا : تمرین 2




در این بخش فرا خواهیم گرفت که چگونه می توانیم تکسچر اطلس ها را در سکانس رسم کرده و از آن ها استفاده کنیم .




شروع :


ابتدا پروژه جدیدی را ایجاد کنید .
ما در این مثال می خواهیم ساختار کار با تکسچر ها را یا به عبارتی می توان گفت ساختار Texture Navigator را از ابتدا پیاده سازی کنیم .
برای این کار ما باید کلاس مربوط به انجام این کار را در پروژه خودمان به وجود بیاوریم .
برای انجام این کار در محیط ویژوال استدیو سمت چپ که مکان Sulotion شما قرار دارد بر روی فایل پروژه خود راست کلیک کرده و از قسمت Add گزینه Class را انتخاب کرده نام کلاس را برابر با AnimatedSprite قرار داده و گزینه Add را زده تا کلاس ایجاد شود.
از انجایی که کلاس فوق یک کلاس خالی است و فعلا هیچ دسترسی به منابع MonoGame ندارد باید هدر های ان را اضافه کنیم .
برای انجام این کار دو هدر زیر را اضافه کنید :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید




اکنون باید چند متغییر به کلاس برنامه خود اضافه کنیم



برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
متغییر فوق وظیفه نگه داری تکسچر ما را به عهده دارد .

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
این دو متغییر جهت نگه داری مقادیر سطر و ستون محل واقع شدن هر تکسچر به کار می رود

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
اولین متغییر جهت مشخص کردن فریمی که در حال حاظر در آن قرار داریم
و دومین متغییر نیز برای نگه داری تعداد فریم های نهایی می باشد




به دلیل اینکه ما میخواهیم از این کلاس به صورت یک نمونه در کلاس اصلی خودمان استفاده کنیم پس باید متد مولد فرم را نیز به ان اضافه کنیم تا بتوانیم از کلاس های دیگر به این کلاس دسترسی داشته باشیم . توجه داشته باشید که نوع متد را Public تعریف کرده تا دسترسی بدون مشکل باشد

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


توجه داشته باشید که متد مولد این کلاس باید سه مقدار :
تکسچر
سطر
و ستون را در خود داشته باشد برای همین آن ها را به مقادیر متد اضافه می کنیم



برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


و در ادامه شروع می کنیم به مقادیر دادن

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
سپس مقدار اولیه فریم جاری را برابر با 0 قرار داده

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
همچنین برای به دست اوردن مقدار نهایی یعنی مقدار کل نیز باید سطر را ضرب در ستون کنیم

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

اکنون کار متد مول تمام شده و باید متد دیگری را ایجاد کنیم
در اینجا متد Update() را برای این کلاس ایجاد کنید .
توجه کنید که دسترسی را برابر با Public قرار داده تا بتوان هنگام استفاد از مقادیر آن به مشکلی بر نخورد .

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

در اینجا وظیفه این متد این است که فریم جاری ما را به فریم بعدی ببرد برای همین باید مقدار شمارنده متغییر فریم جاری را در این متد +1 کنیم

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


همچنین شریط نیز تعیین کنیم که هنگامی که فریم جاری برابر با تعداد کل فریم های موجود شد و اسپرایت انیمیشنی یک بار خوانده شد مقدار فریم جاری دوباره برابر با 0 شود

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید




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


هدف در این متد این است که ما بتوانیم تصاویر مربوطه را در یک قالب مشخص نمایش دهیم .


جهت انجام ان باید مجموعه کارهای فوق را انجام دهیم .


همانطور که بیان شد هدف نمایش یک تصویر از مجموعه اطلس و سپس اجرای تصاویر دیگر مجموعه به دنبال آن است تا بتوان نمایشی از یک مجموعه انیمیشنی در تصویر فوق داشت. از انجایی که ما در کار با این فریم ورک فاقد هرگونه ادیتور جهت دسترسی به هر سطر و یا ستون هستیم باید خودمان این دسترسی را ایجاد کنیم .
جهت انجام این کار باید کمی بازی و ریاضی ساده ای انجام دهیم .
همانطور که تصویر فوق را مشاهده کرده اید مدل اطلس ما یک تصویر با اندازه 256 در 256 می باشد.
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
چون در این حالت هر کدام از اسپرایت های مجموعه اطلس تشکیل یک مربع را می دهند برای دسترسی به آن ها ما هم باید مجموعه اسپرایت اطلس خودمان را به مربع های کوچک تقسیم کنیم به این صورت که برای به دست اوردن عرض باید عرض تصویر موجود را در تعداد ستون تقسیم کنیم
همانطور که در تصویر هم می توان مشاهده کرد عرض تصویر ما 256 بوده و ستون 4 با تقسیم این دو بر هم مقدار عرض تصویر که برابر با 64 است به دست خواهد امد.
برای به دست اوردن طول تصویر نیز همین مراحل را تکرار می کنیم با این تفاوت که اینبار طول تصویر را تقسیم بر تعداد سطر می کنیم .
که اینبار هم می توانید مشاهده کنید عدد فوق برابر با 64 خواهد بود . اگر تصویر را هم با دقت مشاهده کنید می توانید متوجه شوید که این مختصات در برگیرنده یکی از آن اسپرایت ها می باشد با این کار ما توانستیم طول و عرض موقعیت هر کدام از اسپرایت ها را به دست بیاوریم .


همانطور که گفته شد در این حالت و در این کلاس ما ساختار به اصطلاح sprite reader را به وجود میاوریم بنابراین باید علاوه بر به دست اودن مقادیر طول و عرض باید مقادیر مربوط به سطر و ستون فریم جاری را نیز به دست بیاوریم .
ابتدا برای به دست اوردن سطر ما باید فریم جاری را تقسیم بر تعداد کل ستون کنیم
و برای به دست اوردن ستون ما باید همان فریم جاری را اینبار تقسیم باقیمانده بر تعداد کل ستون ها بکنیم .
با استفاده از این راه مقدار سطر و ستون در ناحیه مورد نظر به دست می اید .


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


و در انتها اعمال تابع Draw در این متد و نسبت دادن مقادیر فوق به آن



برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


* در صورت نامفهموم بودن کد نگران باشید در بخش های اینده مثال های متعددی از این توع را بررسی خواهیم کرد .

silsin
21-05-2013, 21:51
قسمت 10 :
بخش اخر
استفاده از متد :
در دو دقسمت قبل با مفهمون تکسچر اطلس اشنا شده و توانستیم ساختار اجرایی آن را به وجود بیاوریم . در اینجا می خواهیم آن را استفاده کنیم .


جهت انجام این کار ابتدا تکسچر اطلس مورد نظر خود را در متد LoadContent بارگزاری می کنیم .

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


سپس یک متغییر از نوع کلاسی که در بخش قبل ساخته ایم ایجاد می کنیم

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
و ان را نمونه سازی می کنیم

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
مقدار Texture بیان گر متغییر تکسچری است که ما در متد LoadContent ان را بارگزاری کرده ایم
و دو مقدار 4 نیز نمایش دهنده سطر و ستون تکسچر اطلس ما می باشد .


اگر فراموش نکرده باشید ما در متد Update در کلاس قبلی خود ساختار اجرای فریم های اسپرایت اطلس خود را ایجاد کرده بودیم
با اشاره به همان متد می توانیم فریم های اسپرایت اطلس خودمان را اجرا کنیم .

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
برای اجرا کد فوق را در متد Update کلاس اصلی بازی خود قرار دهید
و در انتها با استفاده از دستور Draw تکسچر را رسم می کنیم .

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


خروجی :
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]


پایان قسمت 10

silsin
21-05-2013, 21:53
عنوان : چرخش
یه مثال جالب توی سایت منبعی که دارم برای اموزش ازش استفاده می کنم دیدم که بهتر دونستم بیام اینجا بگم
خب هدف اینه که توی این جا یه تصویر رو بگیریم و بچرخونیم دور خودش


لینک دانلود :
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
خب کنتنت رو وارد نرم افزار می کنیم طبق روشی که توی قسمت های قبلی یاد گرفتیم
یک متغییر از نوع texture2d ایجاد کرده تا تکسچرمون رو بتونیم در اون قرار داده و استفاده کنیم



برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


خب تکسچر رو مقدار دهی می کنیم و خورشید رو وارد می کنیم

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


برای شروع اولین کاری که می کنیم اینه که تکسچر رو روی صفحه رسم کنیم .


اولین کار اینه که مثل قبل تکسچر رو رسم کنیم



برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


خب اینجا از یه مستطیل استفاده کردیم تا بتونیم هم موقعیت و هم اندازه رو هم با هم داشته باشیم
یک بار اجرا کنید تا بتونید اولین خروجی رو ببینیم :
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]




خب در اینجا باید یه مقدار رو تعریف کنیم تا با به روز رسانی مقدار داخلی خودش مقادیر مورد استفاده ما رو بهمون بده
برای همین یه متغییر float توی تابع update تعریف میک نیم تا به روز بشه
float Angle +=0.01f
خب الان این توی هر تیک مقدارش اضافه میشه


در ادامه توی متغییر Draw باید یک سری مقادیر رو اضافه کنیم
اول مقدار Location مربوط به تصویر شما
یه متغییر از نوع برداری دو بعدی

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
در مرحله دوم باید متغییری رو تعریف کنیم که مکان فعلی رو توی خودش نگه میداره

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
سپس و در ادامه باید متغییر مربوط به بک گراندی که تصویر روش قرار می گیره رو تعریف کنیم

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


خب حالا Draw رو اینجوری باید تغییر بدیم
مقادیر :
به ترتیب

-- نام تصویر
--- Location (مختصاتی که قرار توی صفحه قرار بگیره)
--- همون بگ گراندی که گفته بودم بالا
--- رنگ
-- مقدار چرخش (ما چون می خوایم اون رو بچرخونیم یه متغییر از نوع شناور تعریف کردیم که دائم اضافه میشه پس از اینجا می تونه تصویر رو بچرخونه)
-- مکان اولیه
-- اندازه
-- چینش تصویر
-- عمق


خب حالا کد رو اینجوری می نویسیم

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


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

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
حالا وقتی که اجرا کنیم می بینیم که از وسط در حال چرخشه
ولی یک مشکل وجود داره و اونم اندازه این تصویره . در اینجا کمی کوچیکتر می کنیم
برای این کار می تونید متغییر scale اندازه تصویری رو که توی متد Draw استفاده کردیم رو کوچیکتر کنیم
اگه باز هم مشکلی وجود داره مقادیر و بازه ها رو تغییر بدین تا درست بشه .
برای اخر کار هم برای تنوع رنگ پیش زمینه رو هم تغییر می دیم . برای اینکار باید صفحه یک بار با اون رنگ پاک بشه . دسترسی به این متغییر توی متد Draw قرار دارده

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
ما رنگ رو سفید کردیم تا قشنگ تر بشه :))

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


خروجی :
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

silsin
21-05-2013, 21:54
خب با این تمرین مبحث مربوط به کار با اسپرایت های دو بعدی تموم میشه و میریم سراغ ساخت یه پروژه تمرینی . البته قبل از اون یه سری قسمت ها هم باید در مورد input بیاد که از اونطرف واسه سه بعدی عقب نیفتیم


تمرین : بازی با رنگ ها
هدف از این تمرین اینه که بیایم سه سری رنگ رو با یه انیمیشن جالب با هم دیگه ترکیب کنیم
رنگ هایی که ما توی این تمرین از اون استفاده می کنیم شامل :


red.png ([ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ])
green.png ([ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ])
blue.png ([ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ])


مثل قبل اونها رو وارد پکیج بازی بکنید.
ما برای این رنگ ها از سه متغییر Red . Blue .Green استفاده خواهیم کرد . پس این سه متغییر رو تعریف می کنیم

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


سپس سه تکسچر مورد نظر رو از طریق متد LoadContent وارد می کنیم

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


پس از این کار برای شروع اولین تکسچر رو مثل قبل بر روی سکانس رسم می کنیم



برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]


اولین کاری که ما می خوایم انجام بدیم به حرکت در اوردن این تصویره که نمونه اون رو توی قسمت قبلی باهم دیدیم .
برای این کار باید خواص Destanation ای که زمان رسم در اختیار می گیریم رو تغییر بدیم . این مقدار همون مقدار Location توی مثال قبلیه .
پس برای این کار باید یک متغییر جدید تعریف کنیم .
از اونجایی که این مقدار باید یک ورودی از نوع برداری داشته باشه یک متغییر برداری تعریف می کنیم
و کد رو اینجوری تغییر می دیم :



برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید



از اونجایی که هدف متحرک بودنه پس طبیعتا باید یک اهرم فشار دینامیکی هم برای انجام لحظه ای این کار وجود داشته باشه . برای اینکار ما یک مقدار را به عنوان مقدار جمع کننده ای که با هر تیک انجین اضافه میشود را باید تعریف کنیم .
برای این کار یک متغییر از نوع float در قسمت Update تعریف کنید

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


و مقدار اون رو برابر با 0.01f قرار بدین

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
با این کار تا زمانی بازی متوقف نشه متغییر سرعت یک صدم یک صدم اضافه میشه
اینبار به متد Draw بر می گردیم
اگر توجه کرده باشید ما در ابتدای هر رسم خود از یک متد شروع و پایان استفاده می کنیم . در اصل این دو متد ساختار از زمان شروع شدن رسم تا پایان آن را در خود نگه می دارند پس قاعدتا می توانند نوع و چگونگی رسم را نیز در خود داشته باشند . اگر محتویات SpriteBach.Begin را مشاهده کنید می توانید ببینید که دو مقدار که یکی جهت نگه داری نوع چینش و دیگری برای نگه داری نوع تعویض به کار می رود .
قبل از ادامه کار کد زیر را به این قسمت اضافه کنید تا تاثیر استفاده از محتویات این قسمت ها را مشاهده کنید





برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]




به نظر میرسه که اندازه ای این تصویر کمی بزرگه که باید کوچیک تر بشه برای این کار کد رو به این صورت تغییر میدیم



برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


کمی بهتر شد . حالا باید بر روی حرکت دادن این تصویر تمرکز کنیم . برای این کار تنها راهی که میشه ازش استفاده کرد حرکت به صورت دایره ایه که بخوایم تصویر ریاضی هم داشته باشیم اون رو می تونیم با ترکیب محور ها با متغییرهای سینویسی و کسینوسی رسم کنیم . برای این کار کد رو به این صورت تغییر میدیم



برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


همونطور که مشاهده می کنید ما محور x رو برابر با سینوس بر اساس سرعت قرار دادیم و اون رو ضرب در 100 کردیم و محور y رو هم برابر با کسینوس قرار داده و اون رو هم ضرب در 100 کردیم .


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


اینطور که به نظر میاد مختصات کمی بهم بخوره . کد بخش رسم رو به این صورت تغییر میدیم تا بتونیم اون رو درست کنیم


[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]





برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

خب دایر ه اول با موفقیت رسم شد سعی کنید مقادیر رو تغییر بدین تا بتونین دایره رو به وسط سکانس منتقل کنید
خب بعد از این کار باید دایره دوم رو رسم کنیم .
هدف در این جا اینه که این دایره به دور دایره قبلی که رسم شده رسم بشه.
طبق معمول پس از فراخونی دایره دوم باید اون رو در سکانس رسم کنیم .
سپس برای شروع تمام مقادیر دایره جدید رو مثل دایره قبلی قرار میدیم .
اجرا کرده تا نتیجه رو مشاهده کنید



برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
همونطور که میبینید دو رنگ با یکدیگر ترکیب شده اند که این موضوع نشان دهنده کاربرد دو مقدار متد Begin در این قسمت می باشد
ما با استفاده از همان متغییر برداری RedMove می خواهیم نحوه حرکت این تصویر را نیز به وجود بیاوریم پس مانند کد زیر عمل کنید



برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


در اینجا ما فقط مختصات و همچنین اندازه را تغییر داده ایم
یک بار دیگر خروجی را مشاهده می کنیم
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
همونطور که مشاهده می کنید یک تصویر جالب به وجود امده
خب با تصویر سوم هم هر کاری دلتون می خواد بکنین :))
طی این تمرین ما تونستم یاد بگیریم که چه طوری تصاویر رو با شیوه های مختلفی با هم ترکیب - تعویض کرد . توجه کنید که می تونید از این قابلیت بسیار مفید در هر جایی از بازی برای زیبا تر شدن خروجی نهایی استفاده کنید

parvizamd
23-05-2013, 06:01
حسن جان خیلی جالبه . این ابزار رایگانه یا نه؟یعنی تحریم نیستیم یا ؟

ممنون

silsin
23-05-2013, 11:59
MonoGame به خودی خود رایگانه رایگانه و اوپن سورس . بیشترین دلیلی که ملت میرن سراغش اینه که علاوه بر مولتی پلتفرم بودن خروجی هاشه و همچنین قابلیت کار کردن با دایرکت ایکس 11

lord arthas
23-05-2013, 14:39
باشه داداش چرا ناراحت میشی حالا :n03:

silsin
23-05-2013, 14:46
ورودی های صفحه کلید
از این بخش تا چند قسمت اینده مسائل و چگونگی استفاده از ورودی های صفحه کلید رو با هم بررسی خواهیم کرد

مقدمه :
میشه گفت ضروری ترین مسئله در یک بازی رایانه ای دریافت ورودی از بازیکن می باشد چه این ورودی شامل صدا و یا تصویر باشد و چه ورودی گیم پد و یا صفحه کلید . بدون اینها بازی ما فقط یک نمونه انیمیشنی به شمار میره. ما در این اموزش نگاهی اولیه به چگونگی دریافت و پردازش ورودی ها از کاربران خواهیم پرداخت و در اموزش های اینده پوشش بیشتری بر تمامی حالا ممکن این کار خواهیم داشت


ورودی های صفحه کلید :
میشه گفت انجام این کار یعنی دریافت ورودی از صفحه کلید واقعا یه کار ساده است که میشه با ساده ترین و سریعترین راه این کار رو انجام داد .
مطمئنا اگه سری های قبل اموزش رو دنبال کرده باشین در قسمتی که ما عملگرد هر بلاک از متد ها رو مورد بررسی قرار می دادیم گفتیم که از متد Update که تا انتهای بازی اجرا میشود علاوه بر استفاده های دیگر برای دریافت تمامی ورودی های کاربر استفاده می کنیم . پس مسلما بهترین مکان هم برای دریافت ورودی ها همین جا میباشد
برای شروع ما باید ببینیم که چگونه می تونیم به ورودی های صفحه کلید دسترسی داشته باشیم .



برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


کلاس صفحه کلید داری متدی برای برگشت دادن وضعیت فعلی صفحه کلید داشته که هر زمانی که اتفاقی برر روی صفحه کلید رخ بدهد این متد صدا زده می شود. .وضعیت فعلی صفحه کلید در شیئ KeybordStat ذخیره می شود. در خط کد بالا ما در واقع وضعیت فعلی صفحه کلید خود را صدا زده ایم .
حال که متغییر صفحه کلید ما با مقدار وضعیت فعلی صفحه کلید مقدار دهی شده ما باید ببینیم که چگونه می تونیم از اون استفاده کنیم . برای محاسبه و تشخیص زمانی که یک کلید فشرده می شود یا نمی شود ما می تووانیم از متد IsKeyDown در کلاس KeyBoardState استفاده کنیم که در زیر می تونید یک نمونه از اون رو مشاهده کنید :

کد PHP:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
و یا ما می تونیم از اون به عنوان بخشی از یک شرط استفاده کنیم که هر زمانی که اتفاق افتاد شرط را اجرا کند
کد PHP:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
همونطور که در اینجا می بینید ما دو مثال از IsKeyDown که هر دو وظیفه برگردوندن مقادیر صحیح و یا غلط رو بر عهده می گیرن رو به کار بردیم .


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

کد PHP:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
این شرط باید مقدار صحیح را هز مانی که کلید مربوطه زده شد را بر گرداند . اکنون بیاید مثالی را با هم انجام داده تا به وسیله ان بتوانیم مقادیر قبل و حال کلید های خود را در اختیار بگیریم .
برای این کار ما باید وظعیت قبلی کلید خود را در اختیار داشته باشیم .
مانند قبل باید یک وضعیت جدید برای صفحه کلید تعریف کنیم
کد PHP:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
سپس در متد Update کد های زیر را اضافه کنید تا بتواند وضعیت حاظر را دریافت , رسیدگی و وضعیت قبلی را به روز رسانی کند :


کد PHP:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

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

علاوه بر تمامی اینها کلاس KeyboardStat متد دیگری را نیز در اختیار ما قرار خواهد داد که با استفاده از آن می توانیم کلید های فشار داده شده را نیز شناسایی کنیم . با استفاده از متد GetPressedKeys می توان تمامی کلید های فشار داده شده را در اختیار گرفت . به عنوان مثال ما در قطعه کد زیر می توانیم لیستی از تمامی کلید های فشار داده شده را داشته باشیم :

کد PHP:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
عمل دیگری که می توانیم در این قسمت انجام دهیم چند کلیدی بودن صفحه کلید می باشد . به عنوان مثال ما می خواهیم یک عمل را زمانی انجام دهیم که کاربر کلید کار Ctrl + c را با هم فشار میدهد و یا اعمال دیگر برای این کار می توانیم مانند کد زیر این عمل را انجام دهیم :

کد PHP:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

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

silsin
23-05-2013, 14:49
تمرین : ورودی های صفحه کلید

از قسمت قبلی می خواهیم مثالی را برای در ک بهتر با کمک یکدیگر انجام بدهیم . در این مثال ما می خواهیم با استفاده از ورودی های صفحه کلید یک تصویر را با استفاده از از نشانه گر های صفحه کلید به حرکت در بیاوریم . جهت این کار یک تصویر انتخابی را وارد کنید .
ما در اینجا از یکی از تصاویر رنگ هایی که در بخش اخر دو بعدی از آن استفاده کرده ایم کمک می گیریم . ابتدا آن را وارد پکیج بازی کرده متغییر آن را تعریف کنید .
کد PHP:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
سپس آن را در متد LoadContent فراخوانی خواهیم کرد
کد PHP:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
پس از آن این تصویر را در متد Draw بر روی سکانس رسم می کنیم .

کد PHP:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
یک بار خروجی گرفته تا از صحت رسم مطمئن شوید .
اکنون باید متغییر مربوط به دریافت وضعیت صفحه کلید را ایجاد کنیم
همانطور که در قمت قبل به ان اشاره شد معیار وضعیت دریافت لحظه ای حالات صفحه کلید می باشد پس ابتدا متغییری را که وظیفه دریافت این حالات را بر عهده دارد تعریف میک نیم
کد PHP:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
با این کار ما Stat را زمانی که یک کلید را فراخوانی می کنیم مقدار دهی خواهیم کرد .
توجه داشته باشید همانطور که در تعریف نیز امده بود به خاطر ماهیت اجرای لحظه ای این متغییر ما باید آن را در متد Update که تا اخر بازی با کاربر ارتباط داشته و اجرا می شود تعریف کنیم پس این متغییر را نیز باید در همان متد تعریف کنیم .
مرحله بعدی که ما باید آن را انجام دهیم این است که شرط مربوط به اجرا را به وجود بیاوریم . برای این کار ما نیاز به وضعیت صحیح Stat خود داشته و همچین در صورت وقوع آن باید مقدار شمارنده ای را افزایش دهیم . برای این کار می توانیم ابتدا یک متغییر از نوع Float به صورت سراسری تعریف کرد و سپس در این شرط آن را افزایش دهیم .

کد PHP:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
کد PHP:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
حال در هر بار اجرای کلید سمت راست صفحه کلید این مقدار اضافه خواهد شد. اکنون باید این متغییر را استفاده کنیم .
برای این کار متغییر مربوط به Location تصویر رسم شده خودمان را تغییر می دهیم

کد PHP:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
همچنین می توان با اضافه کردن یک ساختار else به شرط قسمت فشار دادن کلید نیز اعمال بیشتری انجام داد . برای این کار ما یک شرط در غیر اینصورت اگر با محتوای اگر کلید سمت چپ فشار داده شد مقدار float را کم کن اضافه می کنیم

کد PHP:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
با تغییر ساختار به این شکل می توانید مشاهده کنید که تصویر به دو طرف چپ و راست با فشار دادن کلید های مربوط حرکت می کند . اکنون می خواهیم سمت بالا و پایین را نیز به وجود بیاوریم . برای این کار ابتدا متغییرfloat ای را برای این کار به صورت سراسری تعریف می کنیم

کد PHP:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

و سپس شرط مربوط به آن را ایجاد می کنیم

کد PHP:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

سپس آن را در قسمت y متغییر برداری خودمان در بخش رسم قرار می دهیم .

کد PHP:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
حال اجرا کرده و نتیجه را مشاهده کنید .
اکنون مانند قبل شرط دوم را برای ساخت کلید پایین به وجود بیاورید


کد PHP:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
در انتها اجرا گرفته و می توانیم نتیجه را مشاهده کنیم .
در این تمرین ما با چگونگی استفاده از کلید های صفحه کلید در یک پروژه اشنا شدیم . توجه کنید همانطور که در بخش قبل نیز به ان اشاره شد شما می توانید با تقریبا تمامی کلید های صفحه کلید برای انجام هر کاری دسترسی داشته باشید . بیشتر در این قسمت تمرین کرده تا بتوانیددستورات متنوع تری را به وجود بیاورید .

silsin
23-05-2013, 14:52
عنوان : ورودی های ماوس

در بخش قبل با چگونگی دریافت ورودی از صفحه کلید اشنا شده اید اکنون می خواهیم نحوه دریافت ورودی ها از ماوس کامپیوتررا با هم بررسی کنیم

اعمال ورودی ماوس :
دریافت ورودی از ماوس بسیار اسان می باشد . و اگر شما دریافت ورودی از سایر ورودی ها را کار کرده باشید به راحتی می توانید این قسمت را به وجود بیاورید . همانند قبل محیط معمول برای دریافت و اعمال این ورودی ها همان متد Update می باشد . برای دریافت یک ورودی از یک ماوس باید یک وضعیت ماوس تعریف کرد :
کد PHP:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
حال این متغییر جدید را برابر با مقدار فعلی کلیک ماوس قرار می دهیم

کد PHP:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
کلاس MouseState شامل تمامی اطلاعات مورد نیازی است که ما می خواهیم در مورد وظعیت کنونی یک ماوس بدانیم .
سپس ما باید کاری را انجام داده تا زمانی که عمل کلیک ماوس انجام شده ما بتوانیم متوجه شویم :

برای این کار ابتدا باید مقدار کلید فشار داده شده MouseStat
که یکی از سه حالت :
-- RightButton
-- LeftButton
--MiddleButton
می باشد را برابر با زمان اجرا کلید یعنی Pressed شده آن کلید قرار دهیم

کد زیر را به کد ها اضافه کنید :


کد PHP:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
اکنون هر کدی که در این شرط قرار بگیرد با کلیک چپ ماوس اجرا خواهد شد .

اکنون می خواهیم حالتی ایجاد کنیم تا بتوانیم وضعیت کلید قبلی و کلید حاظر فشار داده شده را دریافت کنیم برای این کار کدهای زیر را به این قسمت اضافه کنید :

کد PHP:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

کد PHP:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

عملکرد این کد همانند نمونه مشابه قسمت صفحه کلید می باشد .

همچنین ما می توانیم مختصات مکانی نشانه گر ماوس را به طریق زیر دریافت کنیم

کد PHP:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
با اینکار به صورت لحظه ای مختصات تغییرا ماوس در دو متغیر تعریف شده قرار خواهد گرفت .


تغییر مختصات ماوس :
با استفاده از متد SetPosition در کلاس MouseState می توانیم مختصات فعلی ماوس را به دلخواه تغییر دهیم

کد PHP:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
تا اینجا با چگونگی استفاده از وضعیت های مختلف ماوس اشنا شده اید . همچین باید بدانید علاوه بر وضعیت فشار داده شدن کلیک یک ماوس که Preesed نامیده میشود وضعیت دیگری نیز با نام Release وجود دارد که مربوط به زمانی میشودک ه کلیک یعنی هر کلیدی از حالت انتخاب خارج شده است

در قسمت بعد با مثالی عملی کاربرد دستورات و متد های توضیح داده شده را بررسی خواهیم کرد .

silsin
23-05-2013, 14:54
یه دو سه قسمت اضافه شد :n02:
نمی دونم چرا کار با این خیلی بیشتر از یو دی کی بهم مزه میده :n02:

silsin
26-05-2013, 17:17
تمرین : ترکیب ماوس و صفحه کلید

در این تمرین می خواهیم با استفاده از هر دو ورودی ماوس و صفحه کلید یک تصویر را در صفحه رسم کرده و سپس با استفاده از کلید E در صفحه کلید آن تصویر را پاک کنیم
در این تمرین ما از تصویر زیر برای تصویر رسم شده :
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ] ([ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ])

و از اشاره گر تمرین قسمت قبلی برای تغییر اشاره گر ماوس استفاده خواهیم کرد
برای شروع دو تصویر فوق را وارد پکیج بازی کنید
ابتدا ساختار تغییر ماوس که در بخش قبلی فرا گرفته ایم را دوباره انجام می دهیم .
خاصیت پنهان کرده ماوس در صفحه بازی را در متد اغازین تعریف کنید :
کد PHP:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
* با استفاده از تکه دستور زیر می توانید Title بالایی صفحه بازی خود را تغییر بدهید
کد PHP:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
اکنون متغییر آن را تعریف کرده و تصویر را وارد کنید :

کد PHP:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
کد PHP:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
مختصات فعلی ماوس را در دو متغییر از نوع Int قرار داده :

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
و سپس تصویر را رسم کرده و این متغییر را به مکان تصویر نسبت می دهیم :

کد PHP:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

اکنون پروژه را اجرا کرده تا از صحت کار اطمینان حاصل کنید
پس از انجام این کار حال باید تصویر دوم را وارد کنیم .
متغییر زیر را به صورت سراسری تعریف کنید :

کد PHP:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
و این متغییر را در متد LoadContent به وسیله تصویر توپ خودمان مقدار دهی می کنیم :

کد PHP:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

سپس ان را در متد Draw بر روی سکانس رسم می کنیم :
کد PHP:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

کد PHP:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

یک بار اجرا گرفته تا خروجی را مشاهده کنید :
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]



در ادامه اجرا را قدم به قدم به وجود میاوریم :
ابتدا باید کاری کنیم که با کلیک ماوس بر روی سکانس تصویر ما رسم شود . برای این کار ابتدا باید تعامل با کلیک ماوس را به وجود بیاوریم :
به متد Update که مکان تعریف مختصات ماوس ما بود رجوع می کنیم. با استفاده از کلاس MouseStat شرطی را بنابر فشار داده شدن کلیک چپ ماوس ایجاد کرده :

کد PHP:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
یک متغییر سراسری از نوع bool ایجاد کرده و خاصیت true شدن آن را در شرط بالا قرار می دهیم :

کد PHP:

bool st;


کد PHP:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


اکنون دوباره به متد Draw باز گشته یک ساختار جدید رسم ایجاد می کنیم و رسم توپ را در آنجا قرار می دهیم

کد بخش Draw کلاس شما به این صورت خواهد بود :


کد PHP:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
اکنون بخش رسم توپ را در یک شرط قرار داده و می گوییم اگر st برابر با true شد آنگاه رسم را انجام بده

کد PHP:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

حال اگر پروژه را اجرا کنیم می توانیم مشاهده کنیم که با زدن دکمه چپ ماوس تصویر بر روی سکانس رسم می شود

* سوال :
چه کار کنیم که تصویر در مختصات فعلی ماوس ما رسم شود ؟؟؟؟ (ببینم کسی بلده
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
)


حال باید وضعیت دسترسی صفحه کلید را تعریف کنیم تا بتوانیم شرط مربوط به کلید Eرا در آن به وجود بیاوریم .
در متد Update وضعیت مربوط به صفحه کلید را ایجاد کنید :

کد PHP:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

سپس با اضفاه کردن شرطی خواهیم گفت که اگر کلید E ما فشار داده شد متغییر bool st را برابر با false قرار بده
کد PHP:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
اکنون با بازگشت به متد Draw در ادامه شرط تشکیل تصویر یک شرط دیگر قرار داده تا هنگامی که متغییر false شد تصویر را پاک کند


کد PHP:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
اکنون پروژه را اجرا کرده و تست کنید
* از طریق کد اورده شده در شرط دوم می توانیم اخرین رسم انجام شده را پاک کنیم

در دو مثال اخیر ما توانستیم با استفاده از قابلیت هایی که ماوس و صفحه کلید در اختیار ما قرار می دهد دو پروژه را ایجاد کنیم . برای تسلط بیشتر توصیه می کنم که تمرین های بیشتری را انجام دهید

silsin
26-05-2013, 17:21
عنوان : دانلود ابزار
با استفاده از این ابزار می تونید کنتنت های مورد نظر خودتون رو بدون استفاده از روش های Content Pipline داخلی به فرمت xnb کامپایل کرده و از اون در بازی خودتون استفاده کنید

لینک دانلود :
سورس

[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

نسخه StandAlone :

[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]



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

silsin
26-05-2013, 17:22
عنوان : رسم یک متن برروی صفحه
در این قسمت می خواهیم یک متن را بر روی صفحه بازی رسم کنیم .
جهت رسم یک متن بر روی صفحه بازی ما نیاز به آن داریم ک هاز فوت ها استفاده کنیم مسلما تمامی رسم نوشته های سیستم عامل ما به وسیله انواع و اقسام فونت ها انجام می گیرد . در اینجا هم این قاعده وجود دارد . متاسفانه به خاطر عدم و جود ابزار مناسب تا این ورژن از MonoGame به جهت ساخت اسپرایت فونت ها ما ناچارا باید از ساختار و ابزار xna استفاده کنیم . البته سازندگان قول مساعد برای اضافه کردن این بخش ها در نسخه های اینده MonoGame را داده اند. برای این ما ابتدا باید xna 4 را بر روی ویژوال استدیو خودمان نصب کرده باشیم .توجه کنید در این مورد برعکس اضافه کردن ساختار های مشابه ما نمی توانیم ازفونت فایل xml و یا تکسچر فونت به صورت مستقیم استفاده کنیم و با این فونت را ابتدا تشکیل داده و به فرمت spritefont ذخیره کرده و از آن در ساختار کامپایل شده xnb استفاده کنیم .
برای این کار ابتدا باید یک پروژه xna از نوع windows game ایجاد کنید :
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]


سپس بر روی بخش کنتنت پروژه خود در پنجره sulotion explorer راست کلیک کرده و سپس بر روی new item کلیک کنید :
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]


اکنون در این قسمت یک فایل جدید از نوع spritefont با زدن add به انتخاب نام مناسب به پروژه اضافه کنید
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]


همانطور که مشاهده می کنید این فایل به پروژه شما اضافه شده
در میان محتویات این فایل کد های زیر قرار دارند :

<FontName>Segoe UI Mono</FontName>

این کد برای قرار دادن نام فونت مورد نظر

<Size>14</Size>
اندازه کلمات

<Spacing>0</Spacing>
فاصله کلمات

<Style>Regular</Style>
برای تعیین خاصیت های متن نظیر زیر خط دار بودن و یا بزرگ بودن

پروژه را کامپایل کرده و اجرا کنید تا فایل مورد نظر ما ایجاد شود .
پس از این کار به مکانی که پروژه در سیستم عامل ما به وجود امده رجوع می کنیم در مثال ما پروزه windows game 4 در مسیر زیر تشکیل شده :

C:\Users\john\Documents\Visual Studio 2010\Projects\WindowsGame4

وارد این مسیر شده :
\WindowsGame4\bin\x86\Debug\Content
می توانید مشاهده کنید که دو فایل که یکی از آن ها به فرمت sprite font و دیگری به فرمت xnb تشکیل شده اند :
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]


اکنون این فایل اماده استفاده است . حال پروژه جدیدی از نوع MonoGame بسازید .
فایل xnb را به content های پروژه خود وارد کنید
یک بار build گرفته تا فایل xnb در مسیر فایل پروژه شما ذخیره شود .
اکنون متغییر مربوط به آن را به صورت سراسری ایجاد می کنیم :
کد PHP:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
اکنون در متد LoadContent فایل فونت خود را وارد می کنیم .

کد PHP:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

اخرین کاری که مانده است رسم این فونت بر روی سکانس بازی می باشد . برای اینکار ما باید با استفاده از کلاس spritebatch و متد Drawstring این کار را انجام دهیم .
به متد Draw رجوع کرده و کد زیر را وارد کنید :

کد PHP:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
در این کد مقادیر DrawString :
- - فونت مربوطه که وارد کرده بودیم
- - متنی که می خواهیم بر روی سکانس نمایش دهیم
- - رنگ متن

اکنون خروجی را با تغییر مختصات نمایشی می خواهیم بر روی سکانس نمایش دهیم :
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]



* به این نکته توجه داشته باشید که متد DrawString نیز همانند متد Draw دارای خاصیت های source - scale - rotation و غیره ... می باشد . بنابراین شما می توانید همان کارهایی را که با رسم تصاویر در قسمت های قبلی انجام داده اید در اینجا نیز انجام دهید

silsin
26-05-2013, 17:23
عنوان :ورودی کنترلر xbox360
به لطف وجود هسته input فریم ورک xna در MonoGame سازندگان علاوه بر دسترسی به ورودی های صفحه کلید و ماوس می توان از ورودی کنترلر ایکس باکس 260 نیز در بازی استفاده کرد .
* ذکر این نکته با اهمیت است که به خاطر ماهیت سورس باز بودن MonoGame سازندگان می توانند هر نوع ورودی را به عنوان کنترلر بازی به ساختار MonoGame اضافه کنند !!!

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

[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]


در تصویر فوق می توانید دکمه های موجود بر روی این کنترلرر را با اسم به خاطر بسپرید . نکته جالب در مورد استفاده از این کنترلر این است که شما با استفاده از ساختار Input در این جا می توانید به تمامی اجزای این کنترلر دسترسی پیدا کنید .


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


کد PHP:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

مسملما اگر شما بخواهید دو ورودی کاربر داشته باشید شما باید وضعیت دوم تعریف شده را با فقط تغییر مکان پلایر یعنی Playerindex.Two این کار را انجام دهید .
حال ما می توانیم وضعیت فعلی کنترل بازیکنان خود را در اختیار داشته باشیم و می توانیم وظعیت فعلی که کنترلر ما در ان قرار دارد را در اختیار بگیریم . برای شروع ما می توانیم بررسی کنیم که اصلا ایا کنترلر به دستگاه متصل است یا خیر برای این کار ما باید قطعه کد زیر را در متد Update که برای دریافت ورود ها به کار می رود و در تمام طول بازی با کاربر ارتباط دارد استفاده کنیم :

کد PHP:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید


برای بررسی اینکه ایا کلیدی فشار داده شده ما می توانیم از خاصیت
GamePadState.Buttons استفاده کنیم . برای مثال در خط زیر ما بررسی می کنیم که ایا کلید A بر روی کنترلر فشار داده شده است یا خیر :

کد PHP:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
دسترسی به Dpad یا همان Directional pad نیز به همین گونه است . اجزای موجود در این قسمت یعنی وضعیت هایی که d - pad در اختیار ما قرار می دهد شامل دکمه های
بالا
پایین
چپ و راست می باشد . به عنوان مثال ما از تکه کد زیر برای بررسی فشار داده شدن کلید D -Pade به سمت پایین استفاده خواهیم کرد :

کد PHP:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
کنترلر دو thumbsticks نیز می تواند به سادگی انجام شود .
thumbsticks به ما دووضعیت می دهد -x , -y که بین -1 , 1 می باشد /. اگر مختصات x برابر با -1 بود آنگاه thumbstick به سمت چپ کج شده است و اگر این برابر با 1 بود انگاه به سمت راست کج شده است . اگر مختصات y برابر با -1 بود انگاه به سمت پایین و اگر 1 بود به این معنی است که به سمت بالا قرار گرفته است . 0 نیز به معنای قرار گیری thumbstick در وسط می باشد.
کد زیر برای به روز رسانی زاویه مبتنی بر مختصات سمت چپ قرار گیری thumbstick می باشد :

کد PHP:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

همچنین دکمه های قرار داده شده در پشت کنترلر را نیز می توان نیز مورد دسترسی قرار داده . این دکمه دو وضعیت 0 و 1 را به ترتیب برای وضعیت فشار داده نشده و فشار داده شده بر خواهند گردانند . با استفاده از تکه کد زیر می توانیم این کار را انجام دهیم :

کد PHP:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
مقداری که در متغییر float تعریف شده ما قرار خواهد گرفت برابر با وضعیت فشار دادن یا فشار ندادن کلید می باشد .

بررسی وضعیت فشار دادن کلید :

با استفاده از تکه کد های زیر می توانیم وضعی اولین و اخرین کلید را در اختیار بگیریم :
کد PHP:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
کد PHP:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

silsin
26-05-2013, 17:25
عنوان : لرزش کنترل ایکس باکس 360
در قسمت قبلی با چگونگی ارتباط برقرار کردن و دریافت ورودی از کنترلر ایکس باکس 360 اشنا شدید در اینجا می خواهیم یکی از قابلیت های جالب این کنترلر پرطرفدار را در اختیار بگیریم . همانطور که می دانید کنترلر ایکس باکس 360 دو موتور در سمت چپ و راست خود برای به وجود اوردن لرزش یا همان ویبره دارد . در این قسمت می خواهیم کنترل این قسمت را نیز بر عهده بگیریم .


انجام این کار بسیار اسان است . شما فقط باید با استفاده از اعمال میزان لزرش به گیم پد خود این کار را انجام دهید :

کد PHP:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
مقادیر این متد برابر هستند با :
- موقعیت پلایری که این کنترلر به آن تعلق دارد
- مقدار لرزشی که باید در موتور سمت چپ اعمال شود
- مقدار لرزشی که باید در موتور سمت راست اعمال شود
برای این دو پارامتر ما می توانیم یک رنج بین 0 تا 1 داشته باشیم هنگامی که 0 است این بدین معنی است که ما هیچ لرزش یا همان ویبره ای نداریم و هنگامی که 1 است یعنی لرزش اتفاق می افتد .
همچنین می توان میزان لرزش هر قسمت را نیز با تغییر این رنج ها از 0.1 تا 1 تعیین نمود هرچه یکی از طریفین از دیگری بیشتر باشد مسلما میزان لرزش نیز بیشتر خواهد بود .
یکی دیگر از نکانی که در این مورد باید مد نظر داشته باشید این است که هنگامی که شما مقدار اعمال لرزش کنترلر را بر روی 1 قرار داده باشید کنترلر ایکس باکس شما به طور کامل به حال ویبره خواهد رفت و باید این را با اعمال مقدار 0 متوقف کنید وگرنه لرزش بیش از حد آن موجب دیوانگی بازیکن خواد شد
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

silsin
26-05-2013, 17:27
5 قسمت جدید اضافه شد.
یعنی واقعا امید نداشته باشین این به این زودیا تموم بشه فکر کنم کم کمش یه 20 30 قسمت دیگه بسازم شاید بتونم تمومش کنم . تازه حالا که یه کتاب هم در این مورد به دستم رسیده دیگه هیچی به اون 20 30 تا هم امیدی نیست در کل به قول یکی از دوستان
لذت ببرید :n02:

mohammd1
26-05-2013, 18:38
من دارم پله پله با شما میام جلو
دمت hot :n02:

silsin
03-06-2013, 19:03
تغییر اندازه صفحه بازی
مقدمه :
به صورت پیش فرض سایز تصویری خروجی از بازی در ویژوال استدیو 800 * 400 پیکسل می باشد که غالبا سایز مناسبی به شما می رود اما نه همیشه . در این اموزش ما می خواهیم ببینیم که چگونگه می توانیم به سادگی این سایت پیش فرض را برای بازی خودمان تغییر بدهیم .



تغییر سایز پنجره بازی :

تغییر سازی پنجره بازی بسیار راحت است . این فقط نیاز به دو خط کد دارد . به سازنده بازی خود رفته و کد های زیر را به آن اضافه کنید
(در اینجا Game1() )


کد PHP:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
اکنون شما می توانید با اجرا کردن بازی ببینید که سایز پنجره بازی همانطور که شما خواسته اید تغییر کرده است :

[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]تنظیم سایز پنجره بازی به وسیله Resolution فعلی مانیتور :
در بازی های ویندوز بیس اگر شما بخواهید به صورت تمام صفحه اجرا کنید شما شاید بخواهید اندازه پنجره بازی را با سایز reolution مانیتور هماهنگ کنید .
برای این کار GraphicsDevice ارجاعی به نام DisplayMode دارد . DisplayMode می داند که مانیتور شما چه اندازه ای دارد پس شما می توانید از اطلاعات مناسب آن جهت تعیین سایز پنجره بازی خود استفاده کنید و در نهایت می توانید به مد تمام صفحه بروید :
کد PHP:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

silsin
03-06-2013, 19:04
تنظیم عنوان بالای پنجره بازی
این قسمت را پیش از این هم در اموزش های قبلی انجام داده بودیم .
جهت یاداوری مجددا آن را تکرار خواهیم کرد .


این اموزش کوتاه چگونگی تنظیم عنوان پنجره بالای بازی را نشان می دهد

تنظیم عنوان پنجره بازی :
انجام این کار بسیار راحت است . جهت این کار کد زیر را در قسمت سازنده کلاس بازی خود وارد کنید :
کد PHP:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
بازی را اجرا کرده می توانید ببینید که عنوان بالای صفحه به راحتی تغییر کرده است

silsin
03-06-2013, 19:05
مد تمام صفحه
منطقا تمامی بازی ها دارای همچنین مدی هستند . مد تمام صفحه به حالتی گفته می شه که صفحه خروجی بازی تمامی مانیتور شما را پوشش دهد .در این اموزش بررسی خواهیم کرد که چگونه می توانیم این مد را ایجاد کنیم :

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


در متد Update :

ساختار ما در اینجا به این صورت می شود که کاربر با زدن دکمه Escape بتواند از بازی خارج شود
برای شروع ابتدا باید ساختار شرطی برای آن ایجاد کنیم


کد PHP:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
دستور اجرا ما نیز this.exit می باشد که آن را برای اجرا در شرط قرار می دهیم .

اکنون کد تغییر یافته زیر را جایگزین قبلی کنید :


کد PHP:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

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

کد PHP:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
حال اگر با گیم پد ایکس باکس مجدد تست را انجام دهید می توانید ببینید که با زدن دکمه back پنجر ه بازی بسته خواهد شد


اجرای بازی در حالت تمام صفحه :

تمامی کاری که در اینجا نیاز است این است که به کارت گرافیک بگویید که صفحه را به حالت کامل اجرا کند برای این کار باید قطعه کد های زیر را به قسمت سازنده کلاس Game خود اضافه کنید :
سازنده :

کد PHP:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
کد فول اسکرین

کد PHP:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
حال پنجره خروجی شما در حالت تمام صفحه خواهد بود

silsin
03-06-2013, 19:06
محاسبه فریم ریت :
اگر بازی شما کمی اهسته تر اجرا شود یا شما بخواهد بدانید که بازی شما چه تعداد فریم در ثانیه اجرا می شود باید اموزش فوق را دنبال کنید !!!

محاسبه فریم ریت :
در اینجا ما می خواهیم فریم ریت بازی خودمان را محاسب کنیم این کار ررا در متد Draw انجام خواهیم داد :

کد PHP:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
برای نمایش این فریم ها می توانید مقدار متغییری را که تعریف کرده اید در قالب یک نمایش فوت همانند اموزش های قبلی بر روی صفحه نمایش دهید

silsin
03-06-2013, 19:06
استفاده از خروجی کنسول در زمان ساخت :

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

فعال کردن پنجره کنسول :
برای این کار مراحل زیر را دنبال کنید :
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]

اکنون زمانی که پنجره بازی را اجرا کنید می توانید مشاهده کنید که به همراه آن پنجره کنسول نیز باز شده است . توجه کنید با فعال کردن این پنجره می توانید از دستورات محیط کنسول مانند :
Console.WriteLine
و غیره نیز استفاده کنید .

جهت تمرین نمایش فریم ریت بازی را در کنسول انجام دهید

silsin
03-06-2013, 19:07
پنج قسمت جدید اضافه شد