تستخدم انتقالات الشاشة في Legend of Zelda ميزات NES غير الموثقة

من أجل تأثير التمرير العمودي في الجزء الأول من "The Legend of Zelda" ، يتم استخدام التلاعب بالرسومات "الأجهزة" NES ، على الأرجح لم يتم توفيرها من قبل مطوري وحدة التحكم.


ليس لدي إمكانية الوصول إلى الوثائق الرسمية لوحدة معالجة الصور (PPU - شريحة الرسوم البيانية) بوحدة التحكم NES ، لذلك من المرجح أن تكون تصريحاتي حول "السلوك غير المحدد" تخمينات. أخذت مواصفات أجهزة الرسومات من NesDev Wiki . يتم التحكم PPU عن طريق الكتابة إلى السجلات مع تعيين الذاكرة. إذا كنت تستخدم هذه السجلات بالطريقة التي تم وضعها (على ما يبدو) من قبل المصممين ، فسيكون من المستحيل تحقيق هذا التأثير:


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

في المقابل ، التمرير الأفقي الجزئي محدد بالكامل وممكن.


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

أنواع الرسومات


تحتوي وحدة التحكم NES على نوعين من الرسومات:

  • العفاريت هي بلاطات يمكن وضعها في أماكن تعسفية على الشاشة ويتم نقلها بشكل مستقل عن بعضها البعض.
  • الخلفية - شبكة من البلاط يمكن تمريرها بسلاسة كصورة واحدة.

لإظهار الفرق بين الاثنين ، سأعرض مشهدًا يتكون من العفاريت والخلفية:


وهنا هو نفس المشهد الذي تظهر فيه العفاريت فقط:


وهنا مشهد تظهر فيه الخلفية فقط:


التمرير


يدعم معالج الصور (NES Picture Processor) تمرير صور الخلفية. في ذاكرة الرسومات ، يتم تخزين الرسم البياني للخلفية كشبكة ثنائية الأبعاد من البلاط تغطي مساحة تبلغ ضعف عرض وارتفاع الشاشة.

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

يبلغ حجم إشارة الفيديو NES الناتجة 256 × 240 بكسل. يتم تمثيل شبكة البلاط داخل الذاكرة بمساحة 512 × 480 بكسل وتنقسم إلى أربعة مستطيلات بحجم الشاشة تسمى "جداول الاسم". يمكن للألعاب تكوين وحدة معالجة الصور (PPU) من خلال الإشارة إلى موضع النافذة المرئية عن طريق تحديد إحداثيات البكسل في شبكة جداول الأسماء.

عند تحديد الإحداثيات (0 ، 0) ، سيتم عرض الجدول العلوي الأيسر بالكامل من الأسماء على الشاشة:


بالانتقال إلى (125 ، 181) ، سنرى قليلاً من كل جدول أسماء:


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


لا توجد ذاكرة كافية!


يبلغ حجم كل جدول أسماء 1 كيلوبايت ، ولكن NES يخصص فقط 2 كيلوبايت من ذاكرة الفيديو الخاصة به لهذه الجداول ، لذلك يمكن تخصيص جدولين فقط للذاكرة في كل مرة.

كيف يمكن أن يكون لها أربعة جداول أسماء؟

النسخ المتطابق جداول الاسم


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

تعرض هذه الصورة لقطة من محتويات الجداول الأربعة. أعلى اليسار وأعلى اليمين هما نفس السفلية.


فلماذا لا تحتفظ بجدولين للاسم؟

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


هناك أيضًا تكوين ممكن آخر - "Horizontal Mirroring" ، تستخدمه الألعاب للتمرير العمودي.


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

خراطيش


تحتوي خرطوشة كل لعبة على أجهزة تسمح لك بتكوين النسخ المتطابق للجدول.


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

مثال حقيقي



مثال على التمرير العمودي الذي يتم عرضه على الشاشة.


هذا يدل على سجل جداول الاسم مع النسخ المتطابق الأفقي. يتم تمييز النافذة المرئية حاليًا.

تذكر أن التمرير العمودي ليس بالأمر غير العادي - الشيء غير العادي هو التمرير العمودي باستخدام شاشة مقسمة .

تقسيم الشاشة


يتم تقديم كل إطار لإشارة الفيديو التي تم إنشاؤها بواسطة NES من أعلى إلى أسفل ، صف واحد من البكسل في كل مرة. في كل صف ، يتم رسم البكسل واحدًا تلو الآخر ، من اليسار إلى اليمين. عند منتصف الإطار عند تقديم الإطار ، يمكن للعبة إعادة تكوين وحدة PPU ، مما يؤثر على عرض البكسل التي لم يتم تقديمها بعد. أحد أكثر التغييرات شيوعًا في منتصف الإطار هو تحديث موضع التمرير الأفقي.



