DevOps C++ اور "کچن وارز"، یا میں نے کھانا کھاتے ہوئے گیم کیسے لکھنا شروع کیا۔

"میں جانتا ہوں کہ میں کچھ نہیں جانتا" سقراط

جن کے لئے: IT لوگوں کے لیے جو تمام ڈویلپرز کی پرواہ نہیں کرتے اور اپنے گیمز کھیلنا چاہتے ہیں!

کس کے بارے میں: C/C++ میں گیمز لکھنا شروع کرنے کے بارے میں، اگر آپ کو اچانک اس کی ضرورت ہو!

آپ کو یہ کیوں پڑھنا چاہئے: ایپلیکیشن ڈویلپمنٹ میری مہارت کا شعبہ نہیں ہے، لیکن میں ہر ہفتے کوڈ کرنے کی کوشش کرتا ہوں۔ کیونکہ مجھے کھیل پسند ہیں!

ہیلو! میرا نام ہے اینڈری گرینکن، میں Luxoft میں DevOps ہوں۔ ایپلیکیشن ڈویلپمنٹ میری خاصیت نہیں ہے، لیکن میں ہر ہفتے کوڈ کرنے کی کوشش کرتا ہوں۔ کیونکہ مجھے کھیل پسند ہیں!

کمپیوٹر گیمنگ انڈسٹری بہت بڑی ہے، یہ افواہ آج کی فلم انڈسٹری سے بھی بڑی ہے۔ کمپیوٹرز کے آغاز سے ہی گیمز لکھے گئے ہیں، جدید معیارات، پیچیدہ اور بنیادی ترقی کے طریقوں کا استعمال کرتے ہوئے۔ وقت گزرنے کے ساتھ، پہلے سے پروگرام شدہ گرافکس، فزکس اور آواز کے ساتھ گیم انجن ظاہر ہونے لگے۔ وہ آپ کو خود کھیل کو تیار کرنے پر توجہ مرکوز کرنے اور اس کی بنیاد کے بارے میں فکر نہ کرنے کی اجازت دیتے ہیں۔ لیکن ان کے ساتھ، انجنوں کے ساتھ، ڈویلپر "اندھے ہو جاتے ہیں" اور انحطاط کرتے ہیں۔ گیمز کی پیداوار خود کنویئر بیلٹ پر رکھی جاتی ہے۔ اور مصنوعات کی مقدار اس کے معیار پر غالب آنے لگتی ہے۔

ایک ہی وقت میں، جب دوسرے لوگوں کے کھیل کھیلتے ہیں، تو ہم مسلسل مقامات، پلاٹ، کرداروں، گیم میکینکس کے ذریعے محدود رہتے ہیں جن کے ساتھ دوسرے لوگ آتے ہیں۔ تو مجھے احساس ہوا کہ...

... وقت آگیا ہے کہ میں اپنی دنیاؤں کو تخلیق کروں، صرف میرے تابع۔ دنیا جہاں میں باپ، بیٹا، اور روح القدس ہوں!

اور مجھے پورا یقین ہے کہ اپنا گیم انجن لکھ کر اور اس پر کھیل کر، آپ اپنے جوتے اتارنے، کھڑکیوں کو صاف کرنے اور اپنے کیبن کو اپ گریڈ کرنے کے قابل ہو جائیں گے، ایک زیادہ تجربہ کار اور مکمل پروگرامر بن جائیں گے۔

اس آرٹیکل میں میں آپ کو یہ بتانے کی کوشش کروں گا کہ میں نے C/C++ میں چھوٹے گیمز کیسے لکھنا شروع کیے، ترقی کا عمل کیسا ہے، اور مصروف ماحول میں مجھے شوق کے لیے کہاں وقت ملتا ہے۔ یہ ساپیکش ہے اور انفرادی آغاز کے عمل کو بیان کرتا ہے۔ جہالت اور ایمان کے بارے میں مواد، اس وقت دنیا کی میری ذاتی تصویر کے بارے میں۔ دوسرے الفاظ میں، "انتظامیہ آپ کے ذاتی دماغ کے لیے ذمہ دار نہیں ہے!"

پریکٹس

"عمل کے بغیر علم بیکار ہے، علم کے بغیر مشق خطرناک ہے" کنفیوشس

میری نوٹ بک میری زندگی ہے!


لہذا، عملی طور پر، میں کہہ سکتا ہوں کہ میرے لیے سب کچھ ایک نوٹ پیڈ سے شروع ہوتا ہے۔ میں نہ صرف وہاں اپنے روزمرہ کے کاموں کو لکھتا ہوں، میں ڈرائنگ کرتا ہوں، پروگرام کرتا ہوں، فلو چارٹ ڈیزائن کرتا ہوں اور مسائل کو حل کرتا ہوں، بشمول ریاضی کے۔ ہمیشہ نوٹ پیڈ استعمال کریں اور صرف پنسل میں لکھیں۔ یہ صاف، آسان اور قابل اعتماد ہے، IMHO۔

