2D Game Programming with XNA Framework

XNA Framework یکی از محصولات مایکروسافته مخصوص ساخت بازی کامپیوتری توی محیط .NET
خیلی سریع اصول طراحی یک بازی دوبعدیو میگم. بقیه ش با خودتون. یک پروژه از نوع Windows Game ساختم و اسمشو گذاشتم MyGame. توی پروژه ی MyGame از همون اول، بجای Class1 که همیشه خود بخود ساخته میشه، یه کلاس دارید به اسم Game1 که توی اون 5 تا تابع وجود داره:
1.         Initialize()
هر چیزی که اول بازی باید مقدار دهی بشه اینجا قرار میگیره. البته بجز اجزای گرافیکی صفحه مثل Texture ها و Sprite ها.
مثلا:
this.IsMouseVisible = true;
map = new Map(128, 128, Difficulty.Easy);

2.         LoadContent()
حالا باید Texture دوبعدی تعریف کنید. فایل عکسی که برای Texture استفاده میکنید ترجیحا PNG باشه که زمینه اش Transparent باشه. (مثلا فایل image001.png)  توی Solution Explorer این عکسو به MyGameContent اضافه کنید و بعد توی LoadContent اونو توی بازی Load کنید.
مثلا:
//In the Game1 Class Body
private Texture2D playerTexture;
private
SpriteFont font1;
//Inside LoadContent
playerTexture = this.Content.Load<Texture2D>("image001");
font1 = Content.Load<SpriteFont>("SpriteFont1");

3.         UnloadContent()
اگر تعداد Content های بازی (عکس، موزیک، فونت، افکت...) زیاد باشه و با عوض شدن مرحله بخواهید اونا رو Unload کنید از این تابع استفاده کنید. یه چیزی شبیه به Dispose هستش.

4.         Update(GameTime gameTime)
5.         Draw(GameTime gameTime)

تمام منطق برنامه در تابع Update مدیریت میشه. از قبیل تشخیص Collision یا کلیدهایی که فشار داده شده اند یا Health بازیکن... تابع Update و Draw به نوبت اجرا میشن. توی Update مختصات Texture ها و اندازه و Tintشون تعیین میشه و توی Draw تمام Textureهایی که باید نمایش داده بشن نمایش داده میشن. نشون دادن متن یا پخش آهنگ هم در Draw انجام میشه. البته میشه که همه ی منطق برنامه رو توی Draw نوشت ولی باید توجه داشت که این دو تابع هر کدوم واسه کاربرد خودشون طراحی و بهینه سازی شدن و اگه منطق و گرافیک درست تفکیک نشن ممکنه Performance برنامه بیاد پایین.
//Update
if (Keyboard.GetState(PlayerIndex.One).IsKeyDown(Keys.Space))
    Player.State = PlayerState.Jump;

//Draw
GraphicsDevice.Clear(Color.CornflowerBlue); //if you remove this line, screen won’t refresh
spriteBatch.Begin();//like From1.SuspendLayout in WindowsFromApplication
spriteBatch.DrawString(font1, "Press space to jump!", new Vector2(10,10), Color.DarkRed);
spriteBatch.Draw(playerTexture, new Vector2(200,200), Color.White); //White means: no tint
spriteBatch.End();//like From1.ResumeLayout in WindowsFromApplication








لینک دانلود XNA SDK برای .NET Framework 3.1
لینک دانلود XNA SDK برای .NET Framework 4

.Net.UI.HotKey

با کمک این کلاس میشه Global HotKey اضافه کرد به برنامه.
ولی اگر فقط دنبال یه ShortKey ساده می‎گردین، ساده ترین راه حل برای اضافه کردن ShortKey به GUI استفاده از ContextMenuStrip هست.
1. یه ContextMenuStrip اضافه کنید به هر جای Form (ترجیحا خود Form)
2. Item های مورد نظر رو اضافه کنید به ContextMenuStrip
3. به هر Item یک ShortKey نسبت بدید. (item.ShortKey = Keys.Control | Keys.D1)
4. واسه اینکه ContextMenuStrip دیده نشه توی UI، همه ی Item ها رو hide کنید. (item.Visible = false)
5. با شروع برنامه فوکوس را ببرید روی همون کنترلی که ContextMenuStrip بهش اضافه شده.
6. حالش را ببرید.

Developing.OO.Orthogonality

ترجمه ی http://www.artima.com/intv/dry3.html

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

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

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

اگه سیستمتون، Orthogonal (متعامد) نباشه و اجزای سیستم، بیش از حد نیاز با هم در تعامل باشن، همیشه درگیر این مدل Debugging پخش و پلا خواهید بود.

نکته جالبش اینه که من (Dave Thomas) خلبان هلیکوپتر نیستم و واسه اینکه مطمئن شم از مثالی که آوردم، این مطلب رو واسه ی یه خلبان واقعی فرستادم تا نظرشو بدونم. و نوشتم:
"این چیزیست که قصد دارم راجع به کنترلهای هلیکوپتر بنویسم. آیا درست است؟"
و خلبان هلیکوپتر به من ایمیل زد:
"چیزیو که راجع به کنترل هلیکوپتر نوشتید، خوندم.
تمام شب خوابم نبرد."

.Net.UI.ListView.Icon.GetBetterQuality()

احتمالا به مشکل بی کیفیت نشون دادن آیتمهای ListView برخوردید تا حالا. ظاهراً Net. به صورت پیش فرض میاد عمق تصویر رو 256 رنگ میکنه ولی میشه این رو عوض کرد. گوش کنین!


امروز داشتم توی اینترنت دنبال راه حل میگشتم، رسیدم به این صفحه. دو نفر توش نشستن کلی بحث کردن راجع به اینکه چقدر Net. همه چیزش "زیادی منظمه" و اگه بخوای مستقیم با API کار کنی دهنت صاف میشه و اینا.

یکیشون کلی زحمت کشیده بود یه Library نوشته بود تا بتونه Alpha Channel عکسا رو Render کنه.

...

رسیدم به ته صفحه دیدم یه نفر اومده اینو نوشته:
listView1.LargeImageList.ColorDepth = ColorDepth.Depth32Bit;

بد نیست قبل اینکه بخوایم وسط کد برنامه، قدرت نمایی کنیم و ایده های تخمی تخیلی پیاده کنیم، قبلش یه داتِ ناقابل بزنیم و اسم اون member های صاب مرده رو بخونیم!