در این قسمت میخواهیم ببینیم یک بازی رایانه ای از نظر برنامه نویسی چیست ؟
یک بازی رایانه ای مانند سایر برنامه های کامپیوتری است اما پیچیدگی های خاص خود را دارد، با این تفاوت که شامل یک حلقه ی متشکل از چند تابع است، که می توان توابع آن را این گونه معرفی کرد:
- تابع مقداردهی اولیه: در این قسمت مقادیری مانند امتیاز اولیه، سرعت و دیگر پارامترهای کاراکتر مشخص می سود و معمولا فقط یک بار، آن هم در ابتدای بازی اجرا می گردد.
- تابع بارگذاری: وظیفه ی تابع این است که تمامی نیازمندی های بازی اعم از: صدا ، تصویر، مش سه بعدی و ... را بر روی حافظه ی موقت بارگذاری کند و در متغیرهای از پیش تعریف شده توسط برنامه نویس قرار دهد تا در مواقع لزوم از آن ها استفاده شود.
- تابع آزادسازی حافظه: هنگامی که بازی شما تمام می شود باید حافظه ی تخصیص یافته را آزاد کنید تا در قسمتهای دیگر مورد استفاده قرار گیرد و رایانه با کمبود فضای حافظه یا فضای پردازشی رو به رو نشود.
- تابع به روزرسانی: این تابع وظیفه ی پردازش بخش های مختلف بازی را برعهده دارد، مثلا ببیند که دکمه صفحه کلید چند ثانیه نگه داشته شده است و با توجه به آن، سرعت محاسبه شود که کاراکتر باید چند واحد حرکت کند و یا محاسبه سرعت برف و باران و خلاصه هر مورد مربوط به تشخیص ، تصمیم و محاسبه بر عهده این تابع می باشد.
- تابع رسم: یک بازی رایانه ای متشکل از مجموعه ی بسیار زیادی از تصاویراست که پشت سر هم قرار می گیرند و شما فکر می کید که در حال حرکت اند )به هر یک از ین تصاویر یک فریم می گویند(. این تابع وظیفه ی رسم تصاویر را برعهده دارد ،البته تابع به روز رسانی اجرا می شود و مشخص می کند که باید چه چیزی، کجا و چطور رسم شود سپس عملیات رسم انجام می گردد.
پیشتر ذکر شد که بازی از یک حلقه ی بی نهایت تشکیل شده است، که در آن تابع به صورت گردشی تابع به روز رسانی اجرا و تابع رسم فراخوانی می گردد.
- تابع خروج: وظیفه ی این تابع شکستن حلقه ی فوق در هنگام لزوم و جلوگیری از اجرای مکرر دو تابع رسم به روز رسانی می باشد.
خب! فهمیدیم که یک بازی رایانه ای چه تفاوتی با برنامه های دیگر دارد اما نگفتیم که این بازی های با چه زبان های برنامه نویسی ی ساخته می شوند؟
هر زبان برنامه نویسی می تواند عملکرد یک زبان برنامه نویسی دیگر را داشته باشد و در این زمینه تفاوتی میان زبان های برنامه نویسی نیست که مثلا بگوییم فلان برنامه را که Basic می نویسد Python نمی تواند آن را پیاده سازی کند، نه! مسئله این طور نیست.
درست است برخی امکانات در یک زبان برنامه نویسی هست که در دیگری نیست و این امکانات ممکن است برنامه نویسی را قدرمتند تر و ساده تر کنند.
امروزه بازی های رایانه ای به طور مستقیم از زبان های برنامه نویسی ساخته نمی شوند، چرا که مدیریت آن ها بسیار پیچیده و سخت خواهد شد، شرکت های بزرگ ابتدا یک موتور بازی را ساخته و سپس به وسیله ی آن، بازی های متفاوتی تولید می کنند.
فعلا به این مطلب نمی پردازیم که موتور چیست و چه می کند، فرض می کنیم که بازی با همان زبانی که موتور با آن ساخته شده، تولید می گردد.
همه ی زبان های برنامه نویسی می توانند در ساخت بازی های رایانه ای استفاده شوند، اگر به آثار ناشران مختلف اروپایی یا سایت های فروش و دانلود کتاب مانند: Amazon یا EBook نگاهی بیندازید می بینید که عناوین مختلفی مانند: برنامه نویسی بازی های رایانه ای با Basic یا برنامه نویسی بازی با ++ C و ... به چشم می خورد، از طرفی به سبب تفاوت میان این زبان ها، نتیجه شان نیز با هم متفاوت خواهد بود.
شاید برایتان جالب باشد که بدانید هنوز هم فرزندان C یکه تاز عرصه برنامه نویسی بازی های رایانه ای هستند و حرف اول را هم فرزند خلف C یعنی ++ C می زند، اما چرا؟
C++ و اشاره گرهای دوست داشتنی آن، وراثت یگانه و چندگانه مهیجش و همچنین چندریختی بی نظیرش باعث شده که زبان های برنامه نویسی دیگر به گرد پایش هم نرسند و هنوز هم با گذشت چندین دهه ازتولدش، این زبان برنامه نویسی یکه تاز عرصه فناوری ساخت بازی های رایانه ای باشد و در بازی های نام آشنای Assasins، Crysis هم بتواند نام آن را ببینید، اما چه دلیلی باعث شده که ++ C تا این حد محبوب شود و زبان های جدید و ساده تری مانند # C نتوانند جای آن را بگیرند، از جمله این دلایل می توان موارد زیر را عنوان کرد:
- لیست های مقدار دهی
- ارجاع به rValue
- کلمه کلیدی nullptr
- توابع لاندا
- قالب های خارجیExtern Template
و...
اما زبان های دیگری هم برای بازی سازی به کار می روند.
C# محصول مایکروسافت از پشتیبانی همه جانبه این شرکت برخوردار است تا بتواند به عنوان یک زبان محبوب مطرح شود، اگر بخواهید صفحه وب طراحی کنید ASP هست، اگر نمایش های شیشه ای مانند ویندوز 7 بخواهید WPF هست و اگر هم بخواهید بازی بسازید Xna هست که هم برای رایانه هم برای Zune و هم برای Xbox بازی می سازد.
اما با وجود این امکانات پس چرا بازهم++ C ترجیح داده می شود؟
C++ نسبت به # C به سخت افزار نزدیک تر است و کدهای این زبان به کد اسمبلی تبدیل می شوند ولی کدهای به کد میانی تبدیل می شود و سرعت برنامه های نوشته شده با آن در اجراهایی باسرعت بالا مثلا 50 بار در ثانیه به مراتب بیشتر از # C است و از طرفی دوست دوست داشتنی و پرکاربرد ما، اشاره گر! به همان سادگی که در++ C به کار می رود در # C استفاده نمی شود و درگیرکدهای Safe و Unsafe و... می شود، جاوا هم مانند # C است ولی خب جاوا بازار هدفش بیشتر بازی های تحت سیستم عامل های تلفن همراه می باشد.
با این توصیفات حتما فکر می کنید ++ C چقدر فوق العاده و سهل الوصول است، اما هرکس که نداند دانشجویان کامپیوتر خوب می دانند که به این سادگی ها هم نیست، شما می خواهید در Borland یک نقطه ی رنگی و یا یک دایره با هزارنقطه نوک تیز و کح و معوج چاپ
کنید ده شیء گرافیک و تابع های مختلف لازم دارید آخرش هم معلوم نیست درست کار کند یا نه؟ پس چطور گرافیک های زیبایی مانند Skyrim به وجود می آید که انسان را متحیر می کنند که آیا این طبیعت واقعی دنیای پیرامون ماست یا توهمی ترسناک از پیکسل های کنار هم نشسته ی کامپیوتر؟ این پدیده مستقل از زبان های برنامه نویسی نرم افزار مطرح می شود.
راستش را بخواهید از زمانی که کامپیوتر ساخته شد، همزمان با آن، بازی رایانه ای هم رشد کرد یک زمانی با کارت پانچ یک زمانی با صفحه کلید و صفحه های فسفری سبز رنگ کامپیوتر لیزا و حالا هم با موس های پیشرفته razer و گیم پدهایی که شاید هیچ کس تصورش را هم نمی کرد.
ابتدا در صفحه های متنی شکل مانند Dos بازی هایی ساخته می شدند که شاید باورتان نشود گرافیک سه بعدی را پشتیبانی می کردند بازی های درخشانی مانند Doom ، البته نرم افزارهای گرافیک سه بعدی مانند 3D max آن موقع هم توسط شرکت هایی نظیر Discrete ساخته شده بودند ولی اولین بازی Tic-Tac-Toe است که همیشه اوقات فراغت کلاس های جذاب مدرسه
را پر می کرد!
این جا نمی خواهیم تاریخچه بازی ها را بررسی کنیم و قرارمان توضیح برنامه نویسی در بازی های رایانه ای است اما خب کمی صبر کنید.
از زمانی که در زیراکس پارک، استیو جابز با افتخار ایده سیستم عامل های دارای واسط کاربری این شرکت را دزدید و چندی بعد سیستم عامل مک متولد شد و بعدش هم شاه دزد ماجرا -بیل گیتس- آن را از استیو دزدید و ویندوز را ساخت، برنامه نویسی بازی به جای آن که راحت تر شود سخت تر و پیچیده تر شد. خب حتما می پرسید چرا؟
اگر دانشجوی رشته کامپیوتر باشید و کتب وزین و به روز درس سیستم عامل را خوانده باشید همیشه یکی از وظایف اساسی سیستم عامل ها، تقسیم و تخصیص منابع رایانه است، یعنی سیستم عامل، دسترسی مستقیم کاربر به قطعات سخت افزاری مانند کارت صدا، گرافیک و پردازنده را محدود می کند و اجازه نمی دهد که برنامه نویس به طور مستقیم از آن ها استفاده کند و اگر ازRAM حافظه بخواهد باید سیستم عامل اختصاص دهد، اگر نیاز به پردازه بر روی GPU باشد
بازهم سیستم عامل همه کاره است وحرف دسترسی به CPU را هم نزنید.
چون بحث اصلی ما در مورد بازی های رایانه ای تحت ویندوز است، بهتر است فعلا کاری به
بازی های تحت سیستم های تابع Unix و Mac نداشته باشیم که البته مطالب، تفاوت چندانی ندارد
و قابل تعمیم هستند، راستی به این نکته هم توجه کنید که در موارد ذکر شده تفاوتیu1605 میان سیستم عامل های رایانه ای، تبلتی و سیستم عامل های تلفن همراه نیست زیرا هر کدام از این موارد از روی الگوی یک سیستم عامل رایانه ای ساخته شده اند.
بگذریم و برگردیم به اصل مطلب :
تمام ماجرا از ویندوز 95 شروع شد، زمانی که مایکروسافت این سیستم عامل را تولید کرد، متوجه شد که ممکن است بسیاری از مشتریان خود را از دست بدهد، مشتریانی که خواستار بازی های رایانه ای بودند اما بازی سازان، Dos را ترجیح می دادند و از طرفی اگر دسترسی به سخت افزار به صورت مستقیم میسر می شد علاوه بر این که هدف ایجاد سیستم عامل نقض می گردید به
دلیل وجود سخت افزارهای مختلف با معماری های متفاوت هر بازی متناسب با یک سخت افزار اچرا می گردید باید چاره ای اندیشیده می شد.
این چاره به سرعت در شرکت مایکروسافت توسط Craig Eisler, Alex St. John و Eric Engstrom در قالب ایده ای شکل گرفت و از آنجا که می خواستند دسترسی شبه مستقیم به سخت افزار را فراهم کنند Direct را به عنوان نام اصلی انتخاب کردند و چون در شرکت مایکروسافت علاقه وافری به حرف X وجود دارد )مانند نام برخی دیگر از محصولاتشان مثل Xna یا( Xbox حرف X هم به آن اضافه شد و محصول جدید DirectX نام گرفت.
محصول که چه عرض کنم! این اثر در ابتدا یک افتضاح برنامه نویسی بود و خود مایکروسافت هم به شکستش اعتراف کرد و اما این سنت که در شرکت های بزرگ محصولات رها نمی شوند،
در مورد DirectX هم صدق کرد و این محصول در 5 نسخه ادامه پیدا کرد و هر 5 نسخه با کمال اعتماد به نفس شکست خورد! اما نسخه مخصوص ویندوز 98 چیز دیگری بود و این بار خوب جواب داد و رفته رفته این کودک نوپای مایکروسافت پخته شد و اکنون به جایی رسیده است که یکی از شاخص های یک کارت گرافیک خوب که صدا و تصویر و بازی را هماهنگ پشتیابنی می
کند، نسخه DirectX پشتیبانی شده توسط آن است که مثلا DirectX 11 را پشتیبانی می کند و یا 12 را.
تا این جا مختصری از تاریخچه این محصول مایکروسافت بیان کردیم اما خب این DirectXکه می گویند چیست و چرا قبل از نصب اکثر بازی های رایانه ای باید آن را نصب کنیم )البته نسخه زمان اجرای آن را (.
DirectXیک رابط برنامه نویسی نرم افزار است که خارجی ها! به آن API یا همان Application Programming Interface می گویند، رابط های برنامه نویسی در قالب کتابخانه هایی از توایع امکان دسترسی به سخت افزار را برای کاربر فراهم می کنند و خود مانند یک میانجی، رابطه بین نرم افزار و سخت افزار را برقرار می نمایند.
در سیستم های Dos مانند، شما مستقیما حافظه را از کارت گرافیک و یا پردازه را CPU مطالبه می کردید و امکان خطا در آن بسیار بود، خطاهایی که گاهی موجب صدمه به سخت افزار می گردید اما با واسط برنامه نویسی نرم افزار شما می توانید به صورتی امن و ساده تر و البته، محدودتر با سخت افزار ارتباط برقرار کنید.DirectX ابتدا به صورت مجموعه ای از توابع ارائه شد ولی کم کم با غلبه برنامه نویسی شیءگرا مدل آن به کلاس و سپس شیءمولفه Com (Component Object Model ( تبدیل
شد.
اجزا و کتابخانه های DirectX عبارتند از:
- DirectDraw : این کتابخانه برای رسم تصاویر دو بعدی استفاده می گردد و اغلب در ساخت پنجره های یک بازی از این کتابخانه و هم چنین سرفایل های Windows.h و همچنینWindowsX.h استفاده می شود، البته استفاده همزمان از این کتابخانه و کتابخانه رسم تصاویر سه بعدی به دلیل تفاوت در چگونگی ساختار معماری و Render این دو کتابخانه می تواند مشکل
ساز شود.
Directin3D : این کتابخانه به منظور ترسیم اشیاء سه بعدی اعم از شکل های Primitiveتا شکل های پیچیده در فرمت هایی قابل پشتبانی نظیر FBX به صورت مش)تور (استفاده می شود، هم چنین امکاناتی نظیر نورپردازی و سایه نیز از قابلیت های این کتابخانه است.
این کتابخانه، یکی از مهم ترین کتابخانه های DirectX است و اگر قصد یادگیری این رابط برنامه نویسی را دارید، روی این قسمت، حسابی جداگانه باز کنید.
: DXGI این قسمت، برای ارتباط میانجی برنامه نویسی با رابط های گرافیکی )آداپتورها( به کار می رود.
: DirectInput در هر یک از بازی های کامپیوتری، برای انتقال فرمان به بازی، از عناصر متفاوتی نظیر: دستۀ بازی، صفحه کلید، موس و یا... استفاده می شود. وظیفۀ این کتابخانه، ارتباط بین بازی و سخت افزارهای ورودی است که فرمان را دریافت می کند و به کد انتقال می دهد تا در آن جا مورد پردازش قرار گیرد. این کتابخانه، علاوه بر ساده تر کردن نقل و انتقال فرمان، کمک بسیار بزرگی برای برنامه نویس است و او را از برنامه نویسی برای سخت افزارهای مختلف معاف می کند و برای مثال، موجب می شود که موس Razer و Farasoo عملکردی یکسان داشته باشند. از دیگر کتابخانه های DirectX می توان به موارد زیر اشاره کرد که عملکرد اغلب آنان از نامشان
پیداست:
DirectPlay، DirectSound، DirectSound3d، DirectMusic، DirectX
Media، DirectX Transform، DirectShow، DirectX Media، Objects، D -
.rectSetup
در این جا نکته شایان توجه این است که در برخی مجامع علمی از DirectX به عنوان یک زبان یاد می شود، در صورتی که یک رابط )تکنولوژی( است و می توان آن را با هر زبان برنامه نویسی شیءگرا به کار برد. از جمله این زبان ها می توان به :, C++ , C# , Java , Basic
Delphi اشاره کرد.
DirectX محصول انحصاری شرکت مایکروسافت است و بالطبع فقط از محصولات این شرکت پشتیبانی می کند و در سایر سیستم عامل ها نظیر: توزیع های مختلف لینوکس قابل استفاده نیست؛ از طرفی برای استفاده از آن نیز باید حق مادی آن را به شرکت پرداخت کنید که البته پرداخت این مبلغ، هنگام تحریم، سخت تر می شود.
مطالب فوق، مقدمه ای بود برای این که بگوییم: DirectX تنها رابط برنامه نویسی مشهور دنیای بزرگ و زیبای بازی سازی نیست و کتابخانۀ بزرگ دیگری به نام OpenGl هم وجود دارد.
OpenGL یک کتابخانه متن باز گرافیکی است و همان طور که ازاسمش Graphic Library Open پیداست، می توانید آن را بدون هیچ هزینه ای، در برنامه های خود به کار
ببرید. شاید برایتان جالب باشد که ویندوز هم به طور کامل از این کتابخانه، پشتیبانی می کند. این کتابخانه، به همراه کتابخانه دیگری به نام OpenAL ، وظیفۀ پشتیبانی از بازی های رایانه ای را بر عهده دارد و آثار خوبی نیز با این رابط ساخته می شود؛ آثاری که تکنیک های روز نظیر: آنتی آلیایزینگ و... را پشتیبانی می کند. در کشور ما نیز این کتابخانه مورد توجه است و از جمله محصولاتی که با این کتابخانه تهیه شد، موتور تولید شده توسط شرکت فن افزار شریف ) به نام ایرانویچ ( است که بازی گرشاسب را ساخت.
امروزه در اغلب شرکت های بزرگ برنامه نویسی، به طور همزمان، از قابلیت های این دو کتابخانه مشهور، برای ساخت موتورهای بازی سازی تحت ویندوز استفاده می گردد.
اما بپردازیم به اینکه موتور بازی چیست و آیا این مفهوم، با موتور بازی سازی تفاوت دارد؟
موتور بازی، همان چیزی است که هنگام بازی، از بازی شما پشتیبانی می کند. برای روشن تر شدن مطلب مثالی می زنیم. فرض کنید در حال انجام یک بازی فوتبال مثل Fifa Street و یا نه همانFifa 12 خودمان هستید. وقتی توپ را شوت می کنید، توپ با یک سرعت خاص و به صورت زیر حرکت می کند:
احساس نمی کنید این نوع حرکت که در تصویر نشان داده شده، برای شما کمی آشنا است؟
احساستان کاملا درست است. این همان حرکت پرتابی است که در فیزیک پیش دانشگاهی خوانده بودید؛ اما این قانون حرکت پرتابی فیزیک نیوتنی از کجا وارد بازی شده است؟ اگر دقت کنید باد هم بر روی آن اثر می گذارد، اثر اصطکاک بر آن کاملا مشهود است و... این قوانین در قالب کدهایی نوشته می شوند که در زبان برنامه، به صورت کتابخانه ای از این قوانین پشتیبانی می کنند. به این کدها، اصطلاحاً موتورفیزیک و به کدهایی که مسئول رستر و یا رندر کردن اضیاء هستند موتور گرافیک، موتور صدا و... گفته می شود.
بدین ترتیب دانستیم که وظیفه موتور بازی، پشتیبانی از موارد مربوط به حوزه آن موتور، حین اجرای بازی است. حال سؤال اینجاست که موتور بازی سازی چیست؟
موتور بازی سازی، یک محیط مجتمع IDE است که در آن، تمامی ابزارها به صورت نمایان و ویژوال)دیداری (در دسترس کاربر قرار گرفته اند و می توانید با یک کلیک، ابر و باد و مه و خورشید و فلک را بسازید. ) زنده یاد سعدی هم گویا اهل بازی بوده!(
این موتورهای بازی سازی، گاه به صورت رایگان و گاه به صورت فروشی عرضه می شوند. البته شرکت هایی هم هستند که موتور خویش را منحصراً برای خود نگه می دارند و از راهِ تولید بازی با آن موتور، کسب درآمد می کنند.
موتورهای زیادی به زبان های مختلف ساخته شده است که می توانید برای مشاهدۀ لیست جامعی از آنها، به سایت دانشنامۀ آزاد Wikipedia مراجعه کنید. در لیست ارائه شده، حتماً به زبان های به کار رفته در برنامه نویسی موتور و نیز بازی های ساخته شده با آن موتور، توجه کنید.