DevOps C++ اور "کچن وارز"، یا میں نے کھانا کھاتے ہوئے گیم کیسے لکھنا شروع کیا۔
میری (پہلے سے ہی بھری ہوئی) نوٹ بک۔ یہ وہی ہے جو وہ نظر آتا ہے۔ اس میں روزمرہ کے کام، آئیڈیاز، ڈرائنگ، خاکے، حل، بلیک بک کیپنگ، کوڈ وغیرہ شامل ہیں۔

اس مرحلے پر، میں تین پروجیکٹ مکمل کرنے میں کامیاب ہوا (یہ میری سمجھ میں "مکملیت" ہے، کیونکہ کسی بھی پروڈکٹ کو نسبتاً لامتناہی طور پر تیار کیا جا سکتا ہے)۔

  • پروجیکٹ 0: یہ یونٹی گیم انجن کا استعمال کرتے ہوئے C# میں لکھا ہوا 3D آرکیٹیکٹ ڈیمو سین ہے۔ میکوس اور ونڈوز پلیٹ فارمز کے لیے۔
  • گیم 1: ونڈوز کے لیے کنسول گیم سادہ سانپ (ہر کسی کو "سانپ" کے نام سے جانا جاتا ہے)۔ سی میں لکھا گیا۔
  • گیم 2: کنسول گیم Crazy Tanks (ہر ​​کسی کو "ٹینکس" کے نام سے جانا جاتا ہے)، C++ میں لکھا گیا (کلاسز کا استعمال کرتے ہوئے) اور ونڈوز کے لیے بھی۔

پروجیکٹ 0. آرکیٹیکٹ ڈیمو

DevOps C++ اور "کچن وارز"، یا میں نے کھانا کھاتے ہوئے گیم کیسے لکھنا شروع کیا۔
3D سین آرکیٹیکٹ ڈیمو

پہلا پروجیکٹ C/C++ میں نہیں بلکہ C# میں یونٹی گیم انجن کا استعمال کرتے ہوئے لاگو کیا گیا تھا۔ یہ انجن ہارڈ ویئر پر اتنا مطالبہ نہیں کر رہا تھا۔ غیر حقیقی انجن، اور انسٹال اور استعمال کرنے میں بھی آسان لگ رہا تھا۔ میں نے دوسرے انجنوں پر غور نہیں کیا۔

یونٹی میں میرا مقصد کھیل تیار کرنا نہیں تھا۔ میں کسی کردار کے ساتھ ایک 3D منظر بنانا چاہتا تھا۔ اسے، یا اس کے بجائے وہ (میں نے اس لڑکی کا ماڈل بنایا جس سے مجھے پیار تھا =) کو اپنے ارد گرد کی دنیا کے ساتھ حرکت اور تعامل کرنا پڑا۔ صرف یہ سمجھنا ضروری تھا کہ یونٹی کیا ہے، ترقی کا عمل کیا ہے اور کسی چیز کو بنانے کے لیے کتنی محنت درکار ہوتی ہے۔ اس طرح آرکیٹیکٹ ڈیمو پروجیکٹ کا جنم ہوا (نام تقریباً کہیں سے ایجاد ہوا تھا)۔ پروگرامنگ، ماڈلنگ، اینی میشن، ٹیکسچرنگ مجھے روزانہ کے کام میں شاید دو مہینے لگے۔

میں نے یوٹیوب پر 3D ماڈل بنانے کے لیے ٹیوٹوریل ویڈیوز کے ساتھ شروعات کی۔ بلینڈر. بلینڈر 3D ماڈلنگ (اور مزید) کے لیے ایک بہترین مفت ٹول ہے جسے انسٹال کرنے کی ضرورت نہیں ہے۔ اور یہاں ایک جھٹکا میرا انتظار کر رہا تھا... یہ پتہ چلتا ہے کہ ماڈلنگ، اینیمیشن، ٹیکسچرنگ بہت بڑے الگ موضوعات ہیں جن پر آپ کتابیں لکھ سکتے ہیں۔ یہ کرداروں کے لیے خاص طور پر سچ ہے۔ انگلیوں، دانتوں، آنکھوں اور جسم کے دیگر حصوں کو ماڈل کرنے کے لیے آپ کو اناٹومی کے علم کی ضرورت ہوگی۔ چہرے کے پٹھوں کی ساخت کیسے ہوتی ہے؟ لوگ کیسے حرکت کرتے ہیں؟ مجھے ہر بازو، ٹانگ، انگلی، انگلیوں کے phalanges میں ہڈیاں "ڈالنا" تھیں!

حرکت پذیری کو قدرتی نظر آنے کے لیے کالربونز اور اضافی لیور ہڈیوں کا ماڈل بنائیں۔ اس طرح کے اسباق کے بعد، آپ کو اندازہ ہوگا کہ اینی میٹڈ فلموں کے تخلیق کار صرف 30 سیکنڈ کی ویڈیو بنانے کے لیے کتنا کام کرتے ہیں۔ لیکن 3D فلمیں گھنٹوں چلتی ہیں! اور پھر ہم سنیما چھوڑ کر کچھ ایسا کہتے ہیں: "یہ ایک گھٹیا کارٹون/مووی ہے! وہ بہتر کر سکتے تھے..." احمقو!

