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

327
ساخت بازی با سی شارپ

ساخت بازی با سی شارپ در ویژوال استودیو انجام می‌شود و می‌تواند از ساده‌ترین بازی‌ها تا پیچیده‌ترین‌ها را شامل شود. ما در این مقاله، بازی معروف مرورگر کروم با نام “Run T Rex” را می‌سازیم. این بازی را زمانی می‌توانید ببینید که به اینترنت وصل نیستید. ما از نسخه 2019 ویژوال استودیو استفاده خواهیم کرد؛ اما فرآیندها و دستورات در نسخه‌های جدید نیز کاملا مشابه با همین مقاله هستند.

9 مرحله برای ساخت بازی دایناسور تی‌رکس در سی شارپ

بازی‌ سازی یکی از جذاب‌ترین مشاغل دنیا است که می‌تواند با زبان برنامه‌نویسی سی شارپ انجام شود. پیش از شروع مراحل، باید به این نکته اشاره کنیم که یادگیری #C بسیار ساده‌ است؛ به‌شرطی‌که در یک دوره آموزش سی شارپ شرکت کنید تا بدون سردرگمی در منابع مختلف، مسیر یادگیری خود را کوتاه‌تر کنید.

مرحله اول: ساخت پروژه جدید

ابتدا نرم‌افزار Visual Studio را روی سیستم خود اجرا کنید و پس از اجرا شدن، روی دکمه “Create a new project” کلیک کنید. سپس در کادر “Project Name”، نام پروژه را “T Rex Endless Runner” وارد کنید. البته می‌توانید نام دیگری هم انتخاب کنید؛ اما اگر با همین نام شروع کنید، مغایرتی بین مراحل به‌وجود نخواهد آمد.

مرحله دوم: اعمال تغییرات مدنظر

روی گزینه “properties” در پنل سمت چپ نرم‌افزار کلیک و تغییرات عکس پایین را روی آن اعمال کنید.

پس از اعمال این تغییرات، نمای پیش‌روی شما باید مشابه تصویر زیر باشد:

مرحله سوم: افزودن تصاویر 

در مرحله سوم ساخت بازی با سی شارپ، به چهار جعبه عکس یا “Image box”، یک برچسب و یک تایمر بازی نیاز دارید.

جعبه ابزار یا همان “Toolbox” را که معمولا در سمت چپ صفحه قرار دارد، پیدا کنید. اگر در نرم‌افزار وجود ندارد، به منوی “View” بروید و روی گزینه “Toolbox” کلیک کنید.

آیکن Image box به شکل زیر در جعبه ابزار قرار دارد که باید با کلیک چپ، آن را درون فرم پیش‌رویتان بکشید تا در پروژه قرار بگیرد. ما مقدار رنگی “00bffe” را برای این کادر انتخاب کردیم.

در این مرحله از ساخت بازی با C# ، باید مقدار رنگی آن را به رنگ دلخواهتان تغییر دهید. این کار را باید از پنل “properties” تصویر انجام دهید. رنگ دلخواهتان را از گزینه “BackColor” انتخاب کنید.

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

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

مرحله چهارم: تعیین تصویر

در این مرحله از ساخت بازی با سی شارپ، باید روی کادر Image box کلیک راست و گزینه “choose image” را انتخاب کنید. 

سپس روی “import” در زیر فایل منبع پروژه کلیک کنید تا کادر “image selector” باز شود. تمام تصاویری را که از قبل دانلود کرده‌اید، در این کادر انتخاب کنید و دکمه Open را بفشارید. در مجموع چهار تصویر وجود دارد، بنابراین همه آن‌ها را در همین پنجره انتخاب و به‌شکل یک‌جا وارد ویژوال استودیو کنید.

تصاویر را به‌شکلی که در تصویر زیر نشان داده‌ایم، در محل مناسب قرار دهید.

مرحله پنجم: درج تایمر بازی

اکنون باید یک تایمر را به فرم بازی اضافه کنید. این کار را هم با Drag & Drop (کشیدن و رها کردن تایمر در صفحه) انجام دهید. پس از افزودن تایمر، پنجره مشخصات آن به شکل زیر درخواهد آمد:

مرحله ششم: تعیین زمان بازی و پرش کاراکتر

در پنل properties تایمر، تغییرات را مطابق عکس زیر اعمال کنید. در ابتدا باید نام آن را به gameTimer تغییر دهید. سپس آن را فعال کنید و فاصله زمانی اجرا را روی 20 قرار دهید.

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

پس از اتمام این مراحل، باید روی نماد رعدوبرق در پنجره properties کلیک کنید. با این کار پنجره رویدادها یا “events” برای اضافه کردن یک رویداد به تایمر باز می‌شود. 

مرحله هفتم: تنظیم رویدادهای تایمر

