"تبديل البنك" العفاريت على تطبيقات NES القديمة

StackOverflow https://stackoverflow.com/questions/3030565

  •  26-09-2019
  •  | 
  •  

سؤال

أنا أكتب حاليًا في C# ما الذي يمكن أن يطلق عليه بشكل أساسي تفسيري الخاص لأجهزة NES لـ NES في لعبة المدارس القديمة التي أقوم بتطويرها. لقد قمت بإطلاق FCE وألاحظ كيف عرضت NES الرسومات المقدمة.

باختصار ، يمكن أن يحمل NES معلومات رسومية اثنين من نقار نقطات ، ولكل منها أبعاد 128x128. وتسمى هذه جداول PPU. كان أحدهم للبلاط BG والآخر للعفاريت. يجب أن تكون البيانات في هذه الذاكرة حتى يتم رسمها على الشاشة. الآن ، إذا كان لدى اللعبة المزيد من البيانات الرسومية ثم هذين البنكين ، فيمكنها كتابة أجزاء من هذه المعلومات الجديدة إلى هذه البنوك - الكتابة فوق ما كان هناك - في نهاية كل إطار ، واستخدامها من الإطار التالي فصاعدًا.

لذا ، في الألعاب القديمة ، كيف قام المبرمجون "تبديل بنك"؟ أعني ، ضمن تصميم المستوى ، كيف عرفوا أي رسومات تم تحميلها؟ لقد لاحظت أن Mega Man 2 Bankswitches عندما تقوم الشاشة بتمرير برمجي من جزء واحد من المرحلة إلى التالي. ولكن كيف قاموا بتخزين هذه المعلومات في المستوى - ما العفاريت التي يجب نسخها إلى جداول PPU ، وأين يكتبونها؟

مثال آخر هو ضرب توقف في MM2. يتم كتابة بلاط BG أثناء الإيقاف المؤقت ، ثم يتم استعادتها عندما يقوم اللاعب بتفكيك. كيف تذكروا أي البلاط الذي استبدلوه وكيفية استعادتها؟

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

تحرير: الحل الوحيد الذي يمكنني التفكير فيه هو الاحتفاظ بجداول منفصلة تشير إلى ما يجب أن تكون عليه البلاط في PPU في أي وقت ، لكنني أعتقد أن هذا سيكون مورد ذاكرة ضخم لن يتمكن NES من التعامل معه.

هل كانت مفيدة؟

المحلول

WSO بعد ليلة من التفكير وإعادة قراءة المستندات ، أعتقد أنني توصلت إلى حل مثالي. مصفوفة!

بالنظر إلى البيانات التالية:

 3, -1, -1, -1, -1
-1,  0,  1,  2, -1
-1, -1, -1,  3, -1
-1, -1,  5,  4, -1
-1, -1, -1, -1, -1

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

MAP ARRAY    PALETTE   MUSIC   TILESET  STARTINGSCR
   0            0        0        1           4
   1            4        3        2           2
   2                         etc.
   3

لذلك عند تحميل الخريطة ، أنظر إلى العنصر (0،0). سيقول إنني بحاجة إلى تحميل بلاط X في PPU ، واستخدام الباليتي الملونة Y ، و z tileset ، والموسيقى. سيقول أيضًا أن الشاشة 0 هي شاشة البداية وأن المستوى يبدأ هناك - ضع الشخصية وفقًا لذلك.

   SCREEN     PALETTE    TILESET   MUSIC   TILEDATA  SCROLLL SCROLLR SCROLLU SCROLLD  
      0           0          1       2         4       true     true    true    true
      1                   etc
      2           2          1       2         3       false   false     false  true

الآن دعنا نقول إنني بحاجة إلى انتقال الشاشات. يمكنني إلقاء نظرة على الشاشة الحالية مقابل الشاشة الهدف. إذا كانت الشاشة الجديدة تحتاج إلى معلومات غير موجودة في PPU ، فيمكنني بدء عملية انتقال من شأنها تحميل البيانات أثناء ذلك. يمكنني أيضًا معرفة ما إذا كان بإمكاني التمرير إلى هذا الاتجاه ؛ على سبيل المثال ، إذا كانت الشاشة المستهدفة -1 ، فلا يمكنني التمرير لهذا الاتجاه. يمكنني أيضًا تخزين علامة في مكان ما لتحديد أنه إذا تم التمرير على تلك الشاشة ، فلا يمكنني التمرير مرة أخرى. على سبيل المثال ، يمكنني الذهاب مباشرة إلى الشاشة رقم 2 ولكن لا يمكنني التمرير اليسرى إلى الشاشة 1.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top