اور اس پروجیکٹ میں پروگرامنگ کے حوالے سے ایک اور چیز۔ جیسا کہ یہ نکلا، میرے لیے سب سے دلچسپ حصہ ریاضی کا تھا۔ اگر آپ منظر چلاتے ہیں (پروجیکٹ کی تفصیل میں مخزن کا لنک)، تو آپ دیکھیں گے کہ کیمرہ لڑکی کے کردار کے گرد دائرے میں گھومتا ہے۔ کیمرے کی اس طرح کی گردش کو پروگرام کرنے کے لیے، مجھے پہلے دائرے (2D) پر پوزیشن پوائنٹ کے نقاط کا حساب لگانا پڑا، اور پھر کرہ (3D) پر۔ مزے کی بات یہ ہے کہ میں اسکول میں ریاضی سے نفرت کرتا تھا اور اسے C-مائنس سے جانتا تھا۔ جزوی طور پر، شاید، کیونکہ اسکول میں وہ آپ کو صرف یہ نہیں بتاتے کہ اس ریاضی کو زندگی میں کیسے لاگو کیا جاتا ہے۔ لیکن جب آپ اپنے مقصد کے جنون میں مبتلا ہوتے ہیں، آپ کا خواب، آپ کا دماغ صاف اور کھل جاتا ہے! اور آپ مشکل کاموں کو ایک دلچسپ مہم جوئی کے طور پر سمجھنے لگتے ہیں۔ اور پھر آپ سوچتے ہیں: "ٹھیک ہے، آپ کا *پسندیدہ* ریاضی دان آپ کو عام طور پر یہ کیوں نہیں بتا سکتا کہ ان فارمولوں کو کہاں لاگو کیا جا سکتا ہے؟"

DevOps C++ اور "کچن وارز"، یا میں نے کھانا کھاتے ہوئے گیم کیسے لکھنا شروع کیا۔
دائرے اور دائرے پر کسی نقطہ کے نقاط کا حساب لگانے کے لیے فارمولوں کا حساب کتاب (میری نوٹ بک سے)

کھیل 1. سادہ سانپ

  • پلیٹ فارم: ونڈوز (ونڈوز 7، 10 پر تجربہ کیا گیا)
  • زبان: مجھے لگتا ہے کہ میں نے اسے خالص C میں لکھا ہے۔
  • گیم انجن: ونڈوز کنسول
  • الہام: javidx9
  • ذخیرہ: GitHub کے

DevOps C++ اور "کچن وارز"، یا میں نے کھانا کھاتے ہوئے گیم کیسے لکھنا شروع کیا۔
سانپ کا سادہ کھیل

ایک 3D منظر کوئی کھیل نہیں ہے۔ اس کے علاوہ، ماڈلنگ اور 3D اشیاء (خاص طور پر کرداروں) کو متحرک کرنا وقت طلب اور مشکل ہے۔ اتحاد کے ساتھ کھیلنے کے بعد، مجھے یہ احساس ہوا کہ مجھے بنیادی باتوں سے جاری رکھنے یا اس کے بجائے شروع کرنے کی ضرورت ہے۔ کھیل کی ساخت کو سمجھنے کے لیے کچھ آسان اور تیز، لیکن ایک ہی وقت میں عالمی۔

آسان اور تیز کیا ہے؟ یہ ٹھیک ہے، کنسول اور 2D۔ زیادہ واضح طور پر، یہاں تک کہ کنسول اور علامتیں بھی۔ میں ایک بار پھر انٹرنیٹ پر الہام کی تلاش میں گیا (عام طور پر، میرے خیال میں انٹرنیٹ XNUMXویں صدی کی سب سے زیادہ انقلابی اور خطرناک ایجاد ہے)۔ میں نے ایک پروگرامر کی ایک ویڈیو کھدائی جس نے ٹیٹریس کو کنسول بنایا۔ اور اس کے کھیل کی طرح میں نے "سانپ" بنانے کا فیصلہ کیا۔ ویڈیو سے میں نے دو بنیادی چیزوں کے بارے میں سیکھا - گیم لوپ (تین بنیادی افعال/حصوں کے ساتھ) اور بفر میں آؤٹ پٹ۔

گیم لوپ کچھ اس طرح نظر آسکتا ہے:

int main()
   {
      Setup();
      // a game loop
      while (!quit)
      {
          Input();
          Logic();
          Draw();
          Sleep(gameSpeed);  // game timing
      }
      return 0;
   }