مقادیر “Key Down” و “Key Up” در کادر properties تایمرها، برای تعیین فشردن دکمه‌های بالا و پایین است. بنابراین برای ست کردن مقادیر روی این دو، باید طبق تصویر زیر این دو پارامتر را تغییر دهید. مقدار “keyisdown” برای رویداد “Key Down” و “keyisup” برای “Key Up” است.

مرحله هشتم: کدنویسی تایمرها

حالا عبارت “MainGameTimerEvent” را در کادر جست‌وجو بنویسید تا به پنجره کدهای تایمر هدایت شوید. مجدد یادآوری می‌کنیم که حتما باید تایمری که قصد تغییر کدهای آن را دارید، انتخاب کنید. کدهای زیر را در این پنجره کپی کنید.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace T_Rex_Endless_Runner
{
    public partial class Form1 : Form
    {
        bool jump = false;
        int jumpingSpeed;
        int frc = 12;
        int scoreofthegame = 0;
        int obstSpeed = 10;
        Random random = new Random();
        int pos;
        bool isgameover = false;

        public Form1()
        {
            InitializeComponent();
            ResetGame();
        }

        private void MainGameTimerEvent(object sender, EventArgs e)
        {
            trex.Top += jumpingSpeed;
            txtScore.Text = "Score = " + scoreofthegame;

            if (frc < 0)
            {
                jump = false;
            }

            if (jump)
            {
                jumpingSpeed = -12;
                frc--;
            }
            else
            {
                jumpingSpeed = 12;
            }

            if (trex.Top > 366 && !jump)
            {
                frc = 12;
                trex.Top = 367;
                jumpingSpeed = 0;
            }

            foreach (Control t in this.Controls)
            {
                if (t is PictureBox && (string)t.Tag == "obstacle")
                {
                    t.Left -= obstSpeed;

                    if (t.Left < -100)
                    {
                        t.Left = this.ClientSize.Width + random.Next(200, 500) + (t.Width * 15);
                        scoreofthegame++;
                    }

                    if (trex.Bounds.IntersectsWith(t.Bounds))
                    {
                        gameTimer.Stop();
                        trex.Image = Properties.Resources.dead;
                        txtScore.Text += "  Press T to restart the game";
                        isgameover = true;
                    }
                }
            }

            if (scoreofthegame > 5)
            {
                obstSpeed = 15;
            }
        }

        private void keyisdown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Space && !jump)
            {
                jump = true;
            }
        }

        private void keyisup(object sender, KeyEventArgs e)
        {
            if (jump)
            {
                jump = false;
            }

            if (e.KeyCode == Keys.T && isgameover)
            {
                ResetGame();
            }
        }

        private void ResetGame()
        {
            frc = 12;
            jumpingSpeed = 0;
            jump = false;
            scoreofthegame = 0;
            obstSpeed = 10;
            txtScore.Text = "Score = " + scoreofthegame;
            trex.Image = Properties.Resources.running;
            isgameover = false;
            trex.Top = 367;

            foreach (Control t in this.Controls)
            {
                if (t is PictureBox && (string)t.Tag == "obstacle")
                {
                    pos = this.ClientSize.Width + random.Next(500, 800) + (t.Width * 10);
                    t.Left = pos;
                }
            }

            gameTimer.Start();
        }
    }
}

هرکدام از ویژگی‌ها و مقادیر آن‌ها به دلایل زیر به‌کار رفته‌اند:

  • Bool jump = false: یک مقدار از نوع Boolean برای تعیین اینکه آیا کاراکتر دایناسور در حال پریدن است یا خیر.
  • jumpingSpeed = 10: این متغیر میزان جابجایی عمودی دایناسور را تعیین می‌کند. وقتی در حال پرش است، مقدار منفی (برای حرکت به بالا)، و وقتی در حال سقوط است، مقدار مثبت (برای حرکت به پایین) به آن داده می‌شود.
  • int frc = 12: در اینجا frc به عنوان شمارنده‌ای برای محدود کردن مدت زمان پرش استفاده می‌شود. وقتی مقدار آن تمام شود، دایناسور دیگر به بالا حرکت نمی‌کند و سقوط می‌کند.
  • int scoreofthegame = 0: یک داده از نوع integer با مقدار پیش‌فرض 0 که امتیاز بازی را ثبت می‌کند. هربار که مانعی بدون برخورد با دایناسور با موفقیت از فرم خارج می‌شود، یک مانع به این عدد صحیح اضافه می‌شود.
  • int obstSpeed = 10: موانع با استفاده از این عدد متحرک خواهند شد. 
  • ()Random random = new Random :این شیء از کلاس Random برای تولید اعداد تصادفی استفاده می‌شود. در این بازی، برای تعیین موقعیت افقی جدید موانعی که از سمت چپ صفحه خارج می‌شوند، به‌کار می‌رود.
  • ()InitializeComponent: در Visual Studio.NET C# یا VS.NET، متد ()InitializeComponent متدی است که به‌طور خودکار توسط طراح Windows Forms ایجاد و مدیریت می‌شود. این متد هر چیزی را که در فرم می‌بینید، define می‌کند. هنگامی که برنامه را اجرا می‌کنید (یا فرم را در VS.NET باز می‌کنید)، این کد کنترل‌ها را به همان روشی که در بخش طراحی صفحه انجام دادید، ایجاد و پیکربندی می‌کند.
  • تابع سازنده فرم، تابع reset را فراخوانی می کند. این اساساً به این معنی است که شما به تابع reset دستور می دهید تا هنگام شروع بازی اجرا شود. این تابع بازنشانی خالی بازی است. بعداً برای اضافه کردن دستورالعمل‌ها به آن باز خواهید گشت.

