DevOps C++ ۽ ”باورچي جون جنگيون“، يا مان کائڻ دوران رانديون لکڻ ڪيئن شروع ڪيون

"مان ڄاڻان ٿو ته مان ڪجھ به نه ڄاڻان ٿو." سقراط

ڪنهن لاء: آئي ٽي ماڻهن لاءِ جيڪي سڀني ڊولپرز تي اڇليندا آهن ۽ انهن جون رانديون کيڏڻ چاهيندا آهن!

ڪهڙي طرح جي باري ۾: جيڪڏهن توهان کي ضرورت هجي ته C/C++ ۾ رانديون لکڻ ڪيئن شروع ڪيون!

توهان کي هي ڇو پڙهڻ گهرجي: ايپ ڊولپمينٽ منهنجي ڪم جي خاصيت ناهي، پر مان هر هفتي ڪوڊ ڪرڻ جي ڪوشش ڪندو آهيان. ڇو ته مون کي رانديون پسند آهن!

هيلو منهنجو نالو آهي آندري گرانڪين، مان Luxoft ۾ هڪ DevOps آهيان. ايپليڪيشن ڊولپمينٽ منهنجي ڪم جي خاصيت ناهي، پر مان هر هفتي ڪوڊ ڪرڻ جي ڪوشش ڪندو آهيان. ڇو ته مون کي رانديون پسند آهن!

ڪمپيوٽر گيمز انڊسٽري تمام وڏي آهي، اڄ به فلم انڊسٽري کان وڌيڪ افواهون. رانديون ڪمپيوٽر جي ترقي جي شروعات کان وٺي، جديد معيار، پيچيده ۽ بنيادي ترقي جي طريقن سان استعمال ڪندي لکيو ويو آهي. وقت سان گڏ، راند انجڻ اڳ ۾ ئي پروگرام ٿيل گرافڪس، فزڪس ۽ آواز سان ظاهر ٿيڻ شروع ڪيو. اهي توهان کي راند جي ترقي تي ڌيان ڏيڻ جي اجازت ڏين ٿا ۽ ان جي بنياد جي باري ۾ پريشان نه ڪن. پر ان سان گڏ، انجڻين سان گڏ، ڊولپرز "انڌا ٿي وڃو" ۽ خراب ٿي ويا. راندين جي تمام پيداوار conveyor تي رکيل آهي. ۽ پيداوار جو مقدار ان جي معيار تي غالب ٿيڻ شروع ٿئي ٿو.

ساڳئي وقت، جڏهن ٻين ماڻهن جون رانديون کيڏڻ، اسان مسلسل جڳهن، پلاٽ، ڪردارن، راند ميڪيڪڪس تائين محدود هوندا آهيون جيڪي ٻيا ماڻهو آيا آهن. تنهنڪري مون سمجهيو ته ...

... اهو وقت آهي توهان جي پنهنجي دنيا ٺاهڻ جو، صرف منهنجي تابع. دنيا جتي آئون پيء آهيان، ۽ پٽ، ۽ پاڪ روح!

۽ مان خلوص سان سمجهان ٿو ته توهان جي پنهنجي گيم انجڻ ۽ ان تي هڪ راند لکڻ سان، توهان پنهنجون اکيون کولڻ جي قابل ٿي ويندا، ونڊوز کي صاف ڪري سگهو ٿا ۽ پنهنجي ڪيبن کي پمپ ڪري، هڪ وڌيڪ تجربيڪار ۽ لازمي پروگرامر بڻجي ويندا.

هن آرٽيڪل ۾ مان توهان کي ٻڌائڻ جي ڪوشش ڪندس ته ڪيئن مون C/C++ ۾ ننڍيون رانديون لکڻ شروع ڪيون، ترقيءَ جو عمل ڇا آهي ۽ مصروف ماحول ۾ شوق لاءِ وقت ڪٿي ٿو ملي. اهو تابع آهي ۽ هڪ فرد جي شروعات جي عمل کي بيان ڪري ٿو. جهالت ۽ ايمان بابت مواد، هن وقت دنيا جي منهنجي ذاتي تصوير بابت. ٻين لفظن ۾، "انتظام توهان جي ذاتي دماغ لاء ذميوار نه آهي!".