کوڈ پورے مین () فنکشن کو ایک ساتھ پیش کرتا ہے۔ اور گیم سائیکل مناسب تبصرے کے بعد شروع ہوتا ہے۔ لوپ میں تین بنیادی افعال ہیں: ان پٹ ()، منطق ()، ڈرا ()۔ سب سے پہلے، ان پٹ ڈیٹا ان پٹ (بنیادی طور پر کی اسٹروکس کا کنٹرول)، پھر داخل کردہ ڈیٹا لاجک پر کارروائی، پھر اسکرین پر آؤٹ پٹ - ڈرا۔ اور اسی طرح ہر فریم پر۔ اینیمیشن اس طرح بنتی ہے۔ یہ کارٹونوں کی طرح ہے۔ عام طور پر، درج کردہ ڈیٹا پر کارروائی کرنے میں سب سے زیادہ وقت لگتا ہے اور، جہاں تک میں جانتا ہوں، گیم کے فریم ریٹ کا تعین کرتا ہے۔ لیکن یہاں Logic() فنکشن بہت تیزی سے کام کرتا ہے۔ لہذا، آپ کو گیم اسپیڈ پیرامیٹر کے ساتھ Sleep() فنکشن کا استعمال کرتے ہوئے فریم ریٹ کو کنٹرول کرنا ہوگا، جو اس رفتار کا تعین کرتا ہے۔

DevOps C++ اور "کچن وارز"، یا میں نے کھانا کھاتے ہوئے گیم کیسے لکھنا شروع کیا۔
کھیل سائیکل. نوٹ پیڈ میں "سانپ" کو پروگرام کرنا

اگر آپ کردار پر مبنی کنسول گیم تیار کر رہے ہیں، تو آپ باقاعدہ 'cout' سٹریم آؤٹ پٹ کا استعمال کرتے ہوئے اسکرین پر ڈیٹا آؤٹ پٹ نہیں کر پائیں گے - یہ بہت سست ہے۔ لہذا، آؤٹ پٹ کو اسکرین بفر میں بھیجا جانا چاہیے۔ یہ بہت تیز ہے اور گیم بغیر کسی خرابی کے چلے گی۔ سچ پوچھیں تو، میں بالکل سمجھ نہیں پا رہا ہوں کہ اسکرین بفر کیا ہے اور یہ کیسے کام کرتا ہے۔ لیکن میں یہاں کوڈ کی ایک مثال دوں گا، اور شاید کوئی تبصرے میں صورتحال کو واضح کر سکے۔

اسکرین بفر حاصل کرنا (تو بات کریں):

// create screen buffer for drawings
   HANDLE hConsole = CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE, 0,
 							   NULL, CONSOLE_TEXTMODE_BUFFER, NULL);
   DWORD dwBytesWritten = 0;
   SetConsoleActiveScreenBuffer(hConsole);

ایک مخصوص سٹرنگ سکور لائن کا براہ راست ڈسپلے (اسکور ڈسپلے لائن):

// draw the score
   WriteConsoleOutputCharacter(hConsole, scoreLine, GAME_WIDTH, {2,3}, &dwBytesWritten);

اصولی طور پر، اس کھیل میں کچھ بھی پیچیدہ نہیں ہے؛ میرے خیال میں یہ ایک اچھی انٹری لیول مثال ہے۔ کوڈ ایک فائل میں لکھا جاتا ہے اور کئی فنکشنز میں فارمیٹ کیا جاتا ہے۔ کوئی کلاس نہیں، کوئی وراثت نہیں۔ آپ GitHub پر ریپوزٹری میں جا کر گیم کے سورس کوڈ میں سب کچھ خود دیکھ سکتے ہیں۔

کھیل 2. پاگل ٹینک

DevOps C++ اور "کچن وارز"، یا میں نے کھانا کھاتے ہوئے گیم کیسے لکھنا شروع کیا۔
کھیل ہی کھیل میں پاگل ٹینک

کنسول پر کریکٹر پرنٹ کرنا شاید سب سے آسان چیز ہے جسے آپ گیم میں تبدیل کر سکتے ہیں۔ لیکن پھر ایک پریشانی ظاہر ہوتی ہے: علامتوں کی اونچائی اور چوڑائی مختلف ہوتی ہے (اونچائی چوڑائی سے زیادہ ہوتی ہے)۔ اس طرح، ہر چیز تناسب سے باہر نظر آئے گی، اور نیچے یا اوپر کی حرکت بائیں یا دائیں حرکت کرنے سے کہیں زیادہ تیز نظر آئے گی۔ یہ اثر سانپ (گیم 1) میں بہت نمایاں ہے۔ "ٹینکس" (گیم 2) میں یہ خرابی نہیں ہے، کیونکہ وہاں کی آؤٹ پٹ اسکرین پکسلز کو مختلف رنگوں سے پینٹ کرنے کے ذریعے ترتیب دی جاتی ہے۔ آپ کہہ سکتے ہیں کہ میں نے ایک پیش کنندہ لکھا ہے۔ سچ ہے، یہ تھوڑا زیادہ پیچیدہ ہے، اگرچہ بہت زیادہ دلچسپ ہے.

اس گیم کے لیے، اسکرین پر پکسلز دکھانے کے لیے میرے سسٹم کی وضاحت کرنا کافی ہوگا۔ میں اسے کھیل کا اہم حصہ سمجھتا ہوں۔ اور آپ خود ہی ہر چیز کے ساتھ آ سکتے ہیں۔

