مجموعه آموزشی پی استور - https://programstore.ir

آموزش ساخت بازی در سی شارپ #C — گام به گام و تصویری

امروز که می‌خواستم آموزش ساخت بازی در سی شارپ #C را شروع کنم مثل همیشه یک لحظه به این فکر کردم که مخاطبان این پست چه کسانی خواهند بود؟ و یادم افتاد که با طیف عظیمی از افراد که اکثراً در سنین نوجوانی و جوانی‌اند مواجه هستم، زیرا امروزه فقط آنان که در این حوزه تحصیل‌کرده‌اند به برنامه‌نویسی روی نمی‌آورند بلکه هر شخص علاقه‌مند با مشاهده آموزش‌های لازم می‌تواند در این زمینه فعالیت کند.

آموزش ساخت بازی در سی شارپ یکی از آموزش‌های مهم و پرکاربرد برای ساخت بازی‌های کامپیوتری [1] به شمار می‌رود که می‌تواند کمک شایانی به علاقه‌مندان نماید. ما هم در راستای کمک به شما عزیزان با آموزش ساخت بازی در سی شارپ #C همراهتان خواهیم بود.

مقدمه

به یاد دارم وقتی در رشته نرم‌افزار کامپیوتر در دانشگاه پذیرفته شدم، اوج تصوراتم از برنامه‌نویسی این بود که بازی‌های کامپیوتری بنویسم، ترم‌های اول که شروع برنامه‌نویسی بود با آموزش DOS و پاسکال و زبان برنامه نویسی ++C [3] گذشت که خروجی‌های گرافیکی نداشتند. بعد مختصری دلفی خواندیم و با محیط گرافیکی و قابلیت‌های محدود آن کیف کردیم و بعد از آن، این سی شارپ بود که به رؤیای برنامه‌نویسی ما تحقق بخشید و آن را برای ما لذت‌بخش و شیرین کرد.

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

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

ساخت بازی در آموزش ساخت بازی در سی شارپ

ویژوال استودیو (Visual Studio)

در شروع آموزش ساخت بازی در سی شارپ، باید با ویژوال استودیو [5] آشنا باشید. ویژوال استودیو مجموعه‌ای است که به‌طور کامل تمام امکانات و ابزارهای برنامه‌نویسی در آن گنجانده‌شده است و می‌توان از آن به‌عنوان مرجع کاملی برای توسعه برنامه‌های تحت ویندوز، تحت وب و همچنین نرم‌افزار موبایل استفاده کرد. ویژوال استودیو محصول شرکت ماکروسافت [6] بوده و همچنین یک IDE است.

IDE مخفف Integrated Development Environment یعنی محیط توسعه یکپارچه می‌باشد، این بدین معناست که کاربر با بهره گرفتن از آن دیگر نیازی نیست که برای نوشتن برنامه‌های پلتفرم‌های گوناگون، از برنامه‌های دیگری به همراه آن استفاده کند و خود ویژوال استودیو یک مجموعه کامل به‌حساب می‌آید.

ویژوال استودیو در آموزش ساخت بازی در سی شارپ

زبان های برنامه نویسی جاوا JAVA [7]، سی C، سی پلاس پلاس ++C [8]، سی شارپ #C، وی بی دات نت VB.Net و ASP.Net [9] محیط‌هایی هستند که ویژوال استودیو امکانات موردنیاز برای برنامه‌نویسی و توسعه بر اساس این محیط‌ها را ممکن می‌سازد.

سورس کد بازی ماشین با OpenGL به زبان سی شارپ C# [10]

سورس کد بازی ماشین با OpenGL به زبان سی شارپ #C

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

ساخت بازی در C#

در آموزش ساخت بازی در سی شارپ قصد داریم با استفاده از یک Windows Form و GDI+ یک Game Loop ساده در زبان برنامه‌نویسی C# بسازیم. Game Loopها نرم‌افزارهای شبیه‌سازی اندروید [1] هستند که برای کامپیوترهای شخصی و PCها به‌کار برده می‌شوند. با استفاده از این نرم‌افزار می‌توانید بازی‌های اندروید را روی ویندوز و کامپیوتر خودتان نصب‌کرده و اجرا کنید.

پروژه Game Loop در آموزش ساخت بازی در سی شارپ

بعد از اتمام نوشتن این برنامه، کاربر می‌تواند Game Loop را اجرا کرده و با استفاده از کلیدهای 4 جهت، هواپیمای جنگی فانتوم یا همان شَبَح (که در این آموزش از واژه معادل فانتوم یعنی شبح استفاده می کنیم) را به هر طرف حرکت دهد. در مرحله اول 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 [11]

سورس کد بازی شکار پرندگان در سی شارپ #C

