"مان ڄاڻان ٿو ته مان ڪجھ به نه ڄاڻان ٿو." سقراط
ڪنهن لاء: آئي ٽي ماڻهن لاءِ جيڪي سڀني ڊولپرز تي اڇليندا آهن ۽ انهن جون رانديون کيڏڻ چاهيندا آهن!
ڪهڙي طرح جي باري ۾: جيڪڏهن توهان کي ضرورت هجي ته C/C++ ۾ رانديون لکڻ ڪيئن شروع ڪيون!
توهان کي هي ڇو پڙهڻ گهرجي: ايپ ڊولپمينٽ منهنجي ڪم جي خاصيت ناهي، پر مان هر هفتي ڪوڊ ڪرڻ جي ڪوشش ڪندو آهيان. ڇو ته مون کي رانديون پسند آهن!
هيلو منهنجو نالو آهي ، مان Luxoft ۾ هڪ DevOps آهيان. ايپليڪيشن ڊولپمينٽ منهنجي ڪم جي خاصيت ناهي، پر مان هر هفتي ڪوڊ ڪرڻ جي ڪوشش ڪندو آهيان. ڇو ته مون کي رانديون پسند آهن!
ڪمپيوٽر گيمز انڊسٽري تمام وڏي آهي، اڄ به فلم انڊسٽري کان وڌيڪ افواهون. رانديون ڪمپيوٽر جي ترقي جي شروعات کان وٺي، جديد معيار، پيچيده ۽ بنيادي ترقي جي طريقن سان استعمال ڪندي لکيو ويو آهي. وقت سان گڏ، راند انجڻ اڳ ۾ ئي پروگرام ٿيل گرافڪس، فزڪس ۽ آواز سان ظاهر ٿيڻ شروع ڪيو. اهي توهان کي راند جي ترقي تي ڌيان ڏيڻ جي اجازت ڏين ٿا ۽ ان جي بنياد جي باري ۾ پريشان نه ڪن. پر ان سان گڏ، انجڻين سان گڏ، ڊولپرز "انڌا ٿي وڃو" ۽ خراب ٿي ويا. راندين جي تمام پيداوار conveyor تي رکيل آهي. ۽ پيداوار جو مقدار ان جي معيار تي غالب ٿيڻ شروع ٿئي ٿو.
ساڳئي وقت، جڏهن ٻين ماڻهن جون رانديون کيڏڻ، اسان مسلسل جڳهن، پلاٽ، ڪردارن، راند ميڪيڪڪس تائين محدود هوندا آهيون جيڪي ٻيا ماڻهو آيا آهن. تنهنڪري مون سمجهيو ته ...
... اهو وقت آهي توهان جي پنهنجي دنيا ٺاهڻ جو، صرف منهنجي تابع. دنيا جتي آئون پيء آهيان، ۽ پٽ، ۽ پاڪ روح!
۽ مان خلوص سان سمجهان ٿو ته توهان جي پنهنجي گيم انجڻ ۽ ان تي هڪ راند لکڻ سان، توهان پنهنجون اکيون کولڻ جي قابل ٿي ويندا، ونڊوز کي صاف ڪري سگهو ٿا ۽ پنهنجي ڪيبن کي پمپ ڪري، هڪ وڌيڪ تجربيڪار ۽ لازمي پروگرامر بڻجي ويندا.
هن آرٽيڪل ۾ مان توهان کي ٻڌائڻ جي ڪوشش ڪندس ته ڪيئن مون C/C++ ۾ ننڍيون رانديون لکڻ شروع ڪيون، ترقيءَ جو عمل ڇا آهي ۽ مصروف ماحول ۾ شوق لاءِ وقت ڪٿي ٿو ملي. اهو تابع آهي ۽ هڪ فرد جي شروعات جي عمل کي بيان ڪري ٿو. جهالت ۽ ايمان بابت مواد، هن وقت دنيا جي منهنجي ذاتي تصوير بابت. ٻين لفظن ۾، "انتظام توهان جي ذاتي دماغ لاء ذميوار نه آهي!".
مشق
”علم بغير عمل جي بيڪار آهي، علم کان سواءِ عمل خطرناڪ آهي“ ڪنفيوشس
منهنجو نوٽ بڪ منهنجي زندگي آهي!
تنهن ڪري، عملي طور تي، مان اهو چئي سگهان ٿو ته مون لاء هر شيء هڪ نوٽ بڪ سان شروع ٿئي ٿي. مان اتي نه رڳو پنهنجا روزمره جا ڪم لکندو آهيان، پر ڊرائنگ، پروگرام، فلو چارٽ ڊزائين ڪرڻ ۽ مسئلن کي حل ڪرڻ، بشمول رياضي جا ڪم. هميشه هڪ نوٽ پيڊ استعمال ڪريو ۽ صرف پنسل سان لکو. اهو صاف، آرامده ۽ قابل اعتماد آهي، IMHO.

