چرا وای، واقعاً میخوای این کارو بکنی؟
سلام دوستان! امروز میخوام درباره یکی از دیوانهوارترین و در عین حال جذابترین چالشهای دنیای برنامهنویسی بازی حرف بزنم: ساخت بازی کاملاً از صفر، بدون استفاده نکردن از Unity، Unreal، Godot، حتی Raylib یا SDL به عنوان موتور کامل! فقط کد خالص + کتابخانههای سطح پایین (مثل OpenGL/Vulkan/DirectX یا حتی فقط WinAPI/GDI در ویندوز).
چرا یکی باید خودشو اینقدر عذاب بده؟ بیاید ببینیم مزایا و معایبش چیه و بعد قدم به قدم بریم جلو.

مزایای ساخت بازی بدون موتور آماده
- درک عمیق از همهچیز وقتی خودت رندرینگ پاپیلاین، مدیریت حافظه، فیزیک، ورودی، صدا و شبکه رو پیاده میکنی، دیگه هیچوقت نمیگی «این چرا تو Unity اینطوری کار میکنه؟» چون خودت همهچیز رو از پایه فهمیدی.
- اندازه نهایی فوقالعاده کوچک یک بازی 2D ساده که با Godot ممکنه 50–100 مگابایت بشه، وقتی خودت بنویسیش با C++ و OpenGL میتونه زیر 1 مگابایت بشه! (مثل بازیهای دموسیین قدیمی)
- عملکرد بینظیر هیچ لایه اضافی بین کد تو و سختافزار نیست. میتونی تا آخرین چرخه CPU و آخرین بایت VRAM رو فشار بدی.
- مالکیت 100٪ هیچ لایسنس عجیبوغریبی نداری، هیچ Runtime اجباری، هیچ محدودیت ابزار.
- حس خفن بودن 😎 وقتی به دوستات میگی «این بازی رو خودم از صفر با C++ و Vulkan نوشتم»، نگاهشون عوض میشه!
معایب و چالشهای وحشتناک
- زمان توسعه ۱۰ برابر یا بیشتر چیزی که تو Unity با ۳ خط کد و یک کلیک درست میشه، اینجا ممکنه ۳۰۰۰ خط کد و دو هفته دیباگ بخواد.
- دیباگ جهنمی کرش کرد؟ خودت باید بری تو درایور گرافیک و ببین مشکل از کجاست. Segmentation fault وسط رندرینگ؟ موفق باشی!
- پشتیبانی از پلتفرمها میخوای هم ویندوز، هم لینوکس، هم مک، هم وب (WebGPU) و هم اندروید داشته باشی؟ شبهای بیخوابی تضمینیه.
- چرخ رو دوباره اختراع میکنی خیلی از چیزهایی که مینویسی، قبلاً هزاران بار نوشته شده و تست شده. ولی خب… تو میخوای خودت بنویسیش!
- تیم؟ چه تیمی؟ تقریباً غیرممکنه بیشتر از ۱–۲ نفر روی چنین پروژهای کار کنن، مگر اینکه همه فوق حرفهای باشن.
مراحل ساخت یک بازی ساده 2D از صفر (مثال با C++ و GLFW + OpenGL)
بیایم یه بازی خیلی ساده مثل «جمعآوری سکه» (مثل بازیهای آرکید قدیمی) رو از صفر بسازیم:
مرحله ۱: انتخاب زبان و کتابخانههای پایه
- زبان: C++17/20 (بهترین تعادل سرعت و راحتی)
- پنجره و ورودی: GLFW یا SDL2 (فقط برای ساخت پنجره و گرفتن کیبورد/ماوس، نه بیشتر!)
- گرافیک: OpenGL 3.3+ (یا Vulkan اگه خیلی hardcore هستی)
- صدا: OpenAL یا miniaudio
- تصویر: stb_image.h (هدر-اونلی، عالیه)
مرحله ۲: راهاندازی پروژه اولیه
mkdir coin_collector && cd coin_collector
mkdir src build
main.cpp
CMakeLists.txt (خیلی توصیه میشه)
while (!glfwWindowShouldClose(window)) {
float currentTime = glfwGetTime();
deltaTime = currentTime - lastFrameTime;
lastFrameTime = currentTime;
processInput(window);
update(deltaTime); // فیزیک، AI، منطق بازی
render(); // رسم همهچیز
glfwSwapBuffers(window);
glfwPollEvents();
}
این لوپ قلب تپنده بازیتونه.
مرحله ۴: پیادهسازی سیستمهای اصلی
الف. سیستم رندرینگ 2D ساده
- یک شیدر ساده ورتکس و فرگمنت بنویس
- از Orthographic Projection استفاده کن
- Sprite ها رو به صورت کواد با تکسچر رندر کن
ب. مدیریت منابع (Resource Manager) خودت یه سیستم ساده برای لود تکسچر، صدا، فونت بنویس.
ج. سیستم موجودیت (Entity System) ساده میتونی از آرایه ساده یا std::vector استفاده کنی (ECS کامل لازم نیست برای بازی کوچک)
د. فیزیک خیلی ساده (AABB collision)
bool checkCollision(Rect a, Rect b) {
return a.x < b.x + b.w && a.x + a.w > b.x &&
a.y < b.y + b.h && a.y + a.h > b.y;
}
ه. ورودی، صدا، امتیاز، منو و…
مرحله ۵: بهینهسازی و پولیش
- V-Sync یا لیمیت فریمریت دستی
- Hot-reloading شیدرها (خیلی حال میده!)
- پروفایلینگ با RenderDoc یا NVIDIA Nsight
پروژههای واقعی که این کارو کردن
- Cave Story (اولین نسخه توسط Pixel با C++ و DirectX از صفر نوشته شد)
- خیلی از بازیهای دموسیین (size-coding)
- پروژه معروف handmade hero توسط Casey Muratori (هزاران ساعت آموزش زنده!)
- بازی Celeste نسخه اولیه (قبل از اینکه به XNA بره) تا حدی دستساز بود
- خیلی از بازیهای roguelike قدیمی (مثل Dwarf Fortress تا حد زیادی دستساز بود)
نتیجهگیری: ارزشش رو داره؟
اگر هدف اینه که یه بازی تجاری AAA بسازی و سریع به بازار برسونی → خیر، اصلاً ارزش نداره. از Godot یا Unity استفاده کن.
اما اگر:
- عاشق برنامهنویسی سطح پایین هستی
- میخوای واقعاً بفهمی بازی چطور کار میکنه
- یه پروژه شخصی خفن برای رزومه یا پرتفولیو میخوای
- یا فقط میخوای خودتو به چالش بکشی…
آره، برو دنبالش! یکی از بهترین تجربههای زندگی برنامهنویسیته.
من خودم دو تا بازی کوچک (یک شوتر 2D و یک پلتفرمر) کاملاً از صفر با C++ و OpenGL نوشتم. هنوزم که هنوزه وقتی اجراشون میکنم و میبینم ۴۰۰ کیلوبایت حجم دارن و روی یه ماشین ۱۵ ساله با ۶۰ فریم ثابت کار میکنن، حال میکنم!
شما تجربه ساخت بازی از صفر دارید؟ چه زبانی استفاده کردید؟ چالش اصلیتون چی بود؟ تو کامنت بگید حتماً!
موفق باشید و کد بزنید — علی (یه برنامهنویس دیوونه که هنوزم عاشق OpenGLه)
شما هم چنین تجربه ای دارید؟ برامون از بازی هایی که ساختید بنویسید.😄
مهدی پورآزاد
