DevOps C ++ و "حروب المطبخ" ، أو كيف بدأت كتابة الألعاب أثناء تناول الطعام

"أعلم أنني لا أعرف شيئًا" سقراط

لمن: لأشخاص تكنولوجيا المعلومات الذين يبصقون على جميع المطورين ويريدون ممارسة ألعابهم!

عن ما: كيف تبدأ كتابة الألعاب في C / C ++ إذا كنت في حاجة إليها!

لماذا يجب أن تقرأ هذا: تطوير التطبيقات ليس تخصصي في عملي ، لكني أحاول البرمجة كل أسبوع. لأنني أحب الألعاب!

مرحبا اسمي أندري جرانكين، أنا DevOps في Luxoft. تطوير التطبيقات ليس تخصصي في عملي ، لكني أحاول البرمجة كل أسبوع. لأنني أحب الألعاب!

تعد صناعة ألعاب الكمبيوتر ضخمة ، حتى أن هناك شائعات اليوم أكثر من صناعة السينما. تمت كتابة الألعاب منذ بداية تطوير أجهزة الكمبيوتر ، باستخدام أساليب التطوير المعقدة والأساسية بمعايير حديثة. بمرور الوقت ، بدأت محركات الألعاب في الظهور برسومات وفيزياء وصوت مبرمجة بالفعل. إنها تسمح لك بالتركيز على تطوير اللعبة نفسها ولا تهتم بأساسها. ولكن إلى جانبهم ، مع المحركات ، "يعمى المطورون" ويتحللون. يتم وضع إنتاج الألعاب على الناقل. وتبدأ كمية الإنتاج في الغلبة على جودتها.

في الوقت نفسه ، عند لعب ألعاب الآخرين ، فإننا مقيدون باستمرار بالمواقع ، والمؤامرة ، والشخصيات ، وآليات اللعبة التي ابتكرها الآخرون. لذلك أدركت أن ...

... حان الوقت لإنشاء عوالم خاصة بك ، تخضع لي فقط. عوالم حيث أنا الآب والابن والروح القدس!

وأعتقد بصدق أنه من خلال كتابة محرك اللعبة الخاص بك واللعبة عليه ، ستتمكن من فتح عينيك ومسح النوافذ وضخ المقصورة الخاصة بك ، لتصبح مبرمجًا أكثر خبرة وتكاملًا.

سأحاول في هذه المقالة أن أخبرك كيف بدأت في كتابة الألعاب الصغيرة بلغة C / C ++ ، وما هي عملية التطوير وأين أجد وقتًا لممارسة هواية في بيئة مزدحمة. إنه ذاتي ويصف عملية البداية الفردية. مادة عن الجهل والإيمان ، عن صورتي الشخصية للعالم في الوقت الحالي. بمعنى آخر ، "الإدارة ليست مسؤولة عن عقلك الشخصي!".

ممارسة

"المعرفة بدون ممارسة غير مجدية ، والممارسة بدون معرفة أمر خطير". كونفوشيوس

دفتر ملاحظاتي هو حياتي!


لذلك ، من الناحية العملية ، يمكنني القول أن كل شيء بالنسبة لي يبدأ بدفتر ملاحظات. أنا أكتب ليس فقط المهام اليومية هناك ، ولكن أيضًا أرسم وأبرمج وتصميم المخططات الانسيابية وحل المشكلات ، بما في ذلك المسائل الرياضية. استخدم دائمًا المفكرة واكتب بقلم رصاص فقط. إنه نظيف ومريح وموثوق به ، IMHO.

DevOps C ++ و "حروب المطبخ" ، أو كيف بدأت كتابة الألعاب أثناء تناول الطعام
دفتر ملاحظاتي (المملوء بالفعل). هكذا تبدو. يحتوي على المهام اليومية والأفكار والرسومات والمخططات والحلول ومسك الدفاتر السوداء والكود وما إلى ذلك.

