سلام
ضربت خوردن و شهادت مولای متقیان، امیر المومنین، علی بن ابی طالب (علیه السلام) را بر عموم دوستان تسلیط میگم.
علی ای همای رحمت تو چه آیتی خدا را ///// که به ماسوا فکندی همه سایهی هما را
دل اگر خداشناسی همه در رخ علی بین ///// به علی شناختم به خدا قسم خدا را
به خدا که در دو عالم اثر از فنا نماند ///// چو علی گرفته باشد سر چشمهی بقا را
مگر ای سحاب رحمت تو بباری ارنه دوزخ ///// به شرار قهر سوزد همه جان ماسوا را
برو ای گدای مسکین در خانهی علی زن ///// که نگین پادشاهی دهد از کرم گدا را
جز از علی که گوید به پسر که قاتل من ///// چو اسیر تست اکنون به اسیر کن مدارا
بجز از علی که آرد پسری ابوالعجائب ///// که علم کند به عالم شهدای کربلا را
چو به دوست عهد بندد ز میان پاکبازان ///// چو علی که میتواند که بسر برد وفا را
نه خدا توانمش خواند نه بشر توانمش گفت ///// متحیرم چه نامم شه ملک لافتی را
بدو چشم خون فشانم هله ای نسیم رحمت ///// که ز کوی او غباری به من آر توتیا را
به امید آن که شاید برسد به خاک پایت ///// چه پیامها سپردم همه سوز دل صبا را
چو تویی قضای گردان به دعای مستمندان ///// که ز جان ما بگردان ره آفت قضا را
چه زنم چونای هردم ز نوای شوق او دم / که لسان غیب خوشتر بنوازد این نوا را
همه شب در این امیدم که نسیم صبحگاهی ///// به پیام آشنائی بنوازد و آشنا را
ز نوای مرغ یا حق بشنو که در دل شب ///// غم دل به دوست گفتن چه خوشست شهریارا
========================================
قرار بود مطالب دیگری برای این پست اختصاص دهم ولی دیدم داریم وارد کد نویسی میشویم ولی هنوز مبانی و متدهای مهم و چگونگی آغاز کدنویسی XNA را توضیح نداده ایم.
کدنویسی در محیط XNA3.1 با وراثتی از کلاس XNA.Game آغاز میشود.
کلاس مذکور متدها و توابعی دارد که میتوان با بازتعریف انها عملیاتهای پایه ای خود را پیاده سازی کرد.
تک تک این پرکاربردترین متدها را در زیر بررسی خواهیم کرد.
==============
سازنده کلاس (در VB.Net با نام New و در C#.Net با نام خود کلاس)
طبیعتاً این اولین متد اجرایی است که دقیقاً بعد از ایجاد کلاس XNA.Game میتوانیم کدهای خودمان را در ان مستقر کنیم.
(پر شدن اشاره گر this در C#.Net و Me در VB.Net)
در این محل هنوز همه اشیا ایجاد نشده و نمیتوان هر کاری کرد و در اصل برای خیلی از دستورات زود است!
ولی معمولاً XNA.Game.Content.RootDirectory در یک پروژه عادی اینجا مقدار دهی میشود و نمونه ای از شی XNA.GraphicsDeviceManager هم برای کارهای اتی ساخته میشود.
(برخی از عملیات های New سازی عادی و مجزا را هم میتوان در این محل یا در متد بعدی انجام داد.)
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
برخی از کاربرهای شی GraphicsDeviceManager را در متد بعدی خواهیم گفت.
XNA.Game.Content.RootDirectory هم پوشه کاری شامل دیتهای xnb برنامه را (در کنار exe یا dll) مشخص میکند.
همانطوری که گفتیم XNA تمام فایلهای دیتا (شامل سوت و تصویر و شی سه بعدی و افکت و فونت و...) را به روش خاص پردازش و همه را به پسوند xnb.* سریالی میکند.
تنظیم مقدار مذکور نام پوشه ریشه حاوی این xnb.* ها را مشخص میکند.
تا در دستورات عادی دیگر ما نیازی نباشد مسیر فایلها را بدهیم و خود XNA بداند فایلها را از کجا میتواند پیدا کند.
(
مثلاً میتوان برای کیفیت و دستگاه مختلف چندین پوشه ریشه Content مانند ایجاد کرد و برای کیفیت تصویری زیاد (پردازش بیشتر و سرعت کمتر) و کیفیت تصویر کمتر (پردازش کمتر و سرعت بیشتر) چندین Content داشت
)
ولی ما در این آموزش همواره یک Content با همین نام "Content" داریم که همینوطری تنظیمش میکنیم (پیش فرض XNA)
==============
متد Initialize :
این متد اولین متد رسمی است که بعد از New اجرا میشود و در این مرحله کارهای بیشتری میتوان انجام داد و تنظیمات خاصی را برای برنامه اعمال کرد.
مثلاً میتوان Resolution مانیتور را تنظیم کرد (پیش فرض XNA برای محیط Windows مقدار 800-600 است)
و یا مشخص کرد که ماوس مرئی باشد یا نه و نیز وضعیت اجرای تمام صفحه را مشخص کرد.
(
هسته DirectX برای تحت کنترلر گرفتن کل صفحه نمایش و اجرای fullscreen بهینه سازی شده و در حالت واقعی حالت fullscreen میتواند بازدهی برنامه شمار ا افزایش دهد.
ولی DirectX مشکلاتی بابت خروج نابهنگام و یکباره از حالت fullscreen پیش می آورد و در این حالت استفاده از فرامینی که پنجره ویندوزی را ظاهر کند باعث مشکل برای برنامه میشود ...
مثلاً وسط حالت fullscreen دکمه Win و یا Alt+Ctrl+Delete و... را بزنید در بازهای رایانه ای دیگر هم میبینید مشکل ایجاد میکند.
این وضعیت برای trace و debug در داخل VS هم وجود دارد و برای debug راحت در VS در حین مراحل طراحی بهتر است fullscreen نباشد.
)
تنظیمات فوق از موارد کاربرهای XNA.GraphicsDeviceManager هستند.
یا در این متد میتوان مشخصات و پارامترهای کلی دوربین و فضای دید را مشخص کرد.
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
گمانم دستورات فوق واضح هستند.
فقط دستورات ابتدایی تنظیم دوربین باید به این دستورات اضافه شود که در پست مخصوص کنترل دوربین این دستورات بیان خواهد شد و در خصوص ProjectionMatrix و تک تک مقاویر داده شده به CreatePerspectiveFieldOfView هم در همان پست توضیح داده خواهد سد.
==============
متد LoadContent
این متد بعد از فراخوانی Initialize از کلاس base اجرا خواهد شد و همانطور کهع از نامش مشخص است، محل پیشفرض برای بارگذاری Content ها (همان فایلهای xnb.*) داخل اشیای مناسب به داخل برنامه است.
برای بارگذاری دیتاهای فایلی برنامه از متد XNA.Game.Content.Load استفاده میکنیم که Generic است و نوع شی تولیدی و نام فایل xnb.* را میگیرد.
در صورت نیاز میتوان کراهای لازم دیگر را هم انجام داد، مثل تولید XNA.Graphics.SpriteBatch جهت ترسیمات دوبعدی
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
میتوان فایلهای دیتاها در زیر پوشه های Content هم قرار داد و انها را منظم و دسته بندی کرد که در این صورت نام زیر پوشه ها مثل حالت عادی مسیر فایلها با یک اسلش اضافه خواهد شد.
(متدها و نحوه استفاده XNA.Graphics.SpriteBatch در پست ویژه ترسیمات دوبعدی بیان خواهد شد.)
==============
متد UnloadContent
این متد برعکس متد قبلی است و از ان میتوان در پایان برنامه برای آزاد سازی منابع و حافظه و... استفاده کرد.
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
==============
متد Update
این متد مدام تا انتهای برنامه و قبل از رسم هر فریم اجرا میشود.
باید در این متد دستورات پردازشی مدام خود را مستقر کرد.
مثلاً گرفتن فرامین ورودی کاربر از ماوس و کیبورد و جوی استیک و... و ترتیب اثر دادن به فرامین کاربر ...
در صورت نیاز :
حرکت دوربین و چرخش آن به محل جدبد
حرکت یا چرخش اشیای صجنه به مختصات های جدید
برسی و پردازش برخورد اشیا و انجام عمل و دستور مناسب و...
و...
خلاصه تمام بار پردازش برنامه بر دوش این متد است.
(
اگر شما هر یک از متدهای قبلی را سنگین بنویسید و در آنها دقت کافی نکنید، خیلی ایراد ندارد، چون انها یکبار اجرا میشوند و فوقش برنامه میخواهید 5 ثانیه ای لود شود 6 قانیه ای لود میشود!
ولی این متد و متد بعدی حیاتی هستند.
این متد و متد بعدی مدام توسط XNA در یک حلقه تا تمام شدن برنامه اجرا میشوند و شامل همان بحث بازدهی و حلقه های پنهان میشود.
این دو متد ضمن پیاده سازی تمام نیازها باید تا حد نهایی خود سبک و سریع الاجرا باشد و از هر ترفندی برای افزایش بازدهی و سرعت در انها استفاده کرد.
)
چون این متد بار پردازشی زیادی دارد در جهت شفافیت کدها و لایه بندی و استفاده از قدرت شی گرایی میتوان کد این بخش را در کلاسهای مجزایی شکست و از واسط XNA.IUpdateable هم در انها استفاده کرد و در این متد فقط این کلاسها فراخوانی شوند.
مثلاً ...
یک کلاس مجزا فقط برای کنترلر و گرفتن فرامین کاربر و map کردن انها به فرامین برنامه
یک کلاس مجزای دیگر جهت محاسبه و کنترلر موقعیت دوربین با توجه به شرایط و فرامین کاربر.
یک کلاس دیگر جهت مدیریت و کنترلر کاراکتر اصلی بازی (در بازی های اول شخص که بازیکن یک کاراکتر انسانی یا ماشینی نظیر در محیط بازی دارد.)
و...
=====
این متد آرگومانی از نوع XNA.GameTime هم میگیرد که حاوی اطلاعاتی زمانی بازی است که میتواند معیار حرکت و پردازش قرار بگیرید.
مثلاً شاید نیاز باشد شی ای از نقظه A به B رود ولی این حرکت نباید لحظه ای باشد و نباید در رایانه قوی تر و سریعتر و رایانه ضعیف تر و کندتر فرقی کند، مثل حرکت یک خودرو
در مواردی از این دست میتوان از XNA.GameTime پاس داده شده در پردازش ها استفاده کرد.
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
==============
متد Draw
این متد از خیلی از لحاظ شبیه متد قبلی است ولی شما در این متد وظیفه نوشتن دستورات ترسیم برای هر فریم را دارید.
بازدهی هم در این متد بسیار مهم است و باید تمام کنترلرهای دوبعدی و اجزای سه بعدی و زره ای در این متد ترسیم شوند.
برای یک برنامه حقیقی این متد هم میتواند بسیار طولانی و پیچیده شود و اصل نگه دارید کد را کاهش دهد.
نتیجتاً در جهت استفاده از امکانات شی گرایی میتوانید موارد مختلف را یک کلاس مجزا با واسط XNA.IDrawable کنید و هر ترسیم را جدا کنید.
یک کلاس برای کنترلرهای دوبعدی روی صفحه ...
یک کلاس برای کاراکتر سه بعدی بازیکن (برای بازی های اول شخص)
یک کلاس برای رسم زمین و آسمان
و...
هر بخش که دیدید دارد پیچیده میشود یا منطق شی گرایی برنامه تان اقتضا میکند میتوانید یک کلاس دیگر و مجزا کنید.
کد:
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
==============
کدهای فوق به همراه نمونه کد ساده رسم دوبعدی در قالب پوشه XNAEmpty به نمونه کدهای پک تاپیک افزوده شده.
support.h02.ir/fwlink/?LinkId=1005808167
در سطح pm ، دوستان در خصوص pdf شده مطالب همین تاپیک پرسیده بودند، که متاسفانه و با عرض شرمندگی هنوز حاضر نشده.
تصمیمم بر این است که کلیه مطالب تاپیک را pdf کنم ولی وقت نکردم.
موفق باشید.