مقدمه آموزش ساخت بازی در سی شارپ
به یاد دارم وقتی در رشته نرمافزار کامپیوتر در دانشگاه پذیرفته شدم، اوج تصوراتم از برنامهنویسی این بود که بازیهای کامپیوتری بنویسم، ترمهای اول که شروع برنامهنویسی بود با آموزش DOS و پاسکال و زبان برنامه نویسی ++C گذشت که خروجیهای گرافیکی نداشتند. بعد مختصری دلفی خواندیم و با محیط گرافیکی و قابلیتهای محدود آن کیف کردیم و بعد از آن، این سی شارپ بود که به رؤیای برنامهنویسی ما تحقق بخشید و آن را برای ما لذتبخش و شیرین کرد.
نوشتن برنامه با خروجیهای گرافیکی علاوه بر جالب بودن، انسان را به وجد میآورد. اولین برنامهای که با زبان برنامه نویسی سی شارپ نوشتم این بود که یک اتاق ایجاد میکردیم و شخصی در را باز کرده وارد آن میشد و به هر طرف میرفت. این موضوع مربوط به ۱۵ سال پیش است در این مدت بهراحتی میتوانم بگویم انقلابی در برنامهنویسی صورت گرفته است به حدی که با زندگی واقعی فاصله چندانی ندارد!
حال وارد موضوع اصلی یعنی آموزش ساخت بازی در سی شارپ میشویم. تصمیم گرفتهام برای درک بهتر از یک مثال استفاده کنم چراکه درک آن آسانتر است و مطمئناً برای مخاطب جالبتر خواهد بود.
ویژوال استودیو (Visual Studio)
در شروع آموزش ساخت بازی در سی شارپ، باید با ویژوال استودیو آشنا باشید. ویژوال استودیو مجموعهای است که بهطور کامل تمام امکانات و ابزارهای برنامهنویسی در آن گنجاندهشده است و میتوان از آن بهعنوان مرجع کاملی برای توسعه برنامههای تحت ویندوز، تحت وب و همچنین نرمافزار موبایل استفاده کرد. ویژوال استودیو محصول شرکت ماکروسافت بوده و همچنین یک IDE است.
IDE مخفف Integrated Development Environment یعنی محیط توسعه یکپارچه میباشد، این بدین معناست که کاربر با بهره گرفتن از آن دیگر نیازی نیست که برای نوشتن برنامههای پلتفرمهای گوناگون، از برنامههای دیگری به همراه آن استفاده کند و خود ویژوال استودیو یک مجموعه کامل بهحساب میآید.
زبان های برنامه نویسی جاوا JAVA، سی C، سی پلاس پلاس ++C، سی شارپ #C، وی بی دات نت VB.Net و ASP.Net محیطهایی هستند که ویژوال استودیو امکانات موردنیاز برای برنامهنویسی و توسعه بر اساس این محیطها را ممکن میسازد. مجموعه آموزشی پی استور در رابطه با این موضوع پاورپوینتی برای ارائههای کلاسی وآکادمیک شما طراحی کرده که میتوانید با مراجعه به لینک زیر آن را دانلود و مطالعه کنید.
ساخت بازی در C#
در آموزش ساخت بازی در سی شارپ قصد داریم با استفاده از یک Windows Form و GDI+ یک Game Loop ساده در زبان برنامهنویسی C# بسازیم. Game Loopها نرمافزارهای شبیهسازی اندروید هستند که برای کامپیوترهای شخصی و PC ها بهکار برده میشوند. با استفاده از این نرمافزار میتوانید بازیهای اندروید را روی ویندوز و کامپیوتر خودتان نصبکرده و اجرا کنید.
بعد از اتمام نوشتن این برنامه، کاربر میتواند Game Loop را اجرا کرده و با استفاده از کلیدهای ۴ جهت، هواپیمای جنگی فانتوم یا همان شَبَح (که در این آموزش از واژه معادل فانتوم یعنی شبح استفاده می کنیم) را به هر طرف حرکت دهد. در مرحله اول Visual Studio IDE را دانلود کرده و نصب میکنیم، بعد آن را اجرا میکنیم که صفحهای به شکل زیر ظاهر میشود. چون میخواهیم برای دسکتاپ ویندوز، این برنامه را توسعه دهیم از قسمت Workloads، گزینه NET Desktop Development. را انتخاب میکنیم.
حال که وارد برنامه شدیم، میخواهیم یک برنامه Windows Forms جدید با ویژوال استودیو ایجاد کنید. مطابق شکل زیر گزینه Create a new project را انتخاب میکنیم.
بعد از اینکه یک برنامه Windows Forms جدید ایجاد کردیم، مطابق شکل زیر از قسمت زبان، C# را انتخاب میکنیم. سپس گزینه Windows Forms App (.NET Framework) را انتخاب کرده و دکمه next را میزنیم.
حالا میتوانیم نام دلخواه خود را برای پروژه انتخاب کنیم، در شکل زیر مشاهده میکنید که من از نام GameLoopProject برای این پروژه استفاده کردهام. بعد از انتخاب اسم مناسب create را میزنیم و وارد مرحله بعد آموزش ساخت بازی در سی شارپ #C میشویم.
ساخت پروژه GameLoop برای سی شارپ
نمونه فلوچارتی که در زیر آورده شده است یک نسخه از پروژه Game Loop در زبان برنامهنویسی سی شارپ #C را نشان میدهد. وقتی میخواهیم یک بازی تعاملی و پویا را در یک زبان برنامهنویسی پیاده کنیم، از حلقه استفاده میکنیم. این حلقه یک حلقه تکرار بینهایت ولی کنترلشده است که میتواند بازی نوشتهشده شمارا در حال اجرا نگه دارد.
بازی شکار پرنده یک بازی ساده در سی شارپ C# است. این بازی بازسازی نسخه بازی شکار اردک در کنسول های بازی قدیمی (سگا و میکرو) با برخی از تغییرات جزئی است. برای تهیه این سورس کد روی لینک زیر کلیک کنید.
ساختار فایل پروژه
قسمت ساختار فایل آموزش ساخت بازی در سی شارپ به این میپردازد که یک پروژه Game Loop ما از ۵ فایل ساختهشده است و عبارتند از:
- program.cs: بهعنوان نقطه ورود اصلی برنامه موردنظر است.
- Form1.cs: گرافیک برنامه ما را نشان میدهد و درواقع دیالوگ فرمهای ویندوز است.
- GameLoop.cs: این فایل Game Loopها را مدیریت میکند.
- Game.cs: منطق بازی در این فایل قرار دارد.
- GameSprite.cs: یک مدل که اطلاعات شبح در آن قرار دارد.
در مرحله اول فایلهای کلاس زیر را به ترتیب ایجاد میکنیم:
- ایجاد فایل کلاس جدیدی به نام GameSprite.cs
- ایجاد فایل کلاس جدیدی به نام GameLoop.cs
- ایجاد فایل کلاس جدیدی به نام Game.cs
در ویژوال استودیو برای اضافه کردن کلاس در Solution Explorer روی پروژه کلیک راست کرده و ابتدا گزینه Add و سپس گزینه Class را انتخاب میکنیم.(مطابق شکل زیر)
در این مرحله تصویر sprite را به پروژه خودمان اضافه میکنیم. تصویر bomber-sprite.png را میتوانید از قسمت زیر دانلود کنید. (راست کلیک و Save as Image)
در ویژوال استودیو، Project > Properties را در نوار منو انتخاب میکنیم. هنگامیکه Project Designer ظاهر شد، برگه Resources را انتخاب کرده و bomber-sprite.png را به پنجره Resources کشیده و رها میکنیم. (مطابق تصویر زیر)
و میبینید که تصویر شبح در قسمت موردنظر قرار میگیرد. تا به اینجای کار در آموزش ساخت بازی در سی شارپ، شبح را در صفحه قراردادیم.
چنانچه تصمیم به آموزش و ارائه در زمینه ساخت بازی با سی شارپ دارید پیشنهاد میکنیم فایل آماده موجود در لینک زیر را مشاهده و دانلود کنید و ارائهای جذاب، مخاطب پسند و آموزشی داشته باشید.
پاورپوینت آماده ساخت بازی با سی شارپ — کلیک کنید.
افزودن منابع به جهت تشخیص ورودی صفحه کلید
در این قسمت سه مورد دیگر را هم اضافه میکنیم که عبارتنداز:
- منابع را به Project Solution اضافه میکنیم.
- PresentationCore را به منابع پروژه اضافه میکنیم.
- WindowsBase را به منابع پروژه اضافه میکنیم.
برای اضافه کردن منابع، روی تب References کلیک میکنیم سپس روی دکمه افزودن منابع کلیک میکنیم تا کادر محاورهای اضافه کردن منابع باز شود. در کادر محاورهای اضافه کردن منابع، برگهای که نوع مؤلفهای را که میخواهیم به آن ارجاع دهیم را نشان میدهد، انتخاب میکنیم. در این قسمت اجزایی را که میخواهیم به آن ارجاع دهیم را هم انتخاب کرده و سپس روی OK کلیک میکنیم.
ایجاد مدل های داده بازی شبح (Sprite) در سی شارپ
در قسمت زیر GameSprite.cs (کد مثال) آورده شده است. فایل GameSprite.cs یک کلاس C# است که شامل یک مدل داده، حاوی اطلاعات شبح مانند تصاویر، ابعاد، اندازه و مختصات جایی که شبح روی صفحهنمایش داده میشود، میباشد.
using System.Drawing; namespace GameLoopProject { class GameSprite { public Bitmap SpriteImage { get; set; } public float X { get; set; } public float Y { get; set; } public float Width { get; set; } public float Height { get; set; } public int Velocity { get; set; } public GameSprite() { } public void Draw(Graphics gfx) { // Draw sprite image on screen gfx.DrawImage(SpriteImage, new RectangleF(X, Y, Width, Height)); } } }
سورس کد برنامه نقاشی یا Paint در سی شارپ #C در این سورس کد با روش های ساده یک محیط گرافیکی ساده برای رسم اشکال و کار با مداد و رنگ ها بوجود آمده است. در واقع محیط نقاشی ویندوز شبیه سازی شده است. برای توضیحات بیشتر میتوانید به لینک زیر مراجعه کنید.
ساخت بازی در #C
کد بازی در Game.cs آورده شده است که در آن فایل Game.cs یک کلاس C# است و شامل منطق بازی ما، مانند سطوح، انیمیشن های شبح و ورودی های کنترلر است. کلاس Game.cs شامل ۴ تابع اصلی است که عبارتنداز:
()Load: متدی که فقط یک بار برای بارگذاری sprites و محتوای موسیقی اجرا می شود.
()Unload: این متد برای تخلیه محتوا، زمانی که gameloop متوقف می شود اجرا میگردد.
()Update: روشی که اغلب برای به روز رسانی ورودی کنترلی و انیمیشن های اسپرایت اجرا می شود.
()Draw: روشی که به طور مکرر اجرا میشود تا گرافیکهای sprite خود را روی صفحه نمایش بکشیم.
using System; using System.Drawing; using System.Windows.Input; namespace GameLoopProject { class Game { private GameSprite playerSprite; public Size Resolution { get; set; } public void Load() { // Load new sprite class playerSprite = new GameSprite(); // Load sprite image playerSprite.SpriteImage = Properties.Resources.bomber_sprite; // Set sprite height & width in pixels playerSprite.Width = playerSprite.SpriteImage.Width; playerSprite.Height = playerSprite.SpriteImage.Height; // Set sprite coodinates playerSprite.X = 300; playerSprite.Y = 300; // Set sprite Velocity playerSprite.Velocity = 300; } public void Unload() { // Unload graphics // Turn off game music } public void Update(TimeSpan gameTime) { // Gametime elapsed double gameTimeElapsed = gameTime.TotalMilliseconds / 1000; // Calculate sprite movement based on Sprite Velocity and GameTimeElapsed int moveDistance = (int)(playerSprite.Velocity * gameTimeElapsed); // Move player sprite, when Arrow Keys are pressed on Keyboard if ((Keyboard.GetKeyStates(Key.Right) & KeyStates.Down) > 0) { playerSprite.X += moveDistance; } else if ((Keyboard.GetKeyStates(Key.Left) & KeyStates.Down) > 0) { playerSprite.X -= moveDistance; } else if ((Keyboard.GetKeyStates(Key.Up) & KeyStates.Down) > 0) { playerSprite.Y -= moveDistance; } else if ((Keyboard.GetKeyStates(Key.Down) & KeyStates.Down) > 0) { playerSprite.Y += moveDistance; } } public void Draw(Graphics gfx) { // Draw Background Color gfx.FillRectangle(new SolidBrush(Color.CornflowerBlue), new Rectangle(0, 0, Resolution.Width, Resolution.Height)); // Draw Player Sprite playerSprite.Draw(gfx); } } }
کمکم به قسمتهای پایانی آموزش ساخت بازی در سی شارپ میرسیم، نکته قابلتوجهی که در این قسمت وجود دارد این است که اگر خطاهایی توسط Game.cs نشان داده شد، احتمالاً PresentationCore و WindowsBase Reference در فایل یا پروژه شما گنجانده نشده است.
در Game.cs، ماوس خود را روی صفحه کلید میبریم و با استفاده از System.Windows.Input (از PresentationCore) روی دکمه کشویی کلیک کرده و انتخاب میکنیم.
ایجاد حلقه بازی یا Game Loop
کد زیر مربوط به GameLoop.cs میباشد. فایل GameLoop.cs یک کلاس سی شارپ است که شامل منطق و عملکرد Game loop بوده و فایل Game.cs را مدیریت میکند. کلاس GameLoop.cs شامل چهار متد اصلی است که عبارتنداز:
()Load: برای بارگذاری کلاس Game.cs بهکار برده میشود.
()Start: برای شروع یک Gameloop و اجرای کلاس Game.cs استفاده میشود.
()Stop: این متد برای توقف یک game loop و تخلیه کلاس Game.cs مورداستفاده قرار میگیرد.
()Draw: این متد اغلب اجراشده و متد ترسیم کلاس Game.cs را فراخوانی میکند.
using System; using System.Drawing; using System.Threading.Tasks; namespace GameLoopProject { class GameLoop { private Game _myGame; /// <summary> /// Status of GameLoop /// </summary> public bool Running { get; private set; } /// <summary> /// Load Game into GameLoop /// </summary> public void Load(Game gameObj) { _myGame = gameObj; } /// <summary> /// Start GameLoop /// </summary> public async void Start() { if (_myGame == null) throw new ArgumentException("Game not loaded!"); // Load game content _myGame.Load(); // Set gameloop state Running = true; // Set previous game time DateTime _previousGameTime = DateTime.Now; while (Running) { // Calculate the time elapsed since the last game loop cycle TimeSpan GameTime = DateTime.Now - _previousGameTime; // Update the current previous game time _previousGameTime = _previousGameTime + GameTime; // Update the game _myGame.Update(GameTime); // Update Game at 60fps await Task.Delay(8); } } /// <summary> /// Stop GameLoop /// </summary> public void Stop() { Running = false; _myGame?.Unload(); } /// <summary> /// Draw Game Graphics /// </summary> public void Draw(Graphics gfx) { _myGame.Draw(gfx); } } }
Form1.cs (کد مثال)
فایل Form1.cs یک کلاس C# از یک پنجره فرم ویندوز است که روی صفحهنمایش داده میشود، از Form1.cs برای بارگیری Gameloop.cs و ترسیم گرافیک بازی ما روی صفحه استفاده میشود.
using System; using System.Drawing; using System.Windows.Forms; namespace GameLoopProject { public partial class Form1 : Form { Timer graphicsTimer; GameLoop gameLoop = null; public Form1() { InitializeComponent(); // Initialize Paint Event Paint += Form1_Paint; // Initialize graphicsTimer graphicsTimer = new Timer(); graphicsTimer.Interval = 1000 / 120; graphicsTimer.Tick += GraphicsTimer_Tick; } private void Form1_Load(object sender, EventArgs e) { Rectangle resolution = Screen.PrimaryScreen.Bounds; // Initialize Game Game myGame = new Game(); myGame.Resolution = new Size(resolution.Width, resolution.Height); // Initialize & Start GameLoop gameLoop = new GameLoop(); gameLoop.Load(myGame); gameLoop.Start(); // Start Graphics Timer graphicsTimer.Start(); } private void Form1_Paint(object sender, PaintEventArgs e) { if(gameLoop != null) { // Draw game graphics on Form1 gameLoop.Draw(e.Graphics); } } private void GraphicsTimer_Tick(object sender, EventArgs e) { // Refresh Form1 graphics Invalidate(); } } }
بازی فکری ۲۰۴۸ در سی شارپ #C برنامه نویسی شده است که برای علاقه مندان برنامه نویسی و دانشجویان مفید است. ۲۰۴۸ یک پازل ساده و در عین حال جذاب است. نمونههای بسیاری از این پازل برای تلفنهای هوشمند عرضه شده است.
اجرای پروژه
در این بخش از آموزش ساخت بازی با سی شارپ به قسمت هیجانانگیز آن یعنی اجرای پروژه میرسیم. پروژه را با ویژوال استودیو ۲۰۱۹ اجرا میکنیم. ویژوال استودیو پروژه ما را میسازد و کد منبع را به یک فایل اجرایی (فایل exe) تبدیل میکند.
- برای ساخت پروژه خود، Build Solution را از منوی Build انتخاب میکنیم.
- برای اجرای کد، در نوار منو، Debug > Start Debugging را انتخاب کرده سپس یک برنامه Windows Forms بازی ما را اجرا میکند.
- برای اجرای کد، با کلیدهای میانبر، Ctrl + F5 را فشار میدهیم تا پروژه ما اجرا شود.
نتیجه پروژه Game Loop
اگر همهچیز درست پیش برود، وقتی برنامه را اجرا میکنیم باید تصویر یک شبح را نمایش دهد که با فشار دادن کلیدهای جهتدار روی صفحهکلید قابلیت جابجایی داشته و به هر طرف حرکت میکند.
سخن پایانی درباره آموزش ساخت بازی در سی شارپ #C
در پایان مبحث آموزش ساخت بازی در سی شارپ باید این نکته مهم را یادآور شوم که، ساخت بازیهای کامپیوتری یکی از پردرآمدترین شغلهای دنیاست و در آن شکی نیست. سالانه شرکتهای زیادی از طریق فروش بازیهای کامپیوتری میلیونها دلار سود میکنند. این امر سبب شده تا افراد زیادی در هر حوزه و تخصصی به برنامهنویسی روی آورده و در این زمینه فعالیت داشته باشند.
از مهمترین زبانهایی هم که در این حیطه بهکار گرفته میشود زبان برنامهنویسی سی شارپ است، پس هر قدمی که درزمینه یادگیری این زبان برداشته شود مثبت بوده و بینتیجه نخواهد ماند. چهبسا که با یافتن مثالهای مختلف ساخت بازی با سی شارپ به معلومات خود بیفزاییم. در آموزش ساخت بازی با سی شارپ هم مثالی از یک بازی آورده شد تا ما هم سهمی هرچند کوچک درزمینه یادگیری شما عزیزان داشته باشیم. بسیار خوشحال خواهیم شد اگر شما هم نظرات و پیشنهادات خود را با ما در این زمینه به اشتراک بگذارید.
3 پاسخ
سلام وقتتون بخیر لطفا بگید چطوری بازی هایی ک مانند بازی های DOS در دهه ی ۹۰ میلادی هستند رو بسازیم ایا میشه با console application این کارو کرد لطفا برام ایمیل کنید و یه اموزش کامل ساخت بازی مانند Dos قدیمی بزارید لطفا به ایمیلم جواب رو ارسال کنید مرسی ازتون
متن کاملی بود. تو هیچ سایتی نتونستم مطلب به درد بخوری پیدا کنم
خیلی آموزنده و کاربردی بود . تشکر از نویسنده محترم