في هذه المرحلة ، تمكنت من إكمال ثلاثة مشاريع (وهذا من وجهة نظري "النهائية" ، لأنه يمكن تطوير أي منتج إلى ما لا نهاية نسبيًا).

  • المشروع 0: هذا مشهد ثلاثي الأبعاد لمهندس معماري مكتوب بلغة C # باستخدام محرك لعبة Unity. لأنظمة macOS و Windows.
  • لعبة 1: لعبة وحدة التحكم Simple Snake (المعروفة للجميع باسم "Snake") لنظام التشغيل Windows. مكتوب في C.
  • لعبة 2: لعبة وحدة التحكم Crazy Tanks (المعروفة للجميع باسم "Tanks") ، وهي مكتوبة بالفعل بلغة C ++ (باستخدام الفئات) وأيضًا تحت Windows.

مشروع 0 مهندس تجريبي

DevOps C ++ و "حروب المطبخ" ، أو كيف بدأت كتابة الألعاب أثناء تناول الطعام
3D Scene Architect Demo. عرض معماري ثلاثي الأبعاد

تم تنفيذ المشروع الأول ليس في C / C ++ ، ولكن في C # باستخدام محرك لعبة Unity. لم يكن هذا المحرك متطلبًا على الأجهزة مثل غير واقعي المحرك، كما بدا لي أسهل في التثبيت والاستخدام. لم أفكر في المحركات الأخرى.

لم يكن الهدف في Unity بالنسبة لي تطوير نوع من الألعاب. كنت أرغب في إنشاء مشهد ثلاثي الأبعاد بنوع من الشخصية. كان عليه ، أو بالأحرى (لقد صممت الفتاة التي كنت أحبها =) ، أن يتحرك ويتفاعل مع العالم الخارجي. كان من المهم فقط فهم ماهية الوحدة ، وما هي عملية التطوير ، ومقدار الجهد الذي يتطلبه إنشاء شيء ما. هذه هي الطريقة التي ولد بها مشروع Architect Demo (تم اختراع الاسم تقريبًا من هراء). استغرقت البرمجة والنمذجة والرسوم المتحركة والتركيب على الأرجح شهرين من العمل اليومي.

لقد بدأت بمقاطع فيديو تعليمية على YouTube حول كيفية إنشاء نماذج ثلاثية الأبعاد بتنسيق خلاط . Blender هي أداة مجانية رائعة للنمذجة ثلاثية الأبعاد (وأكثر) لا تتطلب التثبيت. وهنا كانت الصدمة تنتظرني ... اتضح أن النمذجة والرسوم المتحركة والتركيب هي موضوعات منفصلة ضخمة يمكنك كتابة الكتب عنها. هذا ينطبق بشكل خاص على الشخصيات. لنمذجة الأصابع والأسنان والعينين وأجزاء أخرى من الجسم ، ستحتاج إلى معرفة علم التشريح. كيف يتم ترتيب عضلات الوجه؟ كيف يتحرك الناس؟ اضطررت إلى "إدخال" العظام في كل ذراع ، ورج ، وإصبع ، ومفاصل!

نموذج الترقوة ، رافعات عظم إضافية ، بحيث تبدو الرسوم المتحركة طبيعية. بعد هذه الدروس ، ستدرك حجم العمل الضخم الذي يقوم به مبتكرو أفلام الرسوم المتحركة ، فقط لإنشاء 30 ثانية من الفيديو. لكن الأفلام ثلاثية الأبعاد تدوم لساعات! ثم نخرج من المسارح ونقول شيئًا مثل: "Ta ، فيلم كرتوني / فيلم غبي! كان من الممكن أن يفعلوا ما هو أفضل ... "الحمقى!

وشيء آخر عن البرمجة في هذا المشروع. كما اتضح ، كان الجزء الأكثر إثارة بالنسبة لي هو الجزء الرياضي. إذا قمت بتشغيل المشهد (رابط إلى المستودع في وصف المشروع) ، ستلاحظ أن الكاميرا تدور حول شخصية الفتاة في كرة. لبرمجة مثل هذا الدوران للكاميرا ، كان علي أولاً حساب إحداثيات نقطة الموقع على الدائرة (2D) ، ثم على الكرة (3D). الشيء المضحك هو أنني كرهت الرياضيات في المدرسة وعرفتها بنقص. جزئيًا ، على الأرجح ، لأنهم في المدرسة ببساطة لا يشرحون لك كيف يتم تطبيق هذه الرياضيات في الحياة. ولكن عندما تكون مهووسًا بهدفك ، الحلم ، فسيتم تنقية الذهن وكشفه! وتبدأ في إدراك المهام المعقدة كمغامرة مثيرة. وبعد ذلك تفكر: "حسنًا ، لماذا لا يستطيع عالم الرياضيات * المحبوب * أن يخبرنا عادةً أين يمكن الاستناد إلى هذه الصيغ؟".

