پرو هوسٽر > بلاگ > انتظاميه > DevOps C++ ۽ ”باورچي جون جنگيون“، يا مان کائڻ دوران رانديون لکڻ ڪيئن شروع ڪيون
DevOps C++ ۽ ”باورچي جون جنگيون“، يا مان کائڻ دوران رانديون لکڻ ڪيئن شروع ڪيون
"مان ڄاڻان ٿو ته مان ڪجھ به نه ڄاڻان ٿو." سقراط
ڪنهن لاء: آئي ٽي ماڻهن لاءِ جيڪي سڀني ڊولپرز تي اڇليندا آهن ۽ انهن جون رانديون کيڏڻ چاهيندا آهن!
ڪهڙي طرح جي باري ۾: جيڪڏهن توهان کي ضرورت هجي ته C/C++ ۾ رانديون لکڻ ڪيئن شروع ڪيون!
توهان کي هي ڇو پڙهڻ گهرجي: ايپ ڊولپمينٽ منهنجي ڪم جي خاصيت ناهي، پر مان هر هفتي ڪوڊ ڪرڻ جي ڪوشش ڪندو آهيان. ڇو ته مون کي رانديون پسند آهن!
هيلو منهنجو نالو آهي آندري گرانڪين، مان Luxoft ۾ هڪ DevOps آهيان. ايپليڪيشن ڊولپمينٽ منهنجي ڪم جي خاصيت ناهي، پر مان هر هفتي ڪوڊ ڪرڻ جي ڪوشش ڪندو آهيان. ڇو ته مون کي رانديون پسند آهن!
ڪمپيوٽر گيمز انڊسٽري تمام وڏي آهي، اڄ به فلم انڊسٽري کان وڌيڪ افواهون. رانديون ڪمپيوٽر جي ترقي جي شروعات کان وٺي، جديد معيار، پيچيده ۽ بنيادي ترقي جي طريقن سان استعمال ڪندي لکيو ويو آهي. وقت سان گڏ، راند انجڻ اڳ ۾ ئي پروگرام ٿيل گرافڪس، فزڪس ۽ آواز سان ظاهر ٿيڻ شروع ڪيو. اهي توهان کي راند جي ترقي تي ڌيان ڏيڻ جي اجازت ڏين ٿا ۽ ان جي بنياد جي باري ۾ پريشان نه ڪن. پر ان سان گڏ، انجڻين سان گڏ، ڊولپرز "انڌا ٿي وڃو" ۽ خراب ٿي ويا. راندين جي تمام پيداوار conveyor تي رکيل آهي. ۽ پيداوار جو مقدار ان جي معيار تي غالب ٿيڻ شروع ٿئي ٿو.
ساڳئي وقت، جڏهن ٻين ماڻهن جون رانديون کيڏڻ، اسان مسلسل جڳهن، پلاٽ، ڪردارن، راند ميڪيڪڪس تائين محدود هوندا آهيون جيڪي ٻيا ماڻهو آيا آهن. تنهنڪري مون سمجهيو ته ...
... اهو وقت آهي توهان جي پنهنجي دنيا ٺاهڻ جو، صرف منهنجي تابع. دنيا جتي آئون پيء آهيان، ۽ پٽ، ۽ پاڪ روح!
۽ مان خلوص سان سمجهان ٿو ته توهان جي پنهنجي گيم انجڻ ۽ ان تي هڪ راند لکڻ سان، توهان پنهنجون اکيون کولڻ جي قابل ٿي ويندا، ونڊوز کي صاف ڪري سگهو ٿا ۽ پنهنجي ڪيبن کي پمپ ڪري، هڪ وڌيڪ تجربيڪار ۽ لازمي پروگرامر بڻجي ويندا.
هن آرٽيڪل ۾ مان توهان کي ٻڌائڻ جي ڪوشش ڪندس ته ڪيئن مون C/C++ ۾ ننڍيون رانديون لکڻ شروع ڪيون، ترقيءَ جو عمل ڇا آهي ۽ مصروف ماحول ۾ شوق لاءِ وقت ڪٿي ٿو ملي. اهو تابع آهي ۽ هڪ فرد جي شروعات جي عمل کي بيان ڪري ٿو. جهالت ۽ ايمان بابت مواد، هن وقت دنيا جي منهنجي ذاتي تصوير بابت. ٻين لفظن ۾، "انتظام توهان جي ذاتي دماغ لاء ذميوار نه آهي!".
مشق
”علم بغير عمل جي بيڪار آهي، علم کان سواءِ عمل خطرناڪ آهي“ ڪنفيوشس
منهنجو نوٽ بڪ منهنجي زندگي آهي!
تنهن ڪري، عملي طور تي، مان اهو چئي سگهان ٿو ته مون لاء هر شيء هڪ نوٽ بڪ سان شروع ٿئي ٿي. مان اتي نه رڳو پنهنجا روزمره جا ڪم لکندو آهيان، پر ڊرائنگ، پروگرام، فلو چارٽ ڊزائين ڪرڻ ۽ مسئلن کي حل ڪرڻ، بشمول رياضي جا ڪم. هميشه هڪ نوٽ پيڊ استعمال ڪريو ۽ صرف پنسل سان لکو. اهو صاف، آرامده ۽ قابل اعتماد آهي، IMHO.
منهنجو (اڳ ۾ ئي ڀريل) نوٽ بڪ. اهو ڪيئن ڏسڻ ۾ اچي ٿو. ان ۾ روزمره جا ڪم، خيال، ڊرائنگ، ڊرائنگ، حل، بليڪ بوڪ ڪيپنگ، ڪوڊ وغيره شامل آهن.
هن مرحلي تي، مون ٽن منصوبن کي مڪمل ڪرڻ ۾ مدد ڪئي (اها منهنجي سمجهه ۾ آهي "فائنلٽي"، ڇاڪاڻ ته ڪنهن به پراڊڪٽ کي ترقي ڪري سگهجي ٿو نسبتا لامحدود).
پروجيڪٽ 0: هي هڪ آرڪيٽيڪٽ ڊيمو 3D منظر آهي C# ۾ لکيو ويو آهي يونٽي گيم انجڻ استعمال ڪندي. MacOS ۽ ونڊوز پليٽ فارمن لاءِ.
راند 1: ونڊوز لاءِ ڪنسول گيم Simple Snake (سڀني کي ”سانپ“ جي نالي سان سڃاتو وڃي ٿو). سي ۾ لکيل آهي.
راند 2: ڪنسول گيم Crazy Tanks (هر ڪنهن کي "ٽينڪس" جي نالي سان سڃاتو وڃي ٿو)، اڳ ۾ ئي C ++ ۾ لکيل آهي (ڪلاس استعمال ڪندي) ۽ ونڊوز جي تحت.
پروجيڪٽ 0 معمار ڊيمو
پليٽ فارم: ونڊوز (ونڊوز 7، 10)، ميڪ او ايس (OS X El Capitan v. 10.11.6)
پهريون منصوبو C/C++ ۾ نه، پر C# ۾ يونٽي گيم انجڻ استعمال ڪندي لاڳو ڪيو ويو. هي انجڻ هارڊويئر تي ايترو مطالبو نه هو جيترو غير حقيقي انجنيئر، ۽ پڻ مون کي انسٽال ڪرڻ ۽ استعمال ڪرڻ آسان لڳي. مون ٻين انجڻين تي غور نه ڪيو.
مون لاءِ اتحاد ۾ مقصد ڪنهن قسم جي راند کي ترقي ڪرڻ نه هو. مون چاهيو ٿي ته هڪ 3D منظر ڪنهن قسم جي ڪردار سان ٺاهيو. هن، يا بلڪه هوءَ (مون ان ڇوڪريءَ کي ماڊل ڪيو جنهن سان مون کي پيار هو =) هن کي ٻاهرئين دنيا سان هلڻ ۽ ان سان رابطو ڪرڻو پيو. اهو سمجهڻ ضروري هو ته اتحاد ڇا آهي، ترقي جو عمل ڇا آهي ۽ ڪنهن شيءِ کي ٺاهڻ لاءِ ڪيتري محنت ڪرڻي پوي ٿي. اهو ڪيئن آهي آرڪيٽيڪيٽ ڊيمو پروجيڪٽ پيدا ٿيو (نالو تقريبا بلشٽ مان ايجاد ڪيو ويو). پروگرامنگ، ماڊلنگ، اينيميشن، ٽيڪسٽچرنگ مون کي روزانو ڪم جا ٻه مهينا لڳي ويا.
مون يوٽيوب تي ٽيوٽوريل وڊيوز سان شروع ڪيو ته ڪيئن 3D ماڊل ٺاهيا وڃن بليڪر. Blender 3D ماڊلنگ (۽ وڌيڪ) لاءِ هڪ بهترين مفت اوزار آهي جنهن کي انسٽاليشن جي ضرورت ناهي. ۽ هتي هڪ جھٽڪو مون کي انتظار ڪري رهيو آهي ... اهو ظاهر ٿئي ٿو ته ماڊلنگ، اينيميشن، ٽيڪسٽچرنگ وڏا الڳ موضوع آهن جن تي توهان ڪتاب لکي سگهو ٿا. اهو خاص طور تي ڪردارن لاء صحيح آهي. آڱرين، ڏند، اکيون ۽ جسم جي ٻين حصن کي ماڊل ڪرڻ لاء، توهان کي اناتومي جي علم جي ضرورت پوندي. منهن جي عضون کي ڪيئن ترتيب ڏنو ويو آهي؟ ماڻهو ڪيئن هلندا آهن؟ مون کي هر هڪ هٿ، ٽنگ، آڱر، ڌڪ ۾ هڏا "داخل" ڪرڻو پيو!
ڪلويڪل کي ماڊل ڪريو، اضافي هڏا ليور، ته جيئن اينيميشن قدرتي نظر اچي. اهڙن سبقن کان پوءِ، توهان کي احساس ٿيندو ته اينيميٽڊ فلمن جا تخليقڪار ڪيترو وڏو ڪم ڪن ٿا، صرف 30 سيڪنڊن جي وڊيو ٺاهڻ لاءِ. پر 3D فلمون ڪلاڪن تائين رهي ٿو! ۽ پوءِ اسان ٿيئٽرن مان ٻاهر اچون ٿا ۽ ڪجهه ائين چئون ٿا: ”تا، هڪ بيوقوف ڪارٽون / فلم! اهي بهتر ڪري سگهن ها...“ بيوقوف!
۽ هن منصوبي ۾ پروگرامنگ بابت هڪ وڌيڪ شيء. جيئن ته اهو نڪتو، مون لاء سڀ کان وڌيڪ دلچسپ حصو رياضياتي هو. جيڪڏهن توهان منظر کي هلائيندا آهيو (پراجيڪٽ جي تفصيل ۾ مخزن جو لنڪ)، توهان کي خبر پوندي ته ڪئميرا هڪ دائري ۾ ڇوڪري جي ڪردار جي چوڌاري گردش ڪري ٿو. اهڙي ڪيمرا جي گردش کي پروگرام ڪرڻ لاءِ، مون کي پهرين دائري (2D) تي پوزيشن پوائنٽ جي همراهن کي ڳڻڻو هو، ۽ پوءِ اسپير (3D) تي. عجيب ڳالهه اها آهي ته مون کي اسڪول ۾ رياضي کان نفرت هئي ۽ ان کي مائنس سان سڃاتو ويندو هو. جزوي طور تي، شايد، ڇاڪاڻ ته اسڪول ۾ اهي صرف توهان کي وضاحت نٿا ڪن ته هي رياضي زندگي ۾ ڪيئن لاڳو ٿئي ٿو. پر جڏهن توهان کي پنهنجي مقصد، خواب سان جنون آهي، ته ذهن صاف، نازل ٿيو! ۽ توهان پيچيده ڪمن کي هڪ دلچسپ مهم جي طور تي سمجهڻ شروع ڪيو. ۽ پوءِ توهان سوچيو: "خير، ڇو نه ٿي سگهيو * محبوب * رياضي دان عام طور تي اهو ٻڌائي سگهي ٿو ته اهي فارمولي ڪٿي ٿي سگهن ٿا؟".
هڪ دائري ۽ دائري تي هڪ نقطي جي همراهن کي ڳڻڻ لاءِ فارمولن جو حساب (منهنجي نوٽ بڪ مان)
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 سان، جيڪو هن شرح کي طئي ڪري ٿو.
راند جو چڪر. Notepad ۾ سانپ پروگرامنگ
جيڪڏهن توهان هڪ علامتي ڪنسول راند کي ترقي ڪري رهيا آهيو، ته پوءِ اسڪرين تي ڊيٽا کي ظاهر ڪرڻ عام اسٽريم آئوٽ پٽ 'ڪائوٽ' استعمال ڪندي ڪم نه ڪندو - اهو تمام سست آهي. تنهن ڪري، پيداوار کي اسڪرين بفر ۾ ڪيو وڃي. تمام گھڻو تيز ۽ راند بغير بغير ڪم ڪندو. ايماندار ٿيڻ لاء، مون کي بلڪل سمجھ ۾ نه ٿو اچي ته اسڪرين بفر ڇا آهي ۽ اهو ڪيئن ڪم ڪري ٿو. پر مان هتي هڪ ڪوڊ مثال ڏيندس، ۽ شايد تبصرن ۾ ڪو ماڻهو صورتحال کي واضح ڪرڻ جي قابل هوندو.
اسڪرين بفر حاصل ڪرڻ (جيڪڏهن مان ائين چئي سگهان ٿو):
ڪنسول تي اکرن کي ڇپائڻ شايد سڀ کان آسان شيءِ آهي جنهن کي توهان راند ۾ تبديل ڪري سگهو ٿا. پر پوء هڪ مصيبت ظاهر ٿئي ٿي: ڪردارن ۾ مختلف اونچائي ۽ چوٽي آهي (اوچائي ويڪر کان وڌيڪ آهي). اهڙيءَ طرح، هر شيءِ غير متناسب نظر ايندي، ۽ هيٺ يا مٿي هلڻ کاٻي يا ساڄي هلڻ کان گهڻو تيز نظر ايندو. اهو اثر "سانپ" (راند 1) ۾ تمام گهڻو قابل ذڪر آهي. "ٽينڪس" (گيم 2) ۾ اهڙي ڪا خرابي نه آهي، ڇاڪاڻ ته اتي پيداوار مختلف رنگن سان اسڪرين پکسلز کي رنگڻ سان ترتيب ڏني وئي آهي. توهان چئي سگهو ٿا ته مون هڪ رينجر لکيو آهي. سچ، اهو اڳ ۾ ئي ٿورو وڌيڪ پيچيده آهي، جيتوڻيڪ گهڻو وڌيڪ دلچسپ.
هن راند لاء، اهو ڪافي ٿيندو منهنجي سسٽم کي بيان ڪرڻ لاء اسڪرين تي پکسلز ڊسپلي ڪرڻ لاء. مان سمجهان ٿو ته هي راند جو بنيادي حصو آهي. ۽ ٻيو سڀ ڪجهه توهان پاڻ سان گڏ ڪري سگهو ٿا.
تنهن ڪري، جيڪو توهان اسڪرين تي ڏسو ٿا اهو صرف هڪ سيٽ آهي رنگين مستطيلن جو.
مستطيل سيٽ
هر مستطيل انگن سان ڀريل هڪ ميٽرڪس جي نمائندگي ڪري ٿو. رستي جي ذريعي، مان هڪ دلچسپ nuance کي نمايان ڪري سگهان ٿو - راند ۾ سڀئي ميٽرڪس هڪ طرفي صف جي طور تي پروگرام ڪيا ويا آهن. ٻه طرفي نه، پر هڪ طرفي! هڪ طرفي صفن سان گڏ ڪم ڪرڻ تمام آسان ۽ تيز آهن.
راند ٽينڪ ميٽرڪس جو هڪ مثال
ون ڊيمينشنل ايري سان گيم ٽينڪ جي ميٽرڪس جي نمائندگي ڪندي
هڪ وڌيڪ نمايان مثال هڪ ميٽرڪس جي نمائندگي هڪ طرفي صف جي ذريعي
پر سرن جي عناصرن تائين پهچ ڊبل لوپ ۾ ٿئي ٿي، ڄڻ ته اها هڪ طرفي نه هئي، پر هڪ ٻه-dimensional صف هئي. اهو ٿي چڪو آهي ڇاڪاڻ ته اسان اڃا تائين ميٽرڪ سان ڪم ڪري رهيا آهيون.
هڪ ڊبل لوپ ۾ هڪ طرفي صف کي ڇڪڻ. 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() فنڪشن استعمال ڪندي. اھو آھي، بائيٽ جو گھربل تعداد سڀني پکسلز بابت معلومات ذخيرو ڪرڻ لاءِ محفوظ آھي، جيڪو پوءِ اسڪرين تي ڏيکاريو ويندو.
عام طور تي ڳالهائڻ، هڪ بٽ ميپ پکسلز جي هڪ سيٽ تي مشتمل آهي. صف ۾ هر چار بائيٽ هڪ آر بي بي پکسل آهي. هڪ بائيٽ في ڳاڙهي قيمت، هڪ بائيٽ في سائي قيمت (G)، ۽ هڪ بائيٽ في نيري رنگ (B). پلس، اتي هڪ بائيٽ في انڊنٽ آهي. اهي ٽي رنگ - ڳاڙهو / سائو / نيرو (RGB) - مختلف تناسب ۾ هڪ ٻئي سان ملايا ويا آهن - ۽ نتيجو پکسل رنگ حاصل ڪيو ويو آهي.
هاڻي، ٻيهر، هر مستطيل، يا راند جو اعتراض، هڪ نمبر ميٽرڪس جي نمائندگي ڪري ٿو. اهي سڀئي رانديون شيون هڪ مجموعو ۾ رکيل آهن. ۽ پوء اھي راند جي ميدان تي رکيل آھن، ھڪڙي وڏي عددي ميٽرڪس ٺاھيو. مون ميٽرڪس ۾ هر نمبر کي مخصوص رنگ ۾ نقشو ڪيو. مثال طور، نمبر 8 نيرو آهي، نمبر 9 پيلو آهي، نمبر 10 ڳاڙهو سرمائي آهي، وغيره. اهڙيء طرح، اسان اهو چئي سگهون ٿا ته اسان وٽ راند جي ميدان جو هڪ ميٽرڪس آهي، جتي هر نمبر ڪجهه قسم جو رنگ آهي.
تنهن ڪري، اسان وٽ هڪ طرف سڄي راند جي ميدان جو هڪ عددي ميٽرڪس آهي ۽ ٻئي طرف تصوير کي ڏيکارڻ لاء هڪ بٽ ميپ. هينئر تائين، بٽ ميپ "خالي" آهي - اهو اڃا تائين گهربل رنگ جي پکسلز بابت ڄاڻ ناهي. هن جو مطلب آهي ته آخري قدم bitmap کي ڀريو ويندو هر پکسل بابت معلومات سان گڏ راند جي ميدان جي عددي ميٽرڪس جي بنياد تي. اهڙي تبديلي جو هڪ مثالي مثال هيٺ ڏنل تصوير ۾ آهي.
هڪ بٽ ميپ ڀرڻ جو هڪ مثال (پکسل ميٽرڪس) معلومات سان گڏ راند جي ميدان جي عددي ميٽرڪس (ڊجيٽل ميٽرڪس) جي بنياد تي (رنگ انڊيڪس راند ۾ انڊيڪس سان نه ملندا آهن)
مان راند مان حقيقي ڪوڊ جو هڪ ٽڪرو پڻ پيش ڪندس. لوپ جي هر ورجائي تي متغير رنگ انڊيڪس کي راند جي ميدان جي عددي ميٽرڪس (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++ ۾ شروعات ڪندڙن لاءِ هڪ بهترين شروعات آهي. اهو ننڍڙو، دلچسپ ۽ چڱي طرح منظم آهي.
هن راند کي ترقي ڪرڻ ۾ اٽڪل ڇهه مهينا لڳا. مون گهڻو ڪري ڪم تي لنچ ۽ ناشتي دوران لکيو. هو آفيس جي باورچی خانه ۾ ويٺو، کاڌي تي اسٽمپ ڪيو ۽ ڪوڊ لکيو. يا رات جي ماني لاء گهر ۾. تنهنڪري مون کي اهڙيون "باورچي وار" مليا. هميشه وانگر، مون فعال طور تي هڪ نوٽ بڪ استعمال ڪيو، ۽ سڀ تصوراتي شيون ان ۾ پيدا ٿيا.
عملي حصي جي آخر ۾، مان پنھنجي نوٽ بڪ جا ڪجھ اسڪين ڪڍي ڇڏيندس. اهو ڏيکارڻ لاءِ ته مان ڇا لکي رهيو آهيان، ڊرائنگ، ڳڻپ، ڊزائيننگ...
ٽانڪي تصوير ڊيزائن. ۽ هر ٽينڪ کي اسڪرين تي قبضو ڪرڻ گهرجي ڪيترا پکسلز جي تعريف
ان جي محور جي چوڌاري ٽينڪ جي گردش لاء الگورتھم ۽ فارمولن جو حساب
منهنجي جمع جو خاڪو (جيڪو ميموري ليک سان گڏ، گهڻو ڪري). مجموعو هڪ ڳنڍيل فهرست جي طور تي ٺهيل آهي
۽ اهي مصنوعي ذهانت کي راند ۾ ڇڪڻ جي ناڪام ڪوششون آهن
اصول
"هزارين ميلن جو سفر به پهرين قدم سان شروع ٿئي ٿو" (قديم چيني حڪمت)
اچو ته عمل کان نظريي ڏانهن وڃو! توهان پنهنجي شوق لاء وقت ڪيئن ڳوليندا آهيو؟