عند التمرير أفقيًا بين الغرف ، يبدأ The Legend of Zelda دائمًا من موضع التمرير (0 ، 0) ويعرض عناصر الواجهة في الجزء العلوي من الشاشة. بعد رسم السطر الأخير من بيكسلات الواجهة على الشاشة ، يتغير التمرير الأفقي بقيمة تزيد مع كل إطار ، وبالتالي تتحرك الكاميرا بسلاسة.

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

تقديم القياس


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

هناك تقنية أخرى أكثر دقة تسمى Sprite Zero Hit.

يمكن أن تقدم NES ما يصل إلى 64 نقرة في وقت واحد. يسمى العفريت الأولى في ذاكرة الفيديو Sprite Zero (صفر العفريت). في كل إطار ، بمجرد تركيب بكسل معتمة من صفر sprite على بكسل خلفية معتمة ، يحدث حدث Sprite Zero Hit. يعين قليلاً في أحد سجلات PPU مع تعيين الذاكرة ، والتي يمكن التحقق من قبل المعالج.

لاستخدام Sprite Zero Hit لتقسيم الشاشة ، تضع الألعاب صفر sprite في وضع عمودي بالقرب من حدود التقسيم ، وخلال العرض يتم التحقق باستمرار لمعرفة ما إذا كان حدث Sprite Zero Hit قد حدث. إذا كان الأمر كذلك ، فإن اللعبة تنتقل من التمرير الأفقي إلى تنفيذ الفصل.

يظهر أدناه الانتقال الأفقي بين الغرف ذات الخلفية وبدونها.




الدائرة البنية التي تظهر في بداية المرحلة الانتقالية وتختفي في نهايتها ، هي عبارة عن نقطة الصفر. سنلقي نظرة فاحصة على الواجهة مع وبدون خلفية:



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

لاحظ أن Sprite Zero Hit يحدث بضعة أسطر من وحدات البكسل قبل السطر السفلي للواجهة. يحدث في أعلى بكسل من فتيل القنبلة ، والذي هو 16 بكسل من أسفل الواجهة. عند حدوث Sprite Zero Hit ، تبدأ اللعبة في حساب دورات المعالج ، وبعد الانتهاء من العدد المطلوب من الدورات ، تقوم بتعيين التمرير الأفقي.

شعاع الطمس


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

سجل التمرير


تقوم الألعاب بتغيير موضع التمرير عن طريق الكتابة إلى سجل PPU المسمى PPUSCROLL ، والذي يقوم بتعيين عنوان الذاكرة 0x2005 . تعرّف عملية الكتابة الأولى في PPUSCROLL المكون X من موضع التمرير ، بينما تقوم العملية الثانية بتعيين المكون Y. وبالمثل ، يتم إجراء تسجيل بديل.

يعرض التالي جميع عمليات الكتابة غير الصفرية في PPUSCROLL أثناء هذا التشغيل (البطيء) 16 إطارًا من الشاشة مع مؤامرة اللعبة. يتم زيادة مكون موضع التمرير Y كل إطارين. يتم تنفيذ جميع عمليات الكتابة في PPUSCROLL في هذا المثال أثناء vblank ، مما يؤدي إلى الخلفية بأكملها للتمرير معها.




التمرير تقسيم الشاشة


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




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

ومع ذلك:



صدق أو لا تصدق ، لم تتغير قيمة سجل PPUSCROLL أثناء هذا الانتقال.

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

التدخل في السجلات الأخرى


يتم استخدام السجل الثاني ، المسمى PPUADDR ، المعين على عنوان الذاكرة 0x2006 ، لتعيين عنوان ذاكرة الفيديو الحالي. عندما تريد إحدى الألعاب ، على سبيل المثال ، تغيير أحد PPUADDR الموجودة في جدول الاسم ، فإنها تكتب أولاً عنوان ذاكرة الفيديو PPUADDR إلى PPUADDR ، ثم تكتب القيمة الجديدة PPUDATA إلى PPUDATA - وهذا هو السجل الثالث المعين لمعالجة 0x2007 .

الكتابة إلى PPUADDR وليس أثناء vblank (أي عند تقديم إطار) يمكن أن تسبب القطع الأثرية الرسومية. وذلك لأن سلسلة PPU ، التي تتأثر بالكتابة إلى PPUADDR ، يتم التحكم فيها مباشرة أيضًا بواسطة جهاز PPU أثناء عملية الحصول على مربعات من ذاكرة الفيديو PPUADDR . نظرًا لأن عملية التقديم إلى الشاشة يتم تنفيذها من أعلى إلى أسفل ، ومن اليسار إلى اليمين داخل السطر ، تقوم وحدة PPU بشكل أساسي بتعيين PPUADDR قيمة عنوان PPUADDR الحالي PPUADDR رسمه. عندما ينتقل العرض من PPUADDR إلى آخر ، فإن PPUADDR بالقيمة الحالية.