DevOps C ++ و "حروب المطبخ" ، أو كيف بدأت كتابة الألعاب أثناء تناول الطعام
حساب الصيغ لحساب إحداثيات نقطة على دائرة وعلى كرة (من دفتر ملاحظاتي)

لعبة 1

  • منصة: Windows (تم اختباره على Windows 7 و 10)
  • اللغة: أعتقد أنه كتب بلغة C نقية
  • محرك اللعبة: وحدة تحكم Windows
  • إلهام: جافيدكس 9
  • مخزن: GitHub جيثب:

DevOps C ++ و "حروب المطبخ" ، أو كيف بدأت كتابة الألعاب أثناء تناول الطعام
لعبة بسيطة ثعبان

المشهد ثلاثي الأبعاد ليس لعبة. بالإضافة إلى ذلك ، تعد نمذجة وتحريك الكائنات ثلاثية الأبعاد (خاصة الشخصيات) طويلة وصعبة. بعد اللعب مع Unity ، أدركت أنه يجب علي الاستمرار ، أو بالأحرى البدء ، من الأساسيات. شيء بسيط وسريع ، ولكن في نفس الوقت عالمي ، لفهم بنية الألعاب ذاتها.

وماذا لدينا بسيط وسريع؟ هذا صحيح ، وحدة التحكم وثنائية الأبعاد. بتعبير أدق ، حتى وحدة التحكم والرموز. مرة أخرى ، بدأت في البحث عن الإلهام على الإنترنت (بشكل عام ، أعتبر الإنترنت أكثر اختراع ثوري وخطير في القرن الحادي والعشرين). لقد بحثت في مقطع فيديو لأحد المبرمجين الذي صنع وحدة التحكم Tetris. وعلى غرار لعبته ، قرر قطع "الأفعى". تعلمت من الفيديو شيئين أساسيين - حلقة اللعبة (مع ثلاث وظائف / أجزاء أساسية) والإخراج إلى المخزن المؤقت.

قد تبدو حلقة اللعبة كما يلي:

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

يقدم الكود وظيفة main () بالكامل مرة واحدة. وتبدأ دورة اللعبة بعد التعليق المقابل. هناك ثلاث وظائف أساسية في الحلقة: الإدخال () ، والمنطق () ، والرسم (). أولاً ، إدخال بيانات الإدخال (التحكم بشكل أساسي في ضغطات المفاتيح) ، ثم معالجة البيانات المدخلة المنطقية ، ثم عرضها على الشاشة - رسم. وهكذا كل إطار. يتم إنشاء الرسوم المتحركة بهذه الطريقة. إنها مثل الرسوم المتحركة. عادةً ما تستغرق معالجة بيانات الإدخال معظم الوقت ، وبقدر ما أعرف ، تحدد معدل عرض الإطارات للعبة. لكن هنا وظيفة المنطق () سريعة جدًا. لذلك ، يجب التحكم في معدل الإطارات بواسطة وظيفة Sleep () باستخدام معلمة gameSpeed ​​التي تحدد هذا المعدل.

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 ++ و "حروب المطبخ" ، أو كيف بدأت كتابة الألعاب أثناء تناول الطعام
لعبة الدبابات المجنونة

ربما تكون طباعة الأحرف على وحدة التحكم هي أبسط شيء يمكنك تحويله إلى لعبة. ولكن بعد ذلك تظهر مشكلة واحدة: الشخصيات لها ارتفاعات وعرض مختلفة (الارتفاع أكبر من العرض). وبالتالي ، سيبدو كل شيء غير متناسب ، وسيبدو التحرك لأسفل أو لأعلى أسرع بكثير من التحرك يسارًا أو يمينًا. هذا التأثير ملحوظ جدًا في لعبة "Snake" (اللعبة الأولى). "الدبابات" (اللعبة 1) ليس لها مثل هذا العيب ، حيث يتم تنظيم الإخراج هناك من خلال طلاء بكسلات الشاشة بألوان مختلفة. يمكنك القول أنني كتبت عارض. صحيح ، هذا بالفعل أكثر تعقيدًا بعض الشيء ، رغم أنه أكثر إثارة للاهتمام.