مشق

”علم بغير عمل جي بيڪار آهي، علم کان سواءِ عمل خطرناڪ آهي“ ڪنفيوشس

منهنجو نوٽ بڪ منهنجي زندگي آهي!


تنهن ڪري، عملي طور تي، مان اهو چئي سگهان ٿو ته مون لاء هر شيء هڪ نوٽ بڪ سان شروع ٿئي ٿي. مان اتي نه رڳو پنهنجا روزمره جا ڪم لکندو آهيان، پر ڊرائنگ، پروگرام، فلو چارٽ ڊزائين ڪرڻ ۽ مسئلن کي حل ڪرڻ، بشمول رياضي جا ڪم. هميشه هڪ نوٽ پيڊ استعمال ڪريو ۽ صرف پنسل سان لکو. اهو صاف، آرامده ۽ قابل اعتماد آهي، IMHO.

DevOps C++ ۽ ”باورچي جون جنگيون“، يا مان کائڻ دوران رانديون لکڻ ڪيئن شروع ڪيون
منهنجو (اڳ ۾ ئي ڀريل) نوٽ بڪ. اهو ڪيئن ڏسڻ ۾ اچي ٿو. ان ۾ روزمره جا ڪم، خيال، ڊرائنگ، ڊرائنگ، حل، بليڪ بوڪ ڪيپنگ، ڪوڊ وغيره شامل آهن.

هن مرحلي تي، مون ٽن منصوبن کي مڪمل ڪرڻ ۾ مدد ڪئي (اها منهنجي سمجهه ۾ آهي "فائنلٽي"، ڇاڪاڻ ته ڪنهن به پراڊڪٽ کي ترقي ڪري سگهجي ٿو نسبتا لامحدود).

  • پروجيڪٽ 0: هي هڪ آرڪيٽيڪٽ ڊيمو 3D منظر آهي C# ۾ لکيو ويو آهي يونٽي گيم انجڻ استعمال ڪندي. MacOS ۽ ونڊوز پليٽ فارمن لاءِ.
  • راند 1: ونڊوز لاءِ ڪنسول گيم Simple Snake (سڀني کي ”سانپ“ جي نالي سان سڃاتو وڃي ٿو). سي ۾ لکيل آهي.
  • راند 2: ڪنسول گيم Crazy Tanks (هر ڪنهن کي "ٽينڪس" جي نالي سان سڃاتو وڃي ٿو)، اڳ ۾ ئي C ++ ۾ لکيل آهي (ڪلاس استعمال ڪندي) ۽ ونڊوز جي تحت.

پروجيڪٽ 0 معمار ڊيمو

  • پليٽ فارم: ونڊوز (ونڊوز 7، 10)، ميڪ او ايس (OS X El Capitan v. 10.11.6)
  • ٻولي C#
  • راند انجڻ: وحدت
  • وحي: ڊرين ليل
  • مخزن: GitHub

DevOps C++ ۽ ”باورچي جون جنگيون“، يا مان کائڻ دوران رانديون لکڻ ڪيئن شروع ڪيون
3D منظر آرڪيٽيڪٽ ڊيمو

پهريون منصوبو C/C++ ۾ نه، پر C# ۾ يونٽي گيم انجڻ استعمال ڪندي لاڳو ڪيو ويو. هي انجڻ هارڊويئر تي ايترو مطالبو نه هو جيترو غير حقيقي انجنيئر، ۽ پڻ مون کي انسٽال ڪرڻ ۽ استعمال ڪرڻ آسان لڳي. مون ٻين انجڻين تي غور نه ڪيو.