مرحله نهم: تعیین نقطه مطلوب برای reset بازی

عملکرد ریست در کد بالا، با مقدار “ResetGame();” مشخص شد. در این بخش مشخص کردیم که با فشردن دکمه “T” کیبورد، کاراکتر شروع به حرکت کند. کدهای درون این تابع، همه متغیرها، کاراکترهای بازی و موانع موجود را Reset می‌کند. هنگامی که بازی برای اولین بار Load می‌شود و زمانی که بازیکن دکمه “T” را فشار می‌دهد، این عملکرد فعال می‌شود.

آموزش ساخت بازی با سی شارپ در همین‌جا به پایان رسیده است و با اجرای این برنامه، می‌توانید بازی را شروع کنید. در سه تصویر زیر، اسکرین‌شات اجرای بازی را نشان داده‌ایم:

چرا ساخت بازی با سی شارپ راحت‌تر است؟

سی شارپ به‌دلیل چندین مزیت کلیدی خود، یک انتخاب عالی برای ساخت بازی‌های کامپیوتری است که در ادامه به آن‌ها اشاره خواهیم کرد.

بیشتر بخوانید: سی شارپ چیست؟

1. ادغام با موتور بازی‌ یونیتی

سی شارپ زبان اصلی برنامه‌نویسی در Unity است که یکی از پرکاربردترین موتورهای بازی در صنعت گیمینگ است. Unity از توسعه بازی‌ها به‌شکل Cross Platform پشتیبانی می‌کند. بنابراین هر بازی‌ ساخته‌‌شده می‌تواند روی لپ‌تاپ یا کامپیوترهای رومیزی، کنسول‌ها و گوشی‌های هوشمند اجرا شود؛ بدون آنکه آن‌که نیازی به کدهای اضافی داشته باشید.

2. ماهیت شی‌گرا

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

3. سهولت یادگیری و استفاده

یادگیری C# در مقایسه با زبان‌هایی مانند C++ آسان‌تر است؛ زیرا به زبان انسان نزدیک است و سینتکس ساده‌ای دارد. البته اگر در بهترین دوره آموزش C++ شرکت کنید، به‌دلیل تشریح مقدمات و الگوهای ساده‌سازی برنامه‌نویسی با این زبان، به‌راحتی این چالش برطرف خواهد شد.

4. تسریع زمان توسعه 

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

5. مقیاس‌پذیری بالا

سی شارپ بسیار مقیاس‌پذیر است و برای پروژه‌های مستقل کوچک و بازی‌های بزرگ و پیچیده، یک گزینه ایده‌آل محسوب می‌شود. طراحی ماژولار این زبان برنامه‌نویسی تضمین می‌کند که پروژه‌ها می‌توانند در عین پیچیدگی بسیار، همچنان بزرگ‌تر شوند و درعین‌حال بخش‌های مختلف آن‌ها قابل مدیریت باشند.

آموزش برنامه نویسی با کوئرا کالج
نگین فاتحی

از اسفند 99 مشغول گشت‌وگذار در دنیای کلمات هستم؛ با این هدف که خوب بنویسم و این چشم‌انداز که کمک‌های موثری کنم. بعداز گذشت سه‌ سال و مطالعه زیاد در زمینه‌های گوناگون بازاریابی آنلاین ازجمله رفتارشناسی مخاطب آنلاین، حالا تلاش می‌کنم محتوایی بنویسم که شما بخونی، لُب‌کلام رو متوجه بشی، لذت ببری و با دست پر صفحه رو ترک کنی؛ شایدم بقیه نوشته‌هام رو بخونی :)

اشتراک در
اطلاع از
guest


0 دیدگاه‌
قدیمی‌ترین
تازه‌ترین بیشترین واکنش
بازخورد (Feedback) های اینلاین
View all comments