تقديم خريطة ثنائية الأبعاد في لعبة - زراعة وتمرير

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

  •  28-09-2019
  •  | 
  •  

سؤال

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

backbuffer

كان لدى NES قيود على nametable ، أو backbuffer. على سبيل المثال ، يكون Backbuffer 256 × 240 بكسل كبير ، أو حجم شاشة واحدة. إذا وجهت هذا إلى التلفزيون ، فسيملأ الشاشة تمامًا. الآن ، إذا وجهت هذا إلى الشاشة مع إزاحة x = 5 ، فسيتم تحويل الصورة بأكملها وستلف حول الشاشة.

فمثلا.....

ORIGINAL, NO OFFSET:                      DRAWN WITH OFFSET OF X=5:
ABCDEFGHIJK                               GHIJKABCDEF

DRAWN WITH OFFSET OF X=-5:
FGHIJKABCDE

يتم تقسيم الشاشة إلى مربعات 8 × 8 بكسل لكل منها ، حيث بلغ مجموع صفوف وأعمدة 32 × 30. (256x240 بكسل). يتم تمثيل الإزاحة في وحدات البكسل - وليس الأعمدة ؛ من الناحية النظرية ، كان بإمكاني تعويض الشاشة بمقدار 5 بكسل وسيتم تحويل كل عمود إلى اليمين بمقدار خمسة بكسل.

تصميم المستوى

تتكون مراحل من شاشات ، تحتوي على بيانات ممثلة في صفوف وأعمدة 16 × 15 ، كل منها 16 × 16 بكسل. هذا هو محاكاة عدد بيانات مستوى ألعاب NES المخزنة - كل بلاط يحمل معلومات حول ما يجب أن يكون في كل كتلة 8x8.

على سبيل المثال:

AA
BC     with A,B,C,D representing what 8x8 graphic should go where

ويمثل تصميم المستوى هذا أيضًا ، حيث يكون كل رقم شاشة مختلفة - ولا يعني شيئًا ، لا ، لاغية.

-----
-123-
---4-
--54-
-----

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

مع هذه المعلومات ، يمكنني بسهولة معرفة الأعمدة الموجودة على اليسار واليمين من الحرف ، إن وجدت (إذا كانت الحرف في الجانب الأيسر من الشاشة 1 ، لا يوجد مستوى مزيد من اليسار)

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

ومع ذلك ، فإن المشكلة التي أواجهها من الناحية النظرية هي أنني بحاجة إلى "دفق" بيانات المستوى على الشاشة. هذا ، دعنا نقول أن الشخصية تتحرك 24 بكسل إلى اليمين. يحتاج BG إلى التحرك أيضًا.

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

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

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

تحرير: باستخدام vb.net. C# قابلة للتطبيق أيضًا (برنامج I في كليهما)

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

المحلول

الطريقة التي فعلت بها NES مع 4 جداول الأسماء ، كل 256x240. عندما قمت بالتمرير واحد من الشاشة ، فإن الشخص المجاور يمكنه التمرير عليه. للحصول على "عوالم" أكبر من 512 × 480 ، يمكنك تحديث جدول الاسم في المواضع التي تكون خارج الشاشة.

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

لذلك في الواقع ، يجب أن يكون المخزن المؤقت لظهرك 512 × 480 ، ولا تعرض سوى جزء 256x240 منه.

هل نظرت إلى تفكيك أي ألعاب NES التي لديها عوالم تمرير كبيرة؟ أعتقد أن التفكيك الجزئي لـ Metroid موجود في مكان ما ...

... نعم ، وجدت بعض المستندات في romhacking.net

metroid تفكيك; ؛ لم يتم التعليق جيدًا ولكن مع القليل من الجهد ، لا ينبغي أن يكون من الصعب للغاية اكتشاف ذلك.

تفكيك آخر تم التعليق بشكل أفضل.

تحرير: في التفكيك الثاني المنشور أعلاه ، انظر إلى metroidgameenginepage.txt في روتين "Setuproom" وروتين "Drawroom" ؛ كما يوضح الروتين في Label Leb4D كيفية تحديث جدول الاسم في حالة واحدة. انظر أيضًا إلى التعليقات الواسعة فوق روتين "getNametable". بشكل عام ، سوف يجعلك البحث عن "جدول الاسم" في جميع أنحاء المستند أكثر من ذلك.

تحرير: أيضا في romhacking.net ؛ ال خريطة الذاكرة ل SMB من الممكن ان يكون مفيدا.

نصائح أخرى

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

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