وبالتالي ، يمكن للكتابة على PPUADDR في منتصف الإطار تغيير PPUADDR التي تلقاها PPU من الذاكرة لمدة الإطار الحالي.

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




نمط مرئيا بوضوح. كل إطارين ، يتم تقليل العنوان المسجل في سطر البكسل 63 بمقدار 32 (0x20). ولكن كيف يؤدي هذا إلى تحديث في موضع التمرير الفعلي؟

سجل التمرير الحقيقي


داخل PPU هناك سجل 15 بت غير معين إلى وحدة المعالجة المركزية. يتم استخدامه كل من العنوان الحالي للوصول إلى ذاكرة الفيديو وكتكوين التمرير في الخلفية.

عند العمل باستخدام هذه القيمة كعنوان ، يتم تجاهل البتة 14 ، ويتم التعامل مع البتات من 0 إلى 13 كعنوان في ذاكرة الفيديو.

عند العمل باستخدام هذه القيمة كتكوين تمرير ، يكون لأجزاءها المختلفة معان مختلفة:


تحديد جدول الاسم هو قيمة من 0 إلى 3 تحدد جدول الاسم الحالي الذي يتم منه الرسم.

التمرير الخشن في X والتمرير الخشن في Y يحددان تنسيق التجانب داخل جدول الأسماء المحدد. هذا هو البلاط الحالي لرسم.

يحتوي التمرير الدقيق على طول Y على قيمة من 0 إلى 7 ، والتي تحدد الإزاحة الرأسية الحالية لخط البكسلات داخل التجانب الحالي. البلاط هو مربعات مع جانب من 8 بكسل.

التمرير الدقيق على X غائب في هذا السجل. يوجد سجل منفصل يحتوي فقط على الإزاحة الأفقية للبكسل الحالي ، ولكن ليس من المهم شرح كيفية تنفيذ التمرير العمودي في The Legend of Zelda.

ماذا يحدث لهذا السجل عندما تكتب لعبة إلى PPUADDR ؟ فيما يلي أول ثلاث عمليات كتابة من العرض التوضيحي الموضح أعلاه.


عن طريق تقسيم الإدخالات في العنوان إلى مكونات التمرير ، يمكنك أن تفهم بوضوح ما يحدث هنا. في كل إطارين ، تنخفض قيمة التمرير Rough في Y ، مما يؤدي إلى التمرير العمودي بواسطة تجانب واحد أو 8 بكسل.

خلال كل إطار ، تكون إزاحة التمرير الأولي هي 0.0 ، وبعد ذلك يتم التسجيل على خط البكسل 63 على العنوان. هذا يعني أن أول 63 خطًا من وحدات البكسل يتم رسمها من أعلى جدول الاسم المحدد الذي يحتوي على خلفية الواجهة. ومع ذلك ، يتم تقديم الصف 64 من البكسل مع التمرير العمودي المطبق من هذا العنوان. نظرًا لأن التمرير العمودي يتناقص كل إطارين ، فإنه يعطي شعورًا بالتمرير العمودي لجزء من الشاشة.

انتقل لأسفل للتمرير لأعلى


لا يمكن لـ Legend of Zelda إخفاء هذه الخدعة عن اللاعبين تمامًا. يخلق قطعة أثرية مرئية على التحولات الرأسية للشاشة ، والتي تكون ملحوظة إذا نظرت عن كثب. عند التنقل بين الغرف ، سيتم تمرير الإطار الأول للرسوم المتحركة للتمرير لأسفل. هنا هو الرسوم المتحركة في حركة بطيئة جدا.



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

يتم تنفيذ التمرير العمودي عن طريق الكتابة إلى سجل PPUADDR في منتصف الإطار. القيمة الأولى المراد كتابتها هي 0x2800 . 0x23A0 لاحقًا ، 0x23A0 تسجيل 0x23A0 ، ثم تبدأ القيمة في الانخفاض بمقدار 32 كل إطار ثانٍ.


تؤدي كتابة القيمة 0x2800 إلى سجل 0x2800 إلى 0x2800 PPUADDR جدول PPUADDR على 2 ، مما يجعل جدول الاسم الأيسر السفلي. نظرًا لأن كلتا قيمتي التمرير تساوي 0 ، فسيبدأ من الجزء العلوي الأيسر من جدول الاسم هذا. ومع ذلك ، التمرير الدقيق في Y هو 2 ، لذلك هناك إزاحة رأسية ثنائية بكسل من أعلى جدول الاسم الأيسر السفلي. هذا هو السبب في الإطار الأول للانتقال ، نرى شريطًا أسودًا يصل ارتفاعه إلى 2 بكسل في أسفل الشاشة. يتم تحريك قيمة التمرير الأولية للرسوم المتحركة الانتقالية بمقدار 2 بكسل لأسفل لجعل الانتقال سلسًا.