مون لاءِ اتحاد ۾ مقصد ڪنهن قسم جي راند کي ترقي ڪرڻ نه هو. مون چاهيو ٿي ته هڪ 3D منظر ڪنهن قسم جي ڪردار سان ٺاهيو. هن، يا بلڪه هوءَ (مون ان ڇوڪريءَ کي ماڊل ڪيو جنهن سان مون کي پيار هو =) هن کي ٻاهرئين دنيا سان هلڻ ۽ ان سان رابطو ڪرڻو پيو. اهو سمجهڻ ضروري هو ته اتحاد ڇا آهي، ترقي جو عمل ڇا آهي ۽ ڪنهن شيءِ کي ٺاهڻ لاءِ ڪيتري محنت ڪرڻي پوي ٿي. اهو ڪيئن آهي آرڪيٽيڪيٽ ڊيمو پروجيڪٽ پيدا ٿيو (نالو تقريبا بلشٽ مان ايجاد ڪيو ويو). پروگرامنگ، ماڊلنگ، اينيميشن، ٽيڪسٽچرنگ مون کي روزانو ڪم جا ٻه مهينا لڳي ويا.

مون يوٽيوب تي ٽيوٽوريل وڊيوز سان شروع ڪيو ته ڪيئن 3D ماڊل ٺاهيا وڃن بليڪر. Blender 3D ماڊلنگ (۽ وڌيڪ) لاءِ هڪ بهترين مفت اوزار آهي جنهن کي انسٽاليشن جي ضرورت ناهي. ۽ هتي هڪ جھٽڪو مون کي انتظار ڪري رهيو آهي ... اهو ظاهر ٿئي ٿو ته ماڊلنگ، اينيميشن، ٽيڪسٽچرنگ وڏا الڳ موضوع آهن جن تي توهان ڪتاب لکي سگهو ٿا. اهو خاص طور تي ڪردارن لاء صحيح آهي. آڱرين، ڏند، اکيون ۽ جسم جي ٻين حصن کي ماڊل ڪرڻ لاء، توهان کي اناتومي جي علم جي ضرورت پوندي. منهن جي عضون کي ڪيئن ترتيب ڏنو ويو آهي؟ ماڻهو ڪيئن هلندا آهن؟ مون کي هر هڪ هٿ، ٽنگ، آڱر، ڌڪ ۾ هڏا "داخل" ڪرڻو پيو!

ڪلويڪل کي ماڊل ڪريو، اضافي هڏا ليور، ته جيئن اينيميشن قدرتي نظر اچي. اهڙن سبقن کان پوءِ، توهان کي احساس ٿيندو ته اينيميٽڊ فلمن جا تخليقڪار ڪيترو وڏو ڪم ڪن ٿا، صرف 30 سيڪنڊن جي وڊيو ٺاهڻ لاءِ. پر 3D فلمون ڪلاڪن تائين رهي ٿو! ۽ پوءِ اسان ٿيئٽرن مان ٻاهر اچون ٿا ۽ ڪجهه ائين چئون ٿا: ”تا، هڪ بيوقوف ڪارٽون / فلم! اهي بهتر ڪري سگهن ها...“ بيوقوف!

۽ هن منصوبي ۾ پروگرامنگ بابت هڪ وڌيڪ شيء. جيئن ته اهو نڪتو، مون لاء سڀ کان وڌيڪ دلچسپ حصو رياضياتي هو. جيڪڏهن توهان منظر کي هلائيندا آهيو (پراجيڪٽ جي تفصيل ۾ مخزن جو لنڪ)، توهان کي خبر پوندي ته ڪئميرا هڪ دائري ۾ ڇوڪري جي ڪردار جي چوڌاري گردش ڪري ٿو. اهڙي ڪيمرا جي گردش کي پروگرام ڪرڻ لاءِ، مون کي پهرين دائري (2D) تي پوزيشن پوائنٽ جي همراهن کي ڳڻڻو هو، ۽ پوءِ اسپير (3D) تي. عجيب ڳالهه اها آهي ته مون کي اسڪول ۾ رياضي کان نفرت هئي ۽ ان کي مائنس سان سڃاتو ويندو هو. جزوي طور تي، شايد، ڇاڪاڻ ته اسڪول ۾ اهي صرف توهان کي وضاحت نٿا ڪن ته هي رياضي زندگي ۾ ڪيئن لاڳو ٿئي ٿو. پر جڏهن توهان کي پنهنجي مقصد، خواب سان جنون آهي، ته ذهن صاف، نازل ٿيو! ۽ توهان پيچيده ڪمن کي هڪ دلچسپ مهم جي طور تي سمجهڻ شروع ڪيو. ۽ پوءِ توهان سوچيو: "خير، ڇو نه ٿي سگهيو * محبوب * رياضي دان عام طور تي اهو ٻڌائي سگهي ٿو ته اهي فارمولي ڪٿي ٿي سگهن ٿا؟".

