كيف تم تنفيذ الشعلة في الموت على بلاي ستيشن


فصل كامل من لعبة Game Engine Black Book: DOOM يدور حول منافذ وحدة التحكم DOOM والتحديات التي واجهها مطورو البرامج. يمكنك التحدث لفترة طويلة عن الفشل التام في تطبيق 3DO ، والصعوبات في Saturn بسبب تخطيط نسيج الألفة و "الهندسة العكسية من الصفر" ، التي قام بها Randy Linden لصالح Super Nintendo.

في البداية في الاتجاه المؤدي إلى الانهيار [1] ، تمكن مطورو منفذ Playstation 1 (PSX) لاحقًا من تغيير المسار وإنشاء منفذ كان ناجحًا بين النقاد والسوق. كان Final DOOM أول منفذ حقيقي يمكن مقارنته بإصدار جهاز الكمبيوتر. لم تحسن قطاعات الألوان مع مزج ألفا من جودة الصورة فحسب ، بل قامت أيضًا بتحسين طريقة اللعب من خلال الإشارة إلى مفتاح اللون المطلوب. أيضًا بفضل تأثيرات تردد وحدة معالجة الصوت بوحدة PSX ، تم تحسين الصوت.

أجرى فريق التطوير مثل هذا العمل عالي الجودة حيث كان لا يزال لديه عدد قليل من دورات وحدة المعالجة المركزية المجانية التي قرروا استخدامها لتوليد النار المتحركة في المقدمة واللعب . هذا قادني إلى الرهبة بفظاعة لدرجة أنني قررت معرفة كيف تم تحقيق التأثير. عندما لم تعط عمليات البحث الأولى إجابة ، كنت أستعد لنفخ الغبار عن كتاب MIPS لتكسير الملف القابل للتنفيذ ، ولكن أجاب صموئيل فياريال على Twitter في الوقت المحدد أنه أكمل بالفعل التطوير العكسي للإصدار الخاص بـ Nintendo 64 [2] . لقد كان الأمر كافيًا بالنسبة لي لتنظيفه قليلاً وتبسيطه وتحسينه.

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

الفكرة الأساسية




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


تتم تهيئة المخزن المؤقت للإطار باللون الأسود بالكامل (مملوء بالأصفار) بخط أبيض واحد من البيكسلات البيضاء في الجزء السفلي (36) ، وهو "مصدر" اللهب.


في كل مرة يتم فيها تحديث الشاشة ، ترتفع "الحرارة". لكل بكسل في المخزن المؤقت للإطار ، يتم حساب قيمة جديدة. يتم تحديث كل بكسل مع مراعاة القيمة الموجودة أسفله مباشرة. في الرمز ، الزاوية السفلية اليسرى هي فهرس صفيف الصفيف ، ويحتوي الركن الأيمن العلوي على الفهرس FIRE_HEIGHT * FIRE_WIDTH - 1.

function doFire() { for(x=0 ; x < FIRE_WIDTH; x++) { for (y = 1; y < FIRE_HEIGHT; y++) { spreadFire(y * FIRE_WIDTH + x); } } } function spreadFire(src) { firePixels[src - FIRE_WIDTH] = firePixels[src] - 1; } 

لاحظ أن السطر 0 لا يتم تحديثه أبدًا (التكرار على y لا يبدأ بـ 0 ، ولكن بالرقم 1). هذا الخط المملوء صفر هو "مولد" النار. إصدار بسيط مع تبريد خطي (- = 1) يعطينا إخراج موحد مملة.


يمكننا تعديل وظيفة الانتشار الطفيف () وتعديل معدل اضمحلال قيم الحرارة. مضيفا العشوائية هو لائق.

  function spreadFire(src) { var rand = Math.round(Math.random() * 3.0) & 3; firePixels[src - FIRE_WIDTH ] = pixel - (rand & 1); } 


هذا أفضل بالفعل. لإتقان الوهم ، يمكن للمرء أن يوزع بشكل عشوائي ليس فقط للأعلى ، ولكن أيضًا في اليسار واليمين.

  function spreadFire(src) { var rand = Math.round(Math.random() * 3.0) & 3; var dst = src - rand + 1; firePixels[dst - FIRE_WIDTH ] = firePixels[src] - (rand & 1); } 


[ملاحظة حارة: يوتيوب يقرص الفيديو بشكل رهيب ، فمن الأفضل مشاهدة العرض التوضيحي على Javascript في المقالة الأصلية أو فتح GIF تحت المفسد.]

GIF Flame Animation (23 ميغابايت)
الصورة

فويلا! لاحظ أنه من خلال تغيير عملية انتشار اللهب ، يمكن أيضًا محاكاة الرياح. سأترك هذا كتمرين للقراء الذين تمكنوا من قراءة المقال.

شفرة المصدر الكامل




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

المراجع




[1] المصدر: القصة الكاملة التفصيلية في Game Engine Black Book: DOOM

[2] المصدر: 25 مارس ، 2018 Twitter post.

Source: https://habr.com/ru/post/ar435122/


All Articles