بالنسبة لهذه اللعبة ، يكفي وصف نظامي لعرض وحدات البكسل على الشاشة. أعتقد أن هذا هو الجزء الرئيسي من اللعبة. وكل شيء آخر يمكنك أن تبتكره بنفسك.

لذا ، ما تراه على الشاشة هو مجرد مجموعة من المستطيلات الملونة المتحركة.

DevOps C ++ و "حروب المطبخ" ، أو كيف بدأت كتابة الألعاب أثناء تناول الطعام
مجموعة المستطيل

يتم تمثيل كل مستطيل بمصفوفة مليئة بالأرقام. بالمناسبة ، يمكنني تسليط الضوء على فارق بسيط واحد مثير للاهتمام - جميع المصفوفات في اللعبة تمت برمجتها كمصفوفة أحادية البعد. ليست ثنائية الأبعاد ، بل ذات بعد واحد! المصفوفات أحادية البعد أسهل بكثير وأسرع للعمل معها.

DevOps C ++ و "حروب المطبخ" ، أو كيف بدأت كتابة الألعاب أثناء تناول الطعام
مثال على مصفوفة دبابة اللعبة

DevOps C ++ و "حروب المطبخ" ، أو كيف بدأت كتابة الألعاب أثناء تناول الطعام
تمثيل مصفوفة دبابة لعبة بمصفوفة أحادية البعد

DevOps C ++ و "حروب المطبخ" ، أو كيف بدأت كتابة الألعاب أثناء تناول الطعام
مثال توضيحي أكثر لتمثيل المصفوفة بواسطة مصفوفة أحادية البعد

لكن الوصول إلى عناصر المصفوفة يحدث في حلقة مزدوجة ، كما لو أنها ليست مصفوفة ذات بعد واحد ، ولكنها مصفوفة ثنائية الأبعاد. يتم ذلك لأننا ما زلنا نعمل مع المصفوفات.

DevOps C ++ و "حروب المطبخ" ، أو كيف بدأت كتابة الألعاب أثناء تناول الطعام
اجتياز مصفوفة أحادية البعد في حلقة مزدوجة. Y هو معرف الصف ، X هو معرف العمود

يرجى ملاحظة أنه بدلاً من معرفات المصفوفة المعتادة i و j ، أستخدم المعرفات x و y. لذلك ، يبدو لي أنه أكثر إرضاء للعين وأكثر وضوحًا للدماغ. بالإضافة إلى ذلك ، يتيح هذا الترميز إمكانية عرض المصفوفات المستخدمة بسهولة على محاور الإحداثيات لصورة ثنائية الأبعاد.

الآن حول البكسل واللون والعرض. يتم استخدام وظيفة StretchDIBits (Header: windows.h؛ Library: gdi32.lib) للإخراج. من بين أشياء أخرى ، يتم تمرير ما يلي إلى هذه الوظيفة: الجهاز الذي يتم عرض الصورة عليه (في حالتي ، هذه هي وحدة تحكم Windows) ، وإحداثيات بداية عرض الصورة ، وعرضها / ارتفاعها ، والصورة نفسها في شكل صورة نقطية (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);

بشكل تقريبي ، تتكون الصورة النقطية من مجموعة من وحدات البكسل. كل أربعة بايت في المصفوفة هي RGB بيكسل. بايت واحد لكل قيمة حمراء ، بايت واحد لكل قيمة خضراء (G) ، بايت واحد لكل لون أزرق (B). بالإضافة إلى ذلك ، هناك بايت واحد لكل مسافة بادئة. يتم خلط هذه الألوان الثلاثة - الأحمر / الأخضر / الأزرق (RGB) - مع بعضها البعض بنسب مختلفة - ويتم الحصول على لون البكسل الناتج.

الآن ، مرة أخرى ، يتم تمثيل كل مستطيل ، أو كائن لعبة ، بمصفوفة رقمية. يتم وضع كل كائنات اللعبة هذه في مجموعة. ثم يتم وضعهم في الملعب ، مكونين مصفوفة عددية كبيرة. لقد قمت بتعيين كل رقم في المصفوفة بلون معين. على سبيل المثال ، الرقم 8 أزرق ، الرقم 9 أصفر ، الرقم 10 رمادي غامق ، وهكذا. وهكذا ، يمكننا القول أن لدينا مصفوفة من الملعب ، حيث كل رقم هو نوع من اللون.

لذلك ، لدينا مصفوفة عددية لملعب اللعب بأكمله من ناحية وصورة نقطية لعرض الصورة من ناحية أخرى. حتى الآن ، الصورة النقطية "فارغة" - لا تحتوي بعد على معلومات حول وحدات البكسل للون المطلوب. هذا يعني أن الخطوة الأخيرة ستتمثل في ملء الصورة النقطية بمعلومات حول كل بكسل بناءً على المصفوفة الرقمية لملعب اللعب. مثال توضيحي لمثل هذا التحول في الصورة أدناه.

DevOps C ++ و "حروب المطبخ" ، أو كيف بدأت كتابة الألعاب أثناء تناول الطعام
مثال على ملء صورة نقطية (مصفوفة بكسل) بمعلومات تستند إلى المصفوفة الرقمية (مصفوفة رقمية) لملعب اللعب (لا تتطابق مؤشرات الألوان مع المؤشرات الموجودة في اللعبة)

سأقدم أيضًا جزءًا من الكود الحقيقي من اللعبة. يتم تعيين مؤشر اللون المتغير عند كل تكرار للحلقة قيمة (مؤشر اللون) من المصفوفة الرقمية لملعب التشغيل (mainDigitalMatrix). ثم يتم كتابة اللون نفسه إلى متغير اللون بناءً على الفهرس. علاوة على ذلك ، يتم تقسيم اللون الناتج إلى نسبة الأحمر والأخضر والأزرق (RGB). ومع المسافة البادئة (pixelPadding) ، تتم كتابة هذه المعلومات على البكسل مرارًا وتكرارًا ، لتشكيل صورة ملونة في الصورة النقطية.

تستخدم الكود مؤشرات وعمليات أحاديات ، والتي قد يكون من الصعب فهمها. لذلك أنصحك بقراءة كيف تعمل هذه الهياكل بشكل منفصل في مكان ما.

ملء صورة نقطية بالمعلومات بناءً على المصفوفة الرقمية لملعب اللعب:

// 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 ويتم عرضها على الشاشة في وظيفة Draw (). بعد تسجيل ضغطات المفاتيح في وظيفة الإدخال () ومعالجتها اللاحقة في وظيفة المنطق () ، يتم تشكيل صورة جديدة (إطار). صحيح أن كائنات اللعبة قد يكون لها بالفعل موقع مختلف في الملعب ، وبالتالي يتم رسمها في مكان مختلف. هذه هي الطريقة التي تحدث بها الرسوم المتحركة (الحركة).

نظريًا (إذا لم تنسَ أي شيء) ، فإن فهم حلقة اللعبة من اللعبة الأولى ("Snake") ونظام عرض وحدات البكسل على الشاشة من اللعبة الثانية ("Tanks") هو كل ما تحتاجه لكتابة أي من ألعابك ثنائية الأبعاد لنظام التشغيل Windows. صامت! 😉 بقية الأجزاء مجرد رحلة خيالية.

بالطبع ، لعبة "Tanks" مصممة بشكل أكثر تعقيدًا من لعبة "Snake". لقد استخدمت بالفعل لغة 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 ، قد تتعلم أكثر من خمس سنوات من الدراسة في الجامعة (كتب أحدهم عن هذا في التعليقات الموجودة أسفل الفيديو).

يوضح Casey أيضًا أنه من خلال تطوير محرك اللعبة الخاص بك ، سيكون لديك فهم أفضل لأي محركات موجودة. في عالم الأطر ، حيث يحاول الجميع الأتمتة ، ستتعلم كيفية الإنشاء وليس الاستخدام. فهم طبيعة أجهزة الكمبيوتر. وستصبح أيضًا مبرمجًا أكثر ذكاءً ونضجًا - محترفًا.

حظا سعيدا في المسار الذي اخترته! ودعونا نجعل العالم أكثر احترافًا.

المؤلف: جرانكين أندري، DevOps



المصدر: www.habr.com