DevOps C++ ۽ ”باورچي جون جنگيون“، يا مان کائڻ دوران رانديون لکڻ ڪيئن شروع ڪيون
هڪ دائري ۽ دائري تي هڪ نقطي جي همراهن کي ڳڻڻ لاءِ فارمولن جو حساب (منهنجي نوٽ بڪ مان)

راند 1

  • پليٽ فارم: ونڊوز (ونڊوز 7، 10 تي آزمايل)
  • ٻولي منهنجو خيال آهي ته اهو خالص سي ۾ لکيل هو
  • راند انجڻ: ونڊوز ڪنسول
  • وحي: javidx9
  • مخزن: GitHub

DevOps C++ ۽ ”باورچي جون جنگيون“، يا مان کائڻ دوران رانديون لکڻ ڪيئن شروع ڪيون
سادي سانپ جي راند

3D منظر هڪ راند نه آهي. ان کان علاوه، ماڊلنگ ۽ متحرڪ 3D شيون (خاص طور تي ڪردارن) ڊگهو ۽ ڏکيو آهي. اتحاد سان گڏ راند ڪرڻ کان پوء، مون محسوس ڪيو ته مون کي جاري رکڻو پوندو، يا بلڪه شروع ڪرڻ، بنياديات کان. ڪجھ سادو ۽ تيز، پر ساڳئي وقت عالمي، راندين جي بلڪل جوڙجڪ کي سمجھڻ لاء.

۽ اسان وٽ ڇا آهي سادو ۽ تيز؟ اھو صحيح آھي، ڪنسول ۽ 2D. وڌيڪ واضح طور تي، جيتوڻيڪ ڪنسول ۽ علامتون. ٻيهر، مون انٽرنيٽ تي انسپائريشن ڳولڻ شروع ڪيو (عام طور تي، مان انٽرنيٽ کي XNUMX صدي جي سڀ کان وڌيڪ انقلابي ۽ خطرناڪ ايجاد سمجهان ٿو). مون ھڪڙي پروگرامر جي ھڪڙي وڊيو ٺاھيو جنھن ٺاھيو ڪنسول Tetris. ۽ هن جي راند جي شڪل ۾، هن "سانپ" کي ڪٽڻ جو فيصلو ڪيو. ويڊيو مان، مون ٻن بنيادي شين جي باري ۾ سکيو - راند لوپ (ٽي بنيادي ڪمن / حصن سان) ۽ بفر ڏانهن ٻاڦ.

راند لوپ شايد هن وانگر ڪجهه نظر اچي ٿو:

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

ڪوڊ سڄي مکيه () فنڪشن کي هڪ ڀيرو پيش ڪري ٿو. ۽ راند جو چڪر لاڳاپيل تبصرو کان پوء شروع ٿئي ٿو. لوپ ۾ ٽي بنيادي ڪم آهن: Input()، Logic()، Draw(). پهريون، ان پٽ ڊيٽا انپٽ (بنيادي طور تي ڪي اسٽروڪ جو ڪنٽرول)، پوءِ داخل ڪيل ڊيٽا کي پروسيس ڪندي Logic، پوءِ اسڪرين تي ڏيکاريندي - Draw. ۽ ائين هر فريم. انيميشن هن طريقي سان ٺاهي وئي آهي. اهو ڪارٽون وانگر آهي. عام طور تي ان پٽ ڊيٽا کي پروسيس ڪرڻ ۾ تمام گهڻو وقت لڳندو آهي ۽، جيستائين مون کي خبر آهي، راند جي فريم ريٽ جو تعين ڪري ٿو. پر هتي Logic() فنڪشن تمام تيز آهي. تنهن ڪري، فريم جي شرح کي Sleep() فنڪشن ذريعي ڪنٽرول ڪيو وڃي gameSpeed ​​parameter سان، جيڪو هن شرح کي طئي ڪري ٿو.

