كيف كانت الألعاب الأكبر سنا كشف الاصطدام بالجدران والأرضيات والسقوف؟

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

  •  13-09-2019
  •  | 
  •  

سؤال

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

أعتقد أن سؤالي هو، بالنظر إلى مستوى يتكون من بلاط فقط، كيف اكتشفوا الاصطدامات مع الجدران والأرضيات في ألعاب مثل ماريو ومجامان التي كانت لديها القليل من قوة المعالجة؟

  • هل اتبعوا طريق الحركة وتحديد أقرب بلاط الاتصال؟ (قليلا من البحث) (مسبق)
  • هل حددوا تصادما مع الأرض، ثم اكتشف أفضل طريقة لضبط الشخصية؟ (الخلفي) هذا محفوف بالمخاطر مع الطوارئ المتغيرة، يمكنك القفز من خلال البلاط إذا كنت سريعة بما فيه الكفاية. على الرغم من أنني أفترض أن TimeSteps NES Games تم مزامنة مع معدل تحديث التلفزيون.
  • هل الجاذبية تؤثر دائما على شخصيتك عندما تكون على الأرض؟ أو هل فقط "إيقاف تشغيله" عندما تكون مصمما على المشي على البلاط؟ ماذا عن عندما تمشي حافة الهاوية؟ كنت بحاجة إلى نوع من طريقة تحديد البلاط أسفلك خلاف ذلك.
  • إذا كنت قد اصطدمت بالبلاط، فهل تجد فقط حافة هذا البلاط ونقل شخصيتك إلى جانبها (اعتمادا على اتجاه السفر)؟
  • ماذا عن البلاط المنحدر مثل في Metroid السوبر ماريو؟
  • ماذا عن "المنصات" حيث يمكنك القفز من خلال أسفل والأرض على القمة. كيف تتعامل مع التصادمات مع هذه البلاط إذا كنت تفعل ذلك "الخلفي"؟

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

على سبيل المثال، رمز للتحقق من تصادمات البلاط للتحرك إلى أسفل (أتحقق من الردود ثم الحركة الأفقية):

  def tile_search_down(self, char, level):
        y_off = char.vert_speed
        assert y_off > 0

        # t_ are tile coordintes
        # must be int.. since we're adding to it.
        t_upper_edge_y = int( math.ceil((char.y+char.h) / self.tile_height ) ) #lowest edge
        while (t_upper_edge_y*self.tile_height) < (char.y+char.h+y_off): # lowest edge + offset

            t_upper_edge_x = int( math.floor(char.x/self.tile_width) )
            while (t_upper_edge_x*self.tile_width) < (char.x+char.w):

                t_x = t_upper_edge_x
                t_y = t_upper_edge_y 
                if self.is_tile_top_solid(t_x, t_y, plane):
                    char.y = t_y*self.tile_height - char.h
                    char.vert_speed = 0.0
                    char.on_ground = True
                    return

                t_upper_edge_x += 1
            t_upper_edge_y += 1

        char.y += y_off
هل كانت مفيدة؟

المحلول

لأنواع ألعاب NES-ERA التي تتحدث بها، كان كل شيء ثنائي الأبعاد. هذا وحده يبسط العديد من الأشياء.

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

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

بالنسبة للنباتات، ستحقق عادة لمعرفة ما إذا كانت الحرف "مؤرض" قبل تطبيق الجاذبية.

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

نصائح أخرى

هناك مقال هنا نظرة متعمقة على برمجة لعبة النظام الأساسي لنظام Nintendo Entertainment (NES) ".

ربما لم أكن جوجينج لأنني لم تعثر على هذه المقالة من قبل.

بالنسبة للألعاب مثل World Super Mario World (SNES)، تخزن اللعبة المستويات بتنسيق ذاكرة جعل من السهل أخذ موقع Mario's X / Y، وتحويله إلى عنوان البلاط، ثم تحقق من البلاط على الفور حول هذا العنوان. نظرا لأن المستويات كانت دائما عرضا ثابتا (على الرغم من أن المنطقة التي يمكنك عرضها متنوعة)، فإنها جعلت معالجة أسهل للإدارة لأنها كانت دائما إزاحة ثابتة من موضع ماريو، مثل العنوان + 1 للبلاط بجانب ماريو، عنوان + 0x300 ل البلاط تحتها، إلخ.

في الكشف عن تصادم الألعاب الأكبر سنا في كثير من الأحيان أقل من دقة التداول المثالية للأداء.

على سبيل المثال، في Super Mario Bros. التصادم مع الأعداء يتم التحقق فقط من كل إطار آخر. يتم التصادم مع عمود العلم نهاية المستوى مرة واحدة فقط كل 27 إطارات. هناك أيضا حد كبير في الحد الأقصى لعدد الكائنات التي تم فحصها للتصادم، والتي تتيح لك الشهيرة تمر عبر بعض هجمات المتصفح في نهاية اللعبة دون وفاة.

مثال آخر هو منفذ محرك الكمبيوتر الشخصي من Gradius. بدلا من استخدام الكشف عن صندوق تحطيم أكثر تكلفة، فإنه يستخدم نظام البلاط. يتم تقليل كل كائن إلى رقم البلاط، وتتألف من الموضع x و y تقريب إلى مضاعف من 8 وتسلوحا في رقم واحد. إذا شغل كائنين نفس البلاط 8x8، فإنها تعتبر اصطدمت. إنه أقل دقة ولكن يميل إلى صالح اللاعب، لذلك يعرض حل وسط مقبول وممتع.

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