منهنجو (اڳ ۾ ئي ڀريل) نوٽ بڪ. اهو ڪيئن ڏسڻ ۾ اچي ٿو. ان ۾ روزمره جا ڪم، خيال، ڊرائنگ، ڊرائنگ، حل، بليڪ بوڪ ڪيپنگ، ڪوڊ وغيره شامل آهن.
هن مرحلي تي، مون ٽن منصوبن کي مڪمل ڪرڻ ۾ مدد ڪئي (اها منهنجي سمجهه ۾ آهي "فائنلٽي"، ڇاڪاڻ ته ڪنهن به پراڊڪٽ کي ترقي ڪري سگهجي ٿو نسبتا لامحدود).
- پروجيڪٽ 0: هي آرڪيٽيڪٽ ڊيمو جو هڪ 3D منظر آهي، جيڪو يونٽي گيم انجن استعمال ڪندي C# ۾ لکيل آهي. پليٽ فارمن لاءِ. macOS и Windows.
- راند 1: ڪنسول گيم سمپل سانپ (جيڪا هر ڪنهن کي "سانپ" جي نالي سان سڃاتي وڃي ٿي) هيٺ Windows. سي ۾ لکيل.
- راند 2: ڪنسول گيم ڪريزي ٽينڪس (جيڪا هر ڪنهن کي "ٽينڪس" جي نالي سان سڃاتي وڃي ٿي)، سي++ ۾ لکيل آهي (ڪلاس استعمال ڪندي) ۽ ان کان هيٺ پڻ Windows.
پروجيڪٽ 0 معمار ڊيمو
- پليٽ فارم: Windows (Windows 7، 10)، Mac OS (OS X El Capitan v. 10.11.6)
- ٻولي C#
- راند انجڻ:
- وحي:
- مخزن:

3D منظر آرڪيٽيڪٽ ڊيمو
پهريون منصوبو C/C++ ۾ نه، پر C# ۾ يونٽي گيم انجڻ استعمال ڪندي لاڳو ڪيو ويو. هي انجڻ هارڊويئر تي ايترو مطالبو نه هو جيترو ، ۽ پڻ مون کي انسٽال ڪرڻ ۽ استعمال ڪرڻ آسان لڳي. مون ٻين انجڻين تي غور نه ڪيو.
مون لاءِ اتحاد ۾ مقصد ڪنهن قسم جي راند کي ترقي ڪرڻ نه هو. مون چاهيو ٿي ته هڪ 3D منظر ڪنهن قسم جي ڪردار سان ٺاهيو. هن، يا بلڪه هوءَ (مون ان ڇوڪريءَ کي ماڊل ڪيو جنهن سان مون کي پيار هو =) هن کي ٻاهرئين دنيا سان هلڻ ۽ ان سان رابطو ڪرڻو پيو. اهو سمجهڻ ضروري هو ته اتحاد ڇا آهي، ترقي جو عمل ڇا آهي ۽ ڪنهن شيءِ کي ٺاهڻ لاءِ ڪيتري محنت ڪرڻي پوي ٿي. اهو ڪيئن آهي آرڪيٽيڪيٽ ڊيمو پروجيڪٽ پيدا ٿيو (نالو تقريبا بلشٽ مان ايجاد ڪيو ويو). پروگرامنگ، ماڊلنگ، اينيميشن، ٽيڪسٽچرنگ مون کي روزانو ڪم جا ٻه مهينا لڳي ويا.
مون يوٽيوب تي ٽيوٽوريل وڊيوز سان شروع ڪيو ته ڪيئن 3D ماڊل ٺاهيا وڃن . Blender 3D ماڊلنگ (۽ وڌيڪ) لاءِ هڪ بهترين مفت اوزار آهي جنهن کي انسٽاليشن جي ضرورت ناهي. ۽ هتي هڪ جھٽڪو مون کي انتظار ڪري رهيو آهي ... اهو ظاهر ٿئي ٿو ته ماڊلنگ، اينيميشن، ٽيڪسٽچرنگ وڏا الڳ موضوع آهن جن تي توهان ڪتاب لکي سگهو ٿا. اهو خاص طور تي ڪردارن لاء صحيح آهي. آڱرين، ڏند، اکيون ۽ جسم جي ٻين حصن کي ماڊل ڪرڻ لاء، توهان کي اناتومي جي علم جي ضرورت پوندي. منهن جي عضون کي ڪيئن ترتيب ڏنو ويو آهي؟ ماڻهو ڪيئن هلندا آهن؟ مون کي هر هڪ هٿ، ٽنگ، آڱر، ڌڪ ۾ هڏا "داخل" ڪرڻو پيو!
ڪلويڪل کي ماڊل ڪريو، اضافي هڏا ليور، ته جيئن اينيميشن قدرتي نظر اچي. اهڙن سبقن کان پوءِ، توهان کي احساس ٿيندو ته اينيميٽڊ فلمن جا تخليقڪار ڪيترو وڏو ڪم ڪن ٿا، صرف 30 سيڪنڊن جي وڊيو ٺاهڻ لاءِ. پر 3D فلمون ڪلاڪن تائين رهي ٿو! ۽ پوءِ اسان ٿيئٽرن مان ٻاهر اچون ٿا ۽ ڪجهه ائين چئون ٿا: ”تا، هڪ بيوقوف ڪارٽون / فلم! اهي بهتر ڪري سگهن ها...“ بيوقوف!
۽ هن منصوبي ۾ پروگرامنگ بابت هڪ وڌيڪ شيء. جيئن ته اهو نڪتو، مون لاء سڀ کان وڌيڪ دلچسپ حصو رياضياتي هو. جيڪڏهن توهان منظر کي هلائيندا آهيو (پراجيڪٽ جي تفصيل ۾ مخزن جو لنڪ)، توهان کي خبر پوندي ته ڪئميرا هڪ دائري ۾ ڇوڪري جي ڪردار جي چوڌاري گردش ڪري ٿو. اهڙي ڪيمرا جي گردش کي پروگرام ڪرڻ لاءِ، مون کي پهرين دائري (2D) تي پوزيشن پوائنٽ جي همراهن کي ڳڻڻو هو، ۽ پوءِ اسپير (3D) تي. عجيب ڳالهه اها آهي ته مون کي اسڪول ۾ رياضي کان نفرت هئي ۽ ان کي مائنس سان سڃاتو ويندو هو. جزوي طور تي، شايد، ڇاڪاڻ ته اسڪول ۾ اهي صرف توهان کي وضاحت نٿا ڪن ته هي رياضي زندگي ۾ ڪيئن لاڳو ٿئي ٿو. پر جڏهن توهان کي پنهنجي مقصد، خواب سان جنون آهي، ته ذهن صاف، نازل ٿيو! ۽ توهان پيچيده ڪمن کي هڪ دلچسپ مهم جي طور تي سمجهڻ شروع ڪيو. ۽ پوءِ توهان سوچيو: "خير، ڇو نه ٿي سگهيو * محبوب * رياضي دان عام طور تي اهو ٻڌائي سگهي ٿو ته اهي فارمولي ڪٿي ٿي سگهن ٿا؟".

هڪ دائري ۽ دائري تي هڪ نقطي جي همراهن کي ڳڻڻ لاءِ فارمولن جو حساب (منهنجي نوٽ بڪ مان)
راند 1
- پليٽ فارم: Windows (تي آزمايو ويو Windows 7، 10)
- ٻولي منهنجو خيال آهي ته اهو خالص سي ۾ لکيل هو
- راند انجڻ: ڪنسول Windows
- وحي:
- مخزن:

سادي سانپ جي راند
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 ۾ سانپ پروگرامنگ
جيڪڏهن توهان هڪ علامتي ڪنسول راند کي ترقي ڪري رهيا آهيو، ته پوءِ اسڪرين تي ڊيٽا کي ظاهر ڪرڻ عام اسٽريم آئوٽ پٽ 'ڪائوٽ' استعمال ڪندي ڪم نه ڪندو - اهو تمام سست آهي. تنهن ڪري، پيداوار کي اسڪرين بفر ۾ ڪيو وڃي. تمام گھڻو تيز ۽ راند بغير بغير ڪم ڪندو. ايماندار ٿيڻ لاء، مون کي بلڪل سمجھ ۾ نه ٿو اچي ته اسڪرين بفر ڇا آهي ۽ اهو ڪيئن ڪم ڪري ٿو. پر مان هتي هڪ ڪوڊ مثال ڏيندس، ۽ شايد تبصرن ۾ ڪو ماڻهو صورتحال کي واضح ڪرڻ جي قابل هوندو.
اسڪرين بفر حاصل ڪرڻ (جيڪڏهن مان ائين چئي سگهان ٿو):
// 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
- پليٽ فارم: Windows (تي آزمايو ويو Windows 7، 10)
- ٻولي C ++
- راند انجڻ: ڪنسول Windows
- وحي: هڪ ڪتاب
- مخزن:

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

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

راند ٽينڪ ميٽرڪس جو هڪ مثال

ون ڊيمينشنل ايري سان گيم ٽينڪ جي ميٽرڪس جي نمائندگي ڪندي

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

هڪ ڊبل لوپ ۾ هڪ طرفي صف کي ڇڪڻ. Y قطار جي سڃاڻپ آھي، ايڪس ڪالمن جي سڃاڻپ آھي
مهرباني ڪري نوٽ ڪريو ته عام ميٽرڪس جي سڃاڻپ ڪندڙ i, j جي بدران آئون استعمال ڪريان ٿو سڃاڻپ ڪندڙ x ۽ y. تنهن ڪري، اهو مون کي لڳي ٿو، اکين لاء وڌيڪ خوشگوار ۽ دماغ کي صاف. ان کان علاوه، اهڙي نوٽيفڪيشن اهو ممڪن بڻائي ٿو ته آسانيء سان استعمال ٿيل ميٽرس کي ٻه-dimensional تصوير جي همراه محور تي پروجيڪٽ ڪرڻ.
هاڻي پڪسل، رنگ، ۽ اسڪرين آئوٽ پُٽ بابت. آئوٽ پُٽ لاءِ، StretchDIBits فنڪشن استعمال ڪيو ويندو آهي (هيڊر: windows.h؛ لائبريري: gdi32.lib). ٻين شين جي وچ ۾، هي فنڪشن هيٺ ڏنل طور تي منتقل ڪيو ويندو آهي: اهو ڊوائيس جنهن تي تصوير آئوٽ پُٽ ٿي رهي آهي (منهنجي صورت ۾، ڪنسول). Windows)، تصوير جي ڊسپلي جي شروعاتي ڪوآرڊينيٽس، ان جي ويڪر/اوچائي، ۽ تصوير پاڻ کي بائيٽ ايري جي طور تي هڪ بائيٽ ايري جي طور تي. هڪ بائيٽ ايري جي طور تي هڪ بائيٽ ميپ!
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 کي ڀريو ويندو هر پکسل بابت معلومات سان گڏ راند جي ميدان جي عددي ميٽرڪس جي بنياد تي. اهڙي تبديلي جو هڪ مثالي مثال هيٺ ڏنل تصوير ۾ آهي.

هڪ بٽ ميپ ڀرڻ جو هڪ مثال (پکسل ميٽرڪس) معلومات سان گڏ راند جي ميدان جي عددي ميٽرڪس (ڊجيٽل ميٽرڪس) جي بنياد تي (رنگ انڊيڪس راند ۾ انڊيڪس سان نه ملندا آهن)
مان راند مان حقيقي ڪوڊ جو هڪ ٽڪرو پڻ پيش ڪندس. لوپ جي هر ورجائي تي متغير رنگ انڊيڪس کي راند جي ميدان جي عددي ميٽرڪس (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 راند کي لکڻ جي ضرورت آهي. Windows. ڪو به آواز ناهي! 😉 باقي حصا صرف هڪ خيالي پرواز آهن.
يقينن، راند "ٽينڪ" "سانپ" کان وڌيڪ پيچيده ٺهيل آهي. مون اڳ ۾ ئي استعمال ڪيو C++ ٻولي، يعني، مون مختلف راندين جي شين کي ڪلاسن سان بيان ڪيو. مون پنھنجو مجموعو ٺاھيو آھي - توھان ڪوڊ ڏسي سگھوٿا headers/Box.h ۾. رستي جي ذريعي، مجموعي ۾ گهڻو ڪري هڪ ميموري ليک آهي. استعمال ٿيل اشارو. ياداشت سان ڪم ڪيو. مون کي چوڻ گهرجي ته ڪتاب مون کي تمام گهڻو مدد ڪئي. شروع ٿيندڙ C++ گيم پروگرامنگ ذريعي. هي C++ ۾ شروعات ڪندڙن لاءِ هڪ بهترين شروعات آهي. اهو ننڍڙو، دلچسپ ۽ چڱي طرح منظم آهي.
هن راند کي ترقي ڪرڻ ۾ اٽڪل ڇهه مهينا لڳا. مون گهڻو ڪري ڪم تي لنچ ۽ ناشتي دوران لکيو. هو آفيس جي باورچی خانه ۾ ويٺو، کاڌي تي اسٽمپ ڪيو ۽ ڪوڊ لکيو. يا رات جي ماني لاء گهر ۾. تنهنڪري مون کي اهڙيون "باورچي وار" مليا. هميشه وانگر، مون فعال طور تي هڪ نوٽ بڪ استعمال ڪيو، ۽ سڀ تصوراتي شيون ان ۾ پيدا ٿيا.
عملي حصي جي آخر ۾، مان پنھنجي نوٽ بڪ جا ڪجھ اسڪين ڪڍي ڇڏيندس. اهو ڏيکارڻ لاءِ ته مان ڇا لکي رهيو آهيان، ڊرائنگ، ڳڻپ، ڊزائيننگ...

ٽانڪي تصوير ڊيزائن. ۽ هر ٽينڪ کي اسڪرين تي قبضو ڪرڻ گهرجي ڪيترا پکسلز جي تعريف

ان جي محور جي چوڌاري ٽينڪ جي گردش لاء الگورتھم ۽ فارمولن جو حساب

منهنجي جمع جو خاڪو (جيڪو ميموري ليک سان گڏ، گهڻو ڪري). مجموعو هڪ ڳنڍيل فهرست جي طور تي ٺهيل آهي

۽ اهي مصنوعي ذهانت کي راند ۾ ڇڪڻ جي ناڪام ڪوششون آهن
اصول
"هزارين ميلن جو سفر به پهرين قدم سان شروع ٿئي ٿو" (قديم چيني حڪمت)
اچو ته عمل کان نظريي ڏانهن وڃو! توهان پنهنجي شوق لاء وقت ڪيئن ڳوليندا آهيو؟
- اهو طئي ڪيو ته توهان واقعي چاهيو ٿا (افسوس، اهو سڀ کان وڌيڪ ڏکيو آهي).
- ترجيحات مقرر ڪريو.
- اعليٰ ترجيحن جي خاطر سڀ ”ضروري“ قربان ڪريو.
- هر روز پنهنجي مقصدن ڏانهن وڃو.
- اميد نه رکو ته شوق لاء ٻه يا ٽي ڪلاڪ مفت وقت هوندا.
هڪ پاسي، توهان کي اهو طئي ڪرڻو پوندو ته توهان ڇا چاهيو ٿا ۽ ترجيح ڏيو. ٻئي طرف، اهو ممڪن آهي ته انهن ترجيحن جي حق ۾ ڪجهه ڪيسن / منصوبن کي ڇڏي ڏيو. ٻين لفظن ۾، توهان کي هر شيء کي قربان ڪرڻو پوندو "زبردست". مون ڪنهن هنڌ ٻڌو هو ته زندگيءَ ۾ وڌ ۾ وڌ ٽي مکيه ڪم ٿيڻ گهرجن. پوء توهان انهن سان بهترين طريقي سان ڊيل ڪرڻ جي قابل هوندا. ۽ اضافي منصوبا / هدايتون اوورلوڊ ڪارني شروع ٿيندي. پر اهو سڀ ڪجهه، شايد، موضوعي ۽ انفرادي آهي.
هتي هڪ خاص سونهري قاعدو آهي: ڪڏهن به 0٪ ڏينهن نه آهي! مون ان جي باري ۾ سکيو هڪ آرٽيڪل ۾ هڪ انڊي ڊولپر پاران. جيڪڏهن توهان هڪ منصوبي تي ڪم ڪري رهيا آهيو، پوء هر روز ان بابت ڪجهه ڪريو. ۽ اهو مسئلو ناهي ته توهان ڪيترو ٺاهيو. هڪ لفظ يا ڪوڊ جي هڪ لڪير لکو، هڪ ٽيوٽوريل وڊيو ڏسو، يا بورڊ ۾ هڪ نيل ڇڪيو- بس ڪجهه ڪريو. سڀ کان ڏکيو حصو شروع ٿي رهيو آهي. هڪ دفعو توهان شروع ڪيو، توهان شايد ڪجهه وڌيڪ ڪندا جيڪو توهان چاهيو ٿا. تنهنڪري توهان مسلسل پنهنجي مقصد ڏانهن وڌندا ۽، مون تي يقين رکو، تمام جلدي. سڀ کان پوء، سڀني شين تي مکيه برڪ دير آهي.
۽ اهو ياد رکڻ ضروري آهي ته توهان کي 5، 10، 15 منٽن ۾ وقت جي مفت "چوري" کي گهٽ نه سمجهڻ ۽ نظر انداز ڪرڻ گهرجي، ڪجهه وڏي "لاگز" جو انتظار ڪريو جيڪو هڪ ڪلاڪ يا ٻه ڊگهو آهي. ڇا توهان قطار ۾ بيٺا آهيو؟ توھان جي منصوبي لاء ڪجھھ سوچيو. ڇا توهان ايسڪيليٽر تي وڃي رهيا آهيو؟ هڪ نوٽ بڪ ۾ ڪجهه لکو. ڇا توهان بس ۾ کائو ٿا؟ چڱو، ڪجهه مضمون پڙهو. هر موقعو استعمال ڪريو. يوٽيوب تي ٻليون ۽ ڪتا ڏسڻ بند ڪريو! پنهنجي دماغ سان خراب نه ڪريو!
۽ آخري. جيڪڏهن، هن مضمون کي پڙهڻ کان پوء، توهان کي پسند ڪيو ته راند ٺاهڻ جو خيال بغير گيم انجڻ استعمال ڪرڻ، پوء نالو ياد رکو Casey Muratori. ھن ماڻھوءَ وٽ آھي "ڏسو -> پوئين قسطون" سيڪشن ۾، توهان کي شروع کان هڪ پيشه ورانه راند ٺاهڻ تي شاندار مفت وڊيو سبق ملندا. پنجن سبقن لاءِ سي جو تعارف Windows توهان شايد يونيورسٽي جي پنجن سالن ۾ ان کان وڌيڪ سکي سگهو ٿا (ڪنهن وڊيو هيٺ ڏنل تبصرن ۾ هن بابت لکيو آهي).
ڪيسي اهو به بيان ڪري ٿو ته توهان جي پنهنجي گيم انجڻ کي ترقي ڪندي، توهان کي ڪنهن به موجوده انجڻ جي بهتر سمجھ هوندي. فريم ورڪ جي دنيا ۾، جتي هرڪو خودڪار ڪرڻ جي ڪوشش ڪري رهيو آهي، توهان سکو ته ڪيئن ٺاهيو، استعمال نه ڪيو. ڪمپيوٽر جي فطرت کي سمجھو. ۽ توهان پڻ هڪ وڌيڪ ذهين ۽ بالغ پروگرامر بڻجي ويندا - هڪ پرو.
توهان جي چونڊيل رستي تي سٺي قسمت! ۽ اچو ته دنيا کي وڌيڪ پروفيشنل بڻايون.
الاهي: ، DevOps
جو ذريعو: www.habr.com
