پس از اینکه کمی زبان سی را یاد گرفتید و با خود گفتید که الان وقتش است تا یک برنامه بنویسم میبینید که زبان سی اصلا تابع برای کارهای گرافیکی ندارد. ممکن است کمی در اینترنت جستجو کرده باشید و دنبال این باشید که چطور با زبان سی و فقط سی یک برنامه گرافیکی بنویسید و آخر هم به نتیجهای نرسید.
این دقیقا چیزی بود که من با آن رو به رو شدم و پس از جستجوی فراوان و کاوش سخت دریافتم که دو راه بیشتر وجود ندارد یا زبان سی را در ادغام با زبانهای دیگر استفاده کنید که از خیر این گزینه گذشتم و گزینه دوم این است که خودتان تابع گرافیکی بنویسید یعنی اینکه یک تابع بنویسید که پنجره ایجاد کند یک تابع برای کار با صفحه نمایش یک تابع برای کار با صفحه کلید و الی آخر.
خوب این راه درست و حسابی است ولی واقعا وقت زیادی میبرد و ما هم کسی نیستیم که بخواهیم چرخ را دوباره اختراع کنیم چرا که قبلا مهندسان کارکشته کتابخانههای گرافیکی بسیار خوبی نوشتند و ما فقط نیاز داریم که از کتابخانههای آنها استفاده کنیم و کار کردن با توابع آنها را بیاموزیم.
خوب کتابخانههای گرافیکی فراوانی برای زبان سی نوشته شده است که مشهورترینش openGL است که در اینجا کاری باهاش نداریم بلکه میخواهیم به برادر openGL یعنی SDL بپردازیم.
قدم اول این است که SDL را نصب کنید و اگر قدم اول را چون نهی بد نه راه پیش داری و نه راه پس
در رابطه با چگونگی نصب SDL گفتم شاید مترجمان برنامهنویس چیزی ترجمه کردهاند که از شانس خوب شما هیچ پیدا نکردم که لینکش بدهم. ولی خوب به زبان انگلیسی lazyfoo ترتیب این کار را داده است و من فقط لینکش را اینجا میگذارم دیگر نصبش با خودتان.
البته بگویم که من سیستم آرک لینوکس را دارم که کار را برای من خیلی آسان کرده است و به راحتی کتابخانه SDL با فرمان pacman -S SDL نصب کردم. اما برای آنها که میخواهند روی سیستمهای دیگر نصب کنند لینک زیر را ببینند:
حالا پس از اینکه نصب کردید نوبت به ایجاد پروژه میرسه که باید یک پوشه ایجاد کنید و در پوشهتان یک Makefile قرار بدهید و یک فایل سورس که این فایل سورس شما باید نام main.c داشته باشد.
لینک Makefile را در زیر قرار میدهم. شما باید فایل makefile و main.c را در یک پوشه قرار بدهید و یادتان باشد که دستور make را در همان پوشه اجرا کنید.
پس از اینکه برنامهتان را نوشتید باید در ترمینال دستور make را بزنید تا برنامه شما کامپایل بشود و ازش یک فایل اجرایی در بیاید. اگر هر زمان که فایل main.c تان را ویرایش کردید باید دستور make clean و سپس make را بزنید تا فایل اجرایی شما به روز شود. خوب این هم از فایل makefile به همراه فایل سورس main.c
خوب اگر این فایل اجرایی حاصل را اجرا کنید میبینید که یک پنجره سفید باز میشود و حدود ۱۰ ثانیه باز نگه داشته میشود و بعد به صورت خودکار بسته میشود. یک نکته دانستنش مفید است این است که شما میتوانید به فایلهای SDL دسترسی داشته باشید که برای این کار میتوانید از Github استفاده کنید. قسمت include مربوط به فایلهای هدر است و قسمت SRC مربوط به فایلهای سورس.
SDL چند تا زیرسیستم دارد. حالا اینکه چند تا دارد و میخواند این چند چند تا است بروید فایل SDL.h را بررسی کنید میدانید چند تا است. در حال حاضر هشت تا است. یکی از کاربردیترینشان زیرسیستم ویدیو است. وقتی این زیرسیستم را فعال کردید به طور خودکار زیرسیستم Event نیز فعال میشود.
خوب اولین کار این است که شما باید زیرسیستم مورد نیاز را فعال کنید این کار با استفاده از تابع SDL_init صورت میگیرد برای مثال در زیر دو زیرسیستم صوت و ویدیو با دستور زیر فعال میشود.
SDL_Init (SDL_INIT_VIDEO | SDL_INIT_AUDIO);
همانطور که میدانید و میدانم وقتی که شما یک تابعی اجرا کردید این تابع یا مقداری برمیگرداند یا برنمیگرداند. خوب اینجا تابع SDL_Init در صورت موفقیت عملیات یعنی راهاندازی صحیح زیرسیستمها عدد ۰ و در صورت شکست عدد -۱ را دو دستی تحویل سیستم میدهد. خوب اگر عملیات شکست خورد باید خبرمان بکند یا نه. خوب برای اینکه اگر عملیات شکست خورد ما خبردار شویم تابعی است به نام SDL_GetError این تابع میگوید که دلیل شکست ما چه بوده است. پس به جای اینکه چگونگی اجرای یک زیرسیستم را مثل بالا بنویسیم مثل پایین مینویسم:
if((SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO)==-1)) { printf("Could not initialize SDL: %s.\n", SDL_GetError());
خوب فکر نمیکنم نیازی به توضیح کد بالا باشد، چون اگر واقعا نمیدانید کد بالا چی است پس اول بروید زبان سی را یاد بگیرید که میتوانید از این لینک استفاده کنید.
خوب حالا که زیر سیستم صوت و ویدیو را فعال کردیم پس از پایان اجرا و هر کاری دلمان خواست باهاشان انجام دادیم نمیتوانیم همینجوری ولش کنیم و بگذاریم در حافظه بماند بلکه باید این زیرسیستمها را خاموش کنیم برای خاموش کردنش تابعی است به نام SDL_Qitue .
SDL_Quit();
این تابع تمامی زیرسیستمها را خاموش میکند.
خوب خوب خوب، دقیقا تمام شد، بله کل SDL همین است روشن کردن زیرسیستمها، اعمال هر کاری که میخواهیم و بستن زیرسیستمها.
برای آموزش SDL قصد داشتم تا با استفاده از سایت lazyfoo دانستههایم را ادغام کرده و آموزشی هر چند ناقص تحویل دهم. ولی پس از آنکه مسیر نه چندان ساخت یادگیری SDL را پیمودم اینگونه به من القا شد که خود از خود آن چیزها را که میدانم به صورت کل بیاورم.
به طور کل، SDL یک کتابخانه گرافیکی است. همانطور که قبلا گفتم برای ایجاد برنامههای گرافیکی تقریبا راهی جز استفاده از کتابخانههای آماده شده نیست و SDL یکی از آنها است.
برای یادگیری SDL ابتدا باید مفهوم آن را درک کنید، و پس از درک مفهوم چیزی دیگری برای یادگیری باقی نمیماند.
در SDL چند تا زیرسیستم داریم که باید راهاندازی شود که راهاندازی آن در جلسات قبل گفته شد و البته چندان ربطی به مفهوم آن ندارد پس من چشم روی آن میبندم و چشم روی مفاهیم باز میکنم.
در SDL یک رندر داریم که یک نوع ساختار است به نام SDL_Render این رندر بیانگر چگونگی نمایش است.
این نمایش در چیزی به نام ویندو یا پنجره نشان داده میشود. پس غیر از رندر یک SDL_Window نیز داریم که این نیز یک ساختار است.
تا اینجا اینجوری شد که ابتدا میآییم یک پنجره ایجاد میکنیم و یک نمایش یا رندر میسازیم و آن رندر را در پنجره نشان میدهیم. خوب شاید بپرسید چطور رندر را تعریف کنیم و چطور در پنجره نشان دهیم این کارها همهاش با توابعی است که SDL برای این کار طراحی کرده است.
این پنجره و رندر برای ایجاد برنامه کافی است اما وافی نیست. برای اینکه کافیتر بشود. surface یا سطح و texture تکسژر داریم که دقیقا عین هم هستند با این تفاوت که تکسژر سریعتر است. ناگفته نماند که اینها هم ساختار هستند. خوب کار این سطح و تکسژر چی است. گفتیم که یک پنجره طراحی کردیم، حالا این پنجره خودمان روی هر سطحی که خواستیم میگذاریم خوب طبیعت هر چیزی که در آن سطح است در پنجره نشان داده میشود. این دقیقا همان surface و texture است.
یک ساختار دیگر داریم که SDL_Rect نام دارد این ساختار که زیاد استفاده میشود میآید یک مستیطیل تحویل ما میدهد.
خوب حالا برای درک بهتر یک مثال میزنم که البته مثال نیست بهتر است بگویم یک تشریح میآورم.
من میآیم یک مستیطل میسازم، آن را در رندر قرار میدهم. رندر را در پنجره نشان میدهم. بعدش میروم پنجره را روی یک سطح میگذارم. این میشود یک برنامه.
شاید بعدها ادامهاش را نوشتم ولی الان حال و حوصلهاش را ندرام