لہذا، آپ اسکرین پر جو کچھ دیکھتے ہیں وہ کثیر رنگ کے مستطیلوں کا ایک سیٹ ہے۔

DevOps C++ اور "کچن وارز"، یا میں نے کھانا کھاتے ہوئے گیم کیسے لکھنا شروع کیا۔
مستطیلوں کا سیٹ

ہر مستطیل کو اعداد سے بھرا ہوا میٹرکس کے ذریعہ دکھایا جاتا ہے۔ ویسے، میں ایک دلچسپ بات کو اجاگر کر سکتا ہوں - گیم میں تمام میٹرکس کو ایک جہتی صف کے طور پر پروگرام کیا گیا ہے۔ دو جہتی نہیں بلکہ یک جہتی! ایک جہتی صفوں کے ساتھ کام کرنا بہت آسان اور تیز ہے۔

DevOps C++ اور "کچن وارز"، یا میں نے کھانا کھاتے ہوئے گیم کیسے لکھنا شروع کیا۔
گیم ٹینک میٹرکس کی مثال

DevOps C++ اور "کچن وارز"، یا میں نے کھانا کھاتے ہوئے گیم کیسے لکھنا شروع کیا۔
گیم ٹینک میٹرکس کی ایک جہتی صف کے طور پر نمائندگی

DevOps C++ اور "کچن وارز"، یا میں نے کھانا کھاتے ہوئے گیم کیسے لکھنا شروع کیا۔
ایک جہتی صف کے بطور میٹرکس کی نمائندگی کرنے کی ایک اور بصری مثال

لیکن صف کے عناصر تک رسائی ڈبل لوپ میں ہوتی ہے، گویا یہ ایک جہتی صف نہیں ہے، بلکہ دو جہتی ہے۔ یہ اس لیے کیا گیا ہے کہ ہم اب بھی میٹرک کے ساتھ کام کرتے ہیں۔

DevOps C++ اور "کچن وارز"، یا میں نے کھانا کھاتے ہوئے گیم کیسے لکھنا شروع کیا۔
ڈبل لوپ میں ایک جہتی صف کو عبور کرنا۔ Y - قطار شناخت کنندہ، X - کالم شناخت کنندہ

براہ کرم نوٹ کریں: معمول کے میٹرکس شناخت کنندگان i، j کے بجائے، میں شناخت کنندگان x اور y استعمال کرتا ہوں۔ اس طرح، یہ مجھے لگتا ہے، یہ آنکھ کے لئے زیادہ خوشگوار اور دماغ کے لئے زیادہ قابل فہم ہے۔ اس کے علاوہ، اس طرح کے اشارے سے دو جہتی امیج کے کوآرڈینیٹ محور پر استعمال ہونے والے میٹرکس کو آسانی سے پیش کرنا ممکن ہو جاتا ہے۔

اب پکسلز، رنگ اور اسکرین آؤٹ پٹ کے بارے میں۔ StretchDIBits فنکشن آؤٹ پٹ کے لیے استعمال ہوتا ہے (ہیڈر: windows.h؛ لائبریری: gdi32.lib)۔ یہ فنکشن، دوسری چیزوں کے علاوہ، درج ذیل حاصل کرتا ہے: وہ آلہ جس پر تصویر دکھائی جاتی ہے (میرے معاملے میں، یہ ونڈوز کنسول ہے)، تصویری ڈسپلے کے آغاز کے نقاط، اس کی چوڑائی/اونچائی، اور تصویر خود بٹ میپ کی شکل، جس کی نمائندگی بائٹس کی ایک صف سے ہوتی ہے۔ بٹ میپ بطور بائٹ سرنی!

StretchDIBits() فنکشن ان ایکشن:

// screen output for game field
   StretchDIBits(
               deviceContext,
               OFFSET_LEFT, OFFSET_TOP,
               PMATRIX_WIDTH, PMATRIX_HEIGHT,
               0, 0,
               PMATRIX_WIDTH, PMATRIX_HEIGHT,
               m_p_bitmapMemory, &bitmapInfo,
               DIB_RGB_COLORS,
               SRCCOPY
               );

VirtualAlloc() فنکشن کا استعمال کرتے ہوئے اس بٹ میپ کے لیے پہلے سے میموری مختص کی جاتی ہے۔ یعنی تمام پکسلز کے بارے میں معلومات کو ذخیرہ کرنے کے لیے مطلوبہ تعداد میں بائٹس محفوظ ہیں، جو اس کے بعد اسکرین پر ظاہر ہوں گی۔

m_p_bitmapمیموری بٹ میپ بنانا:

// create bitmap
   int bitmapMemorySize = (PMATRIX_WIDTH * PMATRIX_HEIGHT) * BYTES_PER_PIXEL;
   void* m_p_bitmapMemory = VirtualAlloc(0, bitmapMemorySize, MEM_COMMIT, PAGE_READWRITE);

موٹے طور پر، ایک بٹ میپ پکسلز کے مجموعہ پر مشتمل ہوتا ہے۔ صف میں ہر چار بائٹس ایک آر جی بی پکسل ہے۔ ایک بائٹ فی سرخ رنگ کی قدر، ایک بائٹ فی سبز رنگ کی قدر (G)، اور ایک بائٹ فی نیلے رنگ کی قدر (B)۔ اس کے علاوہ انڈینٹیشن کے لیے ایک بائٹ باقی ہے۔ یہ تینوں رنگ - سرخ/سبز/نیلے (RGB) - کو ایک دوسرے کے ساتھ مختلف تناسب میں ملا کر نتیجے میں پکسل کا رنگ بنایا جاتا ہے۔

اب، ایک بار پھر، ہر ایک مستطیل، یا گیم آبجیکٹ، ایک عددی میٹرکس سے ظاہر ہوتا ہے۔ یہ تمام گیم اشیاء ایک مجموعہ میں رکھی گئی ہیں۔ اور پھر انہیں کھیل کے میدان پر رکھا جاتا ہے، جس سے ایک بڑا عددی میٹرکس بنتا ہے۔ میں نے میٹرکس میں ہر نمبر کو ایک مخصوص رنگ سے منسلک کیا۔ مثال کے طور پر، نمبر 8 نیلے رنگ سے، نمبر 9 پیلے رنگ سے، نمبر 10 سے گہرے سرمئی، وغیرہ۔ اس طرح، ہم کہہ سکتے ہیں کہ ہمارے پاس کھیل کے میدان کا ایک میٹرکس ہے، جہاں ہر نمبر ایک رنگ ہے۔

لہذا، ہمارے پاس ایک طرف پورے کھیل کے میدان کا عددی میٹرکس ہے اور دوسری طرف تصویر کو دکھانے کے لیے ایک بٹ میپ ہے۔ ابھی تک، بٹ میپ "خالی" ہے - اس میں ابھی تک مطلوبہ رنگ کے پکسلز کے بارے میں معلومات نہیں ہیں۔ اس کا مطلب یہ ہے کہ آخری مرحلہ کھیل کے میدان کے عددی میٹرکس کی بنیاد پر ہر پکسل کے بارے میں معلومات کے ساتھ بٹ میپ کو آباد کرنا ہوگا۔ اس طرح کی تبدیلی کی ایک واضح مثال نیچے دی گئی تصویر میں ہے۔

DevOps C++ اور "کچن وارز"، یا میں نے کھانا کھاتے ہوئے گیم کیسے لکھنا شروع کیا۔
کھیل کے میدان کے ڈیجیٹل میٹرکس پر مبنی معلومات کے ساتھ بٹ میپ (پکسل میٹرکس) کو بھرنے کی ایک مثال (رنگ انڈیکس گیم کے انڈیکس سے میل نہیں کھاتے)

میں گیم سے اصلی کوڈ کا ایک ٹکڑا بھی پیش کروں گا۔ لوپ کے ہر تکرار پر متغیر کلر انڈیکس کو کھیل کے میدان (مین ڈیجیٹل میٹرکس) کے عددی میٹرکس سے ایک قدر (رنگ انڈیکس) تفویض کیا جاتا ہے۔ رنگ متغیر پھر انڈیکس کی بنیاد پر رنگ پر سیٹ کیا جاتا ہے۔ نتیجے کے رنگ کو پھر سرخ، سبز اور نیلے (RGB) کے تناسب میں تقسیم کیا جاتا ہے۔ اور پکسل پیڈنگ کے ساتھ، یہ معلومات بار بار پکسل میں لکھی جاتی ہے، بٹ میپ میں رنگین تصویر بناتی ہے۔

کوڈ پوائنٹرز اور بٹ وائز آپریشنز کا استعمال کرتا ہے، جنہیں سمجھنا مشکل ہو سکتا ہے۔ لہذا میں آپ کو مشورہ دیتا ہوں کہ آپ کہیں الگ سے پڑھیں کہ اس طرح کے ڈھانچے کیسے کام کرتے ہیں۔

کھیل کے میدان کے عددی میٹرکس کی بنیاد پر معلومات کے ساتھ بٹ میپ کو بھرنا:

// set pixel map variables
   int colorIndex;
   COLORREF color;
   int pitch;
   uint8_t* p_row;
 
   // arrange pixels for game field
   pitch = PMATRIX_WIDTH * BYTES_PER_PIXEL;     // row size in bytes
   p_row = (uint8_t*)m_p_bitmapMemory;       //cast to uint8 for valid pointer arithmetic
   							(to add by 1 byte (8 bits) at a time)   
   for (int y = 0; y < PMATRIX_HEIGHT; ++y)
   {
       uint32_t* p_pixel = (uint32_t*)p_row;
       for (int x = 0; x < PMATRIX_WIDTH; ++x)
       {
           colorIndex = mainDigitalMatrix[y * PMATRIX_WIDTH + x];
           color = Utils::GetColor(colorIndex);
           uint8_t blue = GetBValue(color);
           uint8_t green = GetGValue(color);
           uint8_t red = GetRValue(color);
           uint8_t pixelPadding = 0;
 
           *p_pixel = ((pixelPadding << 24) | (red << 16) | (green << 8) | blue);
           ++p_pixel;
       }
       p_row += pitch;
   }

اوپر بیان کردہ طریقہ کے مطابق، گیم Crazy Tanks میں ایک تصویر (فریم) بنتی ہے اور ڈرا() فنکشن میں اسکرین پر ظاہر ہوتی ہے۔ Input() فنکشن میں کی اسٹروکس کے اندراج اور Logic() فنکشن میں ان کے بعد کی پروسیسنگ کے بعد، ایک نئی تصویر (فریم) بنتی ہے۔ یہ سچ ہے کہ کھیل کی اشیاء کی کھیل کے میدان میں پہلے سے ہی ایک مختلف پوزیشن ہو سکتی ہے اور اس کے مطابق، ایک مختلف جگہ پر تیار کیا جاتا ہے۔ اینیمیشن (حرکت) اس طرح ہوتی ہے۔

تھیوری میں (اگر میں کچھ نہیں بھولا ہوں)، پہلی گیم ("Snake") کے گیم لوپ کو سمجھنا اور دوسری گیم ("Tanks") سے اسکرین پر پکسلز ڈسپلے کرنے کے نظام کو سمجھنا ہی آپ کو کچھ بھی لکھنے کی ضرورت ہے۔ ونڈوز کے تحت آپ کے 2D گیمز کا۔ بے آواز! 😉 باقی پرزے تو بس ایک اڑان ہے

یقینا، "ٹینکس" کھیل "سانپ" سے کہیں زیادہ پیچیدہ ہے۔ میں نے پہلے ہی C++ زبان استعمال کی ہے، یعنی میں نے کلاسز کے ساتھ مختلف گیم آبجیکٹ کو بیان کیا۔ میں نے اپنا مجموعہ بنایا ہے - کوڈ کو headers/Box.h میں دیکھا جا سکتا ہے۔ ویسے، مجموعہ میں غالباً میموری لیک ہونے کا امکان ہے۔ استعمال شدہ اشارے۔ یادداشت کے ساتھ کام کیا۔ مجھے یہ کہنا ضروری ہے کہ کتاب نے میری بہت مدد کی۔ گیم پروگرامنگ کے ذریعے C++ کا آغاز. C++ میں ابتدائی افراد کے لیے یہ ایک بہترین آغاز ہے۔ یہ چھوٹا، دلچسپ اور اچھی طرح سے منظم ہے۔

اس گیم کو تیار کرنے میں تقریباً چھ ماہ لگے۔ میں نے بنیادی طور پر کام پر لنچ اور ناشتے کے دوران لکھا۔ اس نے دفتر کے کچن میں بیٹھ کر کھانا روندا اور کوڈ لکھا۔ یا گھر میں رات کے کھانے پر۔ تو میں نے ان "باورچی خانے کی جنگوں" کا خاتمہ کیا۔ ہمیشہ کی طرح، میں نے فعال طور پر ایک نوٹ بک کا استعمال کیا، اور تمام تصوراتی چیزیں اس میں پیدا ہوئیں.

عملی حصہ مکمل کرنے کے لیے، میں اپنی نوٹ بک کے چند اسکین لوں گا۔ یہ دکھانے کے لیے کہ میں نے بالکل کیا لکھا، کھینچا، شمار کیا، ڈیزائن کیا...

DevOps C++ اور "کچن وارز"، یا میں نے کھانا کھاتے ہوئے گیم کیسے لکھنا شروع کیا۔
ٹینکوں کی تصاویر ڈیزائن کرنا۔ اور اس بات کا تعین کرنا کہ ہر ٹینک کو اسکرین پر کتنے پکسلز پر قبضہ کرنا چاہیے۔

DevOps C++ اور "کچن وارز"، یا میں نے کھانا کھاتے ہوئے گیم کیسے لکھنا شروع کیا۔
اس کے محور کے گرد ٹینک کی گردش کے لیے الگورتھم اور فارمولوں کا حساب

DevOps C++ اور "کچن وارز"، یا میں نے کھانا کھاتے ہوئے گیم کیسے لکھنا شروع کیا۔
میرے مجموعے کی اسکیم (وہ جس میں میموری کا رساو ہے، غالباً)۔ مجموعہ لنکڈ لسٹ کی قسم کے مطابق بنایا گیا ہے۔

DevOps C++ اور "کچن وارز"، یا میں نے کھانا کھاتے ہوئے گیم کیسے لکھنا شروع کیا۔
اور یہ مصنوعی ذہانت کو گیم سے جوڑنے کی فضول کوششیں ہیں۔

Теория

’’ہزار میل کا سفر بھی پہلے قدم سے شروع ہوتا ہے‘‘ (قدیم چینی حکمت)

آئیے پریکٹس سے تھیوری کی طرف چلتے ہیں! اپنے شوق کے لیے وقت کیسے نکالیں؟

  1. اس بات کا تعین کریں کہ آپ واقعی کیا چاہتے ہیں (افسوس، یہ سب سے مشکل حصہ ہے)۔
  2. ترجیحات طے کریں۔
  3. اعلیٰ ترجیحات کی خاطر سب کچھ "اضافی" قربان کر دیں۔
  4. ہر روز اہداف کی طرف بڑھیں۔
  5. دو یا تین گھنٹے کے فارغ وقت کی توقع نہ کریں کہ وہ کسی شوق میں گزاریں۔

ایک طرف، آپ کو یہ طے کرنے کی ضرورت ہے کہ آپ کیا چاہتے ہیں اور ترجیح دیں۔ دوسری طرف، ان ترجیحات کے حق میں کچھ سرگرمیوں/منصوبوں کو ترک کرنا ممکن ہے۔ دوسرے لفظوں میں، آپ کو سب کچھ "اضافی" قربان کرنا پڑے گا۔ میں نے کہیں سنا تھا کہ زندگی میں زیادہ سے زیادہ تین اہم سرگرمیاں ہونی چاہئیں۔ تب آپ انہیں اعلیٰ ترین معیار پر کر سکیں گے۔ اور اضافی پروجیکٹس/ہدایات آسانی سے اوورلوڈ ہونا شروع ہو جائیں گی۔ لیکن یہ سب شاید سبجیکٹو اور انفرادی ہے۔

ایک خاص سنہری اصول ہے: کبھی بھی 0% دن نہیں ہوتا ہے! میں نے اس کے بارے میں ایک انڈی ڈویلپر کے ایک مضمون میں سیکھا۔ اگر آپ کسی پروجیکٹ پر کام کر رہے ہیں تو ہر روز اس کے بارے میں کچھ نہ کچھ کریں۔ اور اس سے کوئی فرق نہیں پڑتا کہ آپ کتنا کرتے ہیں۔ ایک لفظ یا کوڈ کی ایک لائن لکھیں، ایک ٹیوٹوریل ویڈیو دیکھیں یا بورڈ میں ایک کیل ماریں - بس کچھ کریں۔ سب سے مشکل کام شروع کرنا ہے۔ ایک بار شروع کرنے کے بعد، آپ شاید اپنی خواہش سے تھوڑا زیادہ کام کر لیں گے۔ اس طرح آپ مسلسل اپنے مقصد کی طرف بڑھیں گے اور، مجھ پر یقین کریں، بہت جلد۔ سب کے بعد، تمام چیزوں میں بنیادی رکاوٹ تاخیر ہے.

اور یہ یاد رکھنا ضروری ہے کہ آپ کو 5، 10، 15 منٹ کے مفت "چورا" کو کم نہیں سمجھنا چاہئے اور اسے نظر انداز نہیں کرنا چاہئے، ایک یا دو گھنٹے تک چلنے والے کچھ بڑے "لاگز" کا انتظار کریں۔ کیا آپ لائن میں کھڑے ہیں؟ اپنے منصوبے کے لیے کچھ سوچیں۔ ایسکلیٹر لے رہے ہو؟ نوٹ پیڈ میں کچھ لکھیں۔ کیا آپ بس میں سفر کر رہے ہیں؟ بہت اچھا، کوئی مضمون پڑھیں۔ ہر موقع سے فائدہ اٹھائیں۔ یوٹیوب پر بلیوں اور کتوں کو دیکھنا بند کریں! اپنے دماغ کو آلودہ نہ کرو!

اور ایک آخری بات۔ اگر، اس مضمون کو پڑھنے کے بعد، آپ کو گیم انجنوں کا استعمال کیے بغیر گیمز بنانے کا خیال پسند آیا، تو Casey Muratori کا نام یاد رکھیں۔ اس آدمی کے پاس ہے۔ ویب سائٹ. "واچ -> پچھلی قسطیں" سیکشن میں آپ کو شروع سے پیشہ ورانہ گیم بنانے کے بارے میں شاندار مفت ویڈیو ٹیوٹوریل ملیں گے۔ ونڈوز کے اسباق کے لیے پانچ انٹرو ٹو سی میں آپ شاید یونیورسٹی کے پانچ سال کے مطالعے سے زیادہ سیکھیں گے (کسی نے ویڈیو کے نیچے تبصروں میں اس کے بارے میں لکھا ہے)۔

کیسی یہ بھی بتاتا ہے کہ آپ کے اپنے گیم انجن کو تیار کرنے سے، آپ کو کسی بھی موجودہ انجن کی بہتر سمجھ حاصل ہو گی۔ فریم ورک کی دنیا میں جہاں ہر کوئی خودکار بنانے کی کوشش کر رہا ہے، آپ استعمال کرنے کے بجائے تخلیق کرنا سیکھتے ہیں۔ آپ کمپیوٹر کی فطرت کو سمجھتے ہیں۔ اور آپ ایک بہت زیادہ ذہین اور بالغ پروگرامر بھی بن جائیں گے - ایک پرو۔

آپ کے منتخب کردہ راستے پر گڈ لک! اور آئیے دنیا کو مزید پیشہ ور بنائیں۔

مصنف: گرینکن اینڈری, DevOps



ماخذ: www.habr.com