بازی شکار پرنده یک بازی ساده در سی شارپ C# است. این بازی بازسازی نسخه بازی شکار اردک در کنسول های بازی قدیمی (سگا و میکرو) با برخی از تغییرات جزئی است. برای تهیه این سورس کد روی لینک زیر کلیک کنید.

ساختار فایل پروژه

قسمت ساختار فایل آموزش ساخت بازی در سی شارپ به این می‌پردازد که یک پروژه Game Loop ما از 5 فایل ساخته‌شده است و عبارتند از:

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

  1. ایجاد فایل کلاس جدیدی به نام GameSprite.cs
  2. ایجاد فایل کلاس جدیدی به نام GameLoop.cs
  3. ایجاد فایل کلاس جدیدی به نام Game.cs

در ویژوال استودیو برای اضافه کردن کلاس در Solution Explorer روی پروژه کلیک راست کرده و ابتدا گزینه Add و سپس گزینه Class را انتخاب می‌کنیم.(مطابق شکل زیر)

ایجاد فایل در آموزش ساخت بازی در سی شارپ

ساختار فایل در آموزش ساخت بازی در سی شارپ

ساختار فایل در آموزش ساخت بازی در سی شارپ

در این مرحله تصویر sprite را به پروژه خودمان اضافه می‌کنیم. تصویر bomber-sprite.png را می‌توانید از قسمت زیر دانلود کنید. (راست کلیک و Save as Image)

تصویر فانتوم

در ویژوال استودیو، Project > Properties را در نوار منو انتخاب می‌کنیم. هنگامی‌که Project Designer ظاهر شد، برگه Resources را انتخاب کرده و bomber-sprite.png را به پنجره Resources کشیده و رها می‌کنیم. (مطابق تصویر زیر)

اضافه کردن شبح در آموزش ساخت بازی در سی شارپ

و می‌بینید که تصویر شبح در قسمت موردنظر قرار می‌گیرد. تا به اینجای کار در آموزش ساخت بازی در سی شارپ، شبح را در صفحه قراردادیم.

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

سورس کد بازی مهاجمان فضایی (Space Invaders) در #C [12]

سورس کد بازی مهاجمان فضایی (Space Invaders) در سی شارپ

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

افزودن منابع به جهت تشخیص ورودی صفحه کلید

در این قسمت سه مورد دیگر را هم اضافه می‌کنیم که عبارتنداز:

افزودن مراجع در آموزش ساخت بازی در سی شارپ

برای اضافه کردن منابع، روی تب 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 [13]

سورس کد برنامه نقاشی یا Paint در سی شارپ #C

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

ساخت بازی در #C

کد بازی در Game.cs آورده شده است که در آن فایل Game.cs یک کلاس C# است و شامل منطق بازی ما، مانند سطوح، انیمیشن های شبح و ورودی های کنترلر است. کلاس Game.cs شامل 4 تابع اصلی است که عبارتنداز:

()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();
        }
    }
}
سورس کد بازی فکری 2048 در سی شارپ #C [14]

سورس کد بازی فکری 2048 در سی شارپ #C

بازی فکری 2048 در سی شارپ #C برنامه نویسی شده است که برای علاقه مندان برنامه نویسی و دانشجویان مفید است. 2048 یک پازل ساده و در عین حال جذاب است. نمونه‌های بسیاری از این پازل برای تلفن‌های هوشمند عرضه شده است. برای اطلاعات بیشتر روی لینک زیر کلیک کنید.

سورس کد بازی فکری ریورسی (Reversi) در #C [15]

سورس کد بازی فکری ریورسی (Reversi) در #C

سورس کد بازی فکری ریورسی در #C تهیه شده است که برای علاقه مندان برنامه نویسی و دانشجویان مفید است و به عنوان یک پروژه درسی می توان از آن استفاده کرد. ریورسی یک بازی ساده و جذاب است.

اجرای پروژه

در این بخش از آموزش ساخت بازی با سی شارپ به قسمت هیجان‌انگیز آن یعنی اجرای پروژه می‌رسیم. پروژه را با ویژوال استودیو 2019 اجرا می‌کنیم. ویژوال استودیو پروژه ما را می‌سازد و کد منبع را به یک فایل اجرایی (فایل exe) تبدیل می‌کند.

نتیجه پروژه Game Loop

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

اجرای پروژه در ساخت بازی با سی شارپ

سخن پایانی درباره آموزش ساخت بازی در سی شارپ #C

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

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

بازی دوز XO تحت شبکه در سی شارپ #C [17]

سورس کد بازی دوز XO تحت شبکه در سی شارپ #C

این سورس کد بازی دوز یا XO که با نام Tic Tac Toe نیز شناخته می شود. این بازی با هوش مصنوعی و تحت شبکه است. در این بازی این امکان وجود دارد که در برابر کامپیوتر و در مقابل بازیکن دیگری بازی کنید. این سورس کد با 5 صفحه گزارش کار آماده دانلود می باشد.