PPUADDR لاحقًا ، PPUADDR كتابة PPUADDR إلى 0x23A0 . هذا يعيدنا إلى الجدول العلوي الأيسر من الأسماء ، ونعرضه من الصف التاسع والعشرين من البلاط ، أي الأسفل. التمرير الدقيق في Y لا يزال يحتوي على 2.

لماذا من الضروري ضبط التمرير الدقيق في Y إلى 2؟ لماذا لا تكتب اللعبة فقط 0x0800 و 0x03A0 حتى لا تعاني من إزاحة ثنائية بكسل؟

تشغل أربعة جداول أسماء مساحة 4 كيلو بايت في مساحة عنوان PPU ، من 0x2000 إلى 0x2FFF . يشغل كل مربع في الجدول بايت واحد من ذاكرة الفيديو (في الحقيقة ، إنه مجرد فهارس في جدول آخر) ، وترتيب الجداول وجداول الأسماء في ذاكرة الفيديو يجعل اختيار جدول الأسماء ، التمرير الخشن بواسطة Y و Coarse للتمرير بواسطة X يشكلان إزاحة التجانب داخل مناطق الذاكرة مع جداول الاسم. وهذا يعني ، بأخذ 12 بت أقل من سجل PPU الداخلي وإضافتها إلى 0x2000 ، يمكنك العثور على عنوان 0x2000 في ذاكرة الفيديو. وهذه ليست صدفة! هذا هو بالضبط كيفية التعامل مع السجل: كسجل عنوان وكسجل تمرير.

ولكن هناك عيب واحد.

عند المعالجة كسجل عنوان ، تعتبر البتات 12 و 13 جزءًا من العنوان. أثناء التقديم ، تقوم وحدة PPU بالكتابة فوق السجل مع عنوان التجانب الحالي المعروض. نظرًا لأن 0x2000 موجودة في جداول الأسماء ، وتقع الجداول في منطقة الذاكرة من 0x2000 إلى 0x2FFF ، تعيّن PPU القيم من هذا الفاصل الزمني إلى السجل.

عندما تكتب اللعبة إلى PPUADDR في منتصف الإطار ، إذا لم تكتب عنوان التجانب في جدول الاسم ، فستحاول PPU القراءة من مكان آخر في ذاكرة الفيديو. سيتم اعتبار أي بايت يصادف أنه يُعتبر بلاطات ، والتي من المحتمل أن تؤدي إلى نتائج غير مرغوب فيها. لذلك ، يجب أن تكون جميع القيم المسجلة في منتصف الإطار في PPUADDR في النطاق من 0x2000 إلى 0x2FFF . مع أخذ كل رقم في هذا الفاصل الزمني ومراعاة مكونات التمرير الخاصة به ، يجب أن تكون قيمة التمرير الدقيق في Y مساوية دائمًا للقيمة 2.

يعني هذا القيد أننا لا نستطيع تغيير التمرير الدقيق في اتجاه Y في منتصف الإطار ، أي عند استخدام هذه الخدعة لتنفيذ التمرير الرأسي لفصل الشاشة ، فنحن مقيدون بالتمرير بمقدار 8 بكسل في المرة الواحدة ويكون لدينا دائمًا إزاحة رأسية ثنائية بكسل من حد التجانب. يتحرك Legend of Zelda بمقدار 4 بكسل لكل إطار عند التمرير أفقيًا ، ولكن 8 بكسل لكل إطار عند التمرير عموديًا ، والآن نعرف السبب.

يُمكن أيضًا ملاحظة القطع الأثرية عند التمرير بين الغرف لأسفل ، ولكن في هذه الحالة ، يحدث ذلك في نهاية الرسوم المتحركة.



قراءة إضافية


  • يعد NesDev Wiki مورداً لا يقدر بثمن للتعرف على أجهزة NES. على وجه الخصوص ، موضوع هذا المنشور عبارة عن صفحات حول التمرير PPU
    و PPU السجلات .
  • بلدي لا يزال غير مكتمل جدا محاكي NES متاح هنا .

الملاحظات


حتى اكتشفت حول السجل الداخلي لـ PPU ، أظهر المحاكي تأثير المحو أثناء التحولات الرأسية لشاشة The Legend of Zelda.



انتقلت عتبة Link إلى أسفل الشاشة ، كما ينبغي أن تكون ، ولكن الخلفية لم يتم التمرير. كان السبب وراء هذا المحو هو أن اللعبة قامت بتحديث جدول الأسماء تدريجياً بحيث تحتوي على رسومات الغرفة الجديدة ، لكنها لم تقم بتحديث التمرير لإبقاء التحديثات خارج الشاشة.

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


All Articles