DevOps C++ ۽ ”باورچي جون جنگيون“، يا مان کائڻ دوران رانديون لکڻ ڪيئن شروع ڪيون
راند جو چڪر. Notepad ۾ سانپ پروگرامنگ

جيڪڏهن توهان هڪ علامتي ڪنسول راند کي ترقي ڪري رهيا آهيو، ته پوءِ اسڪرين تي ڊيٽا کي ظاهر ڪرڻ عام اسٽريم آئوٽ پٽ 'ڪائوٽ' استعمال ڪندي ڪم نه ڪندو - اهو تمام سست آهي. تنهن ڪري، پيداوار کي اسڪرين بفر ۾ ڪيو وڃي. تمام گھڻو تيز ۽ راند بغير بغير ڪم ڪندو. ايماندار ٿيڻ لاء، مون کي بلڪل سمجھ ۾ نه ٿو اچي ته اسڪرين بفر ڇا آهي ۽ اهو ڪيئن ڪم ڪري ٿو. پر مان هتي هڪ ڪوڊ مثال ڏيندس، ۽ شايد تبصرن ۾ ڪو ماڻهو صورتحال کي واضح ڪرڻ جي قابل هوندو.

اسڪرين بفر حاصل ڪرڻ (جيڪڏهن مان ائين چئي سگهان ٿو):

// 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 Crazy Tanks

DevOps C++ ۽ ”باورچي جون جنگيون“، يا مان کائڻ دوران رانديون لکڻ ڪيئن شروع ڪيون
پاگل ٽينڪن جي راند

ڪنسول تي اکرن کي ڇپائڻ شايد سڀ کان آسان شيءِ آهي جنهن کي توهان راند ۾ تبديل ڪري سگهو ٿا. پر پوء هڪ مصيبت ظاهر ٿئي ٿي: ڪردارن ۾ مختلف اونچائي ۽ چوٽي آهي (اوچائي ويڪر کان وڌيڪ آهي). اهڙيءَ طرح، هر شيءِ غير متناسب نظر ايندي، ۽ هيٺ يا مٿي هلڻ کاٻي يا ساڄي هلڻ کان گهڻو تيز نظر ايندو. اهو اثر "سانپ" (راند 1) ۾ تمام گهڻو قابل ذڪر آهي. "ٽينڪس" (گيم 2) ۾ اهڙي ڪا خرابي نه آهي، ڇاڪاڻ ته اتي پيداوار مختلف رنگن سان اسڪرين پکسلز کي رنگڻ سان ترتيب ڏني وئي آهي. توهان چئي سگهو ٿا ته مون هڪ رينجر لکيو آهي. سچ، اهو اڳ ۾ ئي ٿورو وڌيڪ پيچيده آهي، جيتوڻيڪ گهڻو وڌيڪ دلچسپ.

هن راند لاء، اهو ڪافي ٿيندو منهنجي سسٽم کي بيان ڪرڻ لاء اسڪرين تي پکسلز ڊسپلي ڪرڻ لاء. مان سمجهان ٿو ته هي راند جو بنيادي حصو آهي. ۽ ٻيو سڀ ڪجهه توهان پاڻ سان گڏ ڪري سگهو ٿا.

تنهن ڪري، جيڪو توهان اسڪرين تي ڏسو ٿا اهو صرف هڪ سيٽ آهي رنگين مستطيلن جو.

DevOps C++ ۽ ”باورچي جون جنگيون“، يا مان کائڻ دوران رانديون لکڻ ڪيئن شروع ڪيون
مستطيل سيٽ

هر مستطيل انگن سان ڀريل هڪ ميٽرڪس جي نمائندگي ڪري ٿو. رستي جي ذريعي، مان هڪ دلچسپ nuance کي نمايان ڪري سگهان ٿو - راند ۾ سڀئي ميٽرڪس هڪ طرفي صف جي طور تي پروگرام ڪيا ويا آهن. ٻه طرفي نه، پر هڪ طرفي! هڪ طرفي صفن سان گڏ ڪم ڪرڻ تمام آسان ۽ تيز آهن.

DevOps C++ ۽ ”باورچي جون جنگيون“، يا مان کائڻ دوران رانديون لکڻ ڪيئن شروع ڪيون
راند ٽينڪ ميٽرڪس جو هڪ مثال

DevOps C++ ۽ ”باورچي جون جنگيون“، يا مان کائڻ دوران رانديون لکڻ ڪيئن شروع ڪيون
ون ڊيمينشنل ايري سان گيم ٽينڪ جي ميٽرڪس جي نمائندگي ڪندي

DevOps C++ ۽ ”باورچي جون جنگيون“، يا مان کائڻ دوران رانديون لکڻ ڪيئن شروع ڪيون
هڪ وڌيڪ نمايان مثال هڪ ميٽرڪس جي نمائندگي هڪ طرفي صف جي ذريعي

پر سرن جي عناصرن تائين پهچ ڊبل لوپ ۾ ٿئي ٿي، ڄڻ ته اها هڪ طرفي نه هئي، پر هڪ ٻه-dimensional صف هئي. اهو ٿي چڪو آهي ڇاڪاڻ ته اسان اڃا تائين ميٽرڪ سان ڪم ڪري رهيا آهيون.

DevOps C++ ۽ ”باورچي جون جنگيون“، يا مان کائڻ دوران رانديون لکڻ ڪيئن شروع ڪيون
هڪ ڊبل لوپ ۾ هڪ طرفي صف کي ڇڪڻ. Y قطار جي سڃاڻپ آھي، ايڪس ڪالمن جي سڃاڻپ آھي

مهرباني ڪري نوٽ ڪريو ته عام ميٽرڪس جي سڃاڻپ ڪندڙ i, j جي بدران آئون استعمال ڪريان ٿو سڃاڻپ ڪندڙ x ۽ y. تنهن ڪري، اهو مون کي لڳي ٿو، اکين لاء وڌيڪ خوشگوار ۽ دماغ کي صاف. ان کان علاوه، اهڙي نوٽيفڪيشن اهو ممڪن بڻائي ٿو ته آسانيء سان استعمال ٿيل ميٽرس کي ٻه-dimensional تصوير جي همراه محور تي پروجيڪٽ ڪرڻ.

هاڻي پکسلز، رنگ ۽ ڊسپلي بابت. StretchDIBits فنڪشن (هيڊر: windows.h؛ لائبريري: gdi32.lib) آئوٽ پٽ لاءِ استعمال ٿيندو آهي. ٻين شين جي وچ ۾، هيٺ ڏنل هن فنڪشن کي منظور ڪيو ويو آهي: ڊوائيس جنهن تي تصوير ڏيکاريل آهي (منهنجي صورت ۾، هي ونڊوز ڪنسول آهي)، تصوير کي ظاهر ڪرڻ جي شروعات، ان جي چوٽي / اوچائي، ۽ تصوير. پاڻ هڪ بٽ ميپ (bitmap) جي صورت ۾، بائيٽ جي هڪ صف جي نمائندگي ڪري ٿو. بائيٽس جي هڪ صف جي طور تي Bitmap!

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_bitmapMemory 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 ڳاڙهو سرمائي آهي، وغيره. اهڙيء طرح، اسان اهو چئي سگهون ٿا ته اسان وٽ راند جي ميدان جو هڪ ميٽرڪس آهي، جتي هر نمبر ڪجهه قسم جو رنگ آهي.

تنهن ڪري، اسان وٽ هڪ طرف سڄي راند جي ميدان جو هڪ عددي ميٽرڪس آهي ۽ ٻئي طرف تصوير کي ڏيکارڻ لاء هڪ بٽ ميپ. هينئر تائين، بٽ ميپ "خالي" آهي - اهو اڃا تائين گهربل رنگ جي پکسلز بابت ڄاڻ ناهي. هن جو مطلب آهي ته آخري قدم bitmap کي ڀريو ويندو هر پکسل بابت معلومات سان گڏ راند جي ميدان جي عددي ميٽرڪس جي بنياد تي. اهڙي تبديلي جو هڪ مثالي مثال هيٺ ڏنل تصوير ۾ آهي.

DevOps C++ ۽ ”باورچي جون جنگيون“، يا مان کائڻ دوران رانديون لکڻ ڪيئن شروع ڪيون
هڪ بٽ ميپ ڀرڻ جو هڪ مثال (پکسل ميٽرڪس) معلومات سان گڏ راند جي ميدان جي عددي ميٽرڪس (ڊجيٽل ميٽرڪس) جي بنياد تي (رنگ انڊيڪس راند ۾ انڊيڪس سان نه ملندا آهن)

مان راند مان حقيقي ڪوڊ جو هڪ ٽڪرو پڻ پيش ڪندس. لوپ جي هر ورجائي تي متغير رنگ انڊيڪس کي راند جي ميدان جي عددي ميٽرڪس (mainDigitalMatrix) مان هڪ قدر (رنگ انڊيڪس) لڳايو ويو آهي. پوءِ رنگ پاڻ کي انڊيڪس جي بنياد تي رنگ متغير ڏانهن لکيو ويو آهي. وڌيڪ، نتيجو رنگ ڳاڙهي، سائي ۽ نيري (RGB) جي تناسب ۾ ورهايل آهي. ۽ انڊنٽ (pixelPadding) سان گڏ، هي معلومات بار بار پکسل تي لکجي ٿي، بٽ ميپ ۾ رنگ جي تصوير ٺاهيندي.

ڪوڊ پوائنٽر ۽ bitwise آپريشنز استعمال ڪري ٿو، جن کي سمجھڻ ڏکيو ٿي سگھي ٿو. تنهن ڪري مان توهان کي صلاح ڏيو ته الڳ الڳ پڙهو ته اهڙيون اڏاوتون ڪيئن ڪم ڪن ٿيون.

راند جي ميدان جي عددي ميٽرڪس جي بنياد تي معلومات سان بٽ ميپ ڀرڻ:

// 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() فنڪشن ۾ پروسيسنگ ڪرڻ کان پوءِ، هڪ نئين تصوير (فريم) ٺهي ٿي. سچ پچ، راندين جي شين کي شايد اڳ ۾ ئي راند جي ميدان تي مختلف پوزيشن هجي ۽، مطابق، مختلف جڳهه تي ٺهيل آهن. اهڙي طرح متحرڪ (حرکت) ٿئي ٿي.

نظريي ۾ (جيڪڏهن توهان ڪجھ به نه وساريو آهي)، پهرين راند (“سانپ”) کان گيم لوپ کي سمجهڻ ۽ ٻئي گيم (“ٽينڪس”) کان اسڪرين تي پکسلز ڏيکارڻ جو نظام (“ٽينڪس”) صرف توهان کي لکڻ جي ضرورت آهي. ونڊوز لاءِ توهان جي 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. ھن ماڻھوءَ وٽ آھي ويب سائيٽ. "ڏسڻ -> اڳيون قسطون" سيڪشن ۾ توهان کي حيرت انگيز مفت وڊيو سبق ملندا ته ڪيئن شروع کان هڪ پروفيشنل گيم ٺاهيو وڃي. Intro to C for Windows جي پنجن سبقن ۾، توھان يونيورسٽي ۾ پنجن سالن جي مطالعي کان وڌيڪ سکي سگھو ٿا (ڪنھن ھن بابت وڊيو ھيٺ ڏنل تبصرن ۾ لکيو آھي).

ڪيسي اهو به بيان ڪري ٿو ته توهان جي پنهنجي گيم انجڻ کي ترقي ڪندي، توهان کي ڪنهن به موجوده انجڻ جي بهتر سمجھ هوندي. فريم ورڪ جي دنيا ۾، جتي هرڪو خودڪار ڪرڻ جي ڪوشش ڪري رهيو آهي، توهان سکو ته ڪيئن ٺاهيو، استعمال نه ڪيو. ڪمپيوٽر جي فطرت کي سمجھو. ۽ توهان پڻ هڪ وڌيڪ ذهين ۽ بالغ پروگرامر بڻجي ويندا - هڪ پرو.

توهان جي چونڊيل رستي تي سٺي قسمت! ۽ اچو ته دنيا کي وڌيڪ پروفيشنل بڻايون.

الاهي: گرانڪين اينڊريو، DevOps



جو ذريعو: www.habr.com