سؤال

ما هي أفضل طريقة لاكتشاف الاصطدامات في لعبة ثنائية الأبعاد؟أنا أعمل حاليًا في allegro وG++

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

المحلول

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

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

مع وجود كميات كبيرة من الكيانات لاختبار الاصطدامات، قد ترغب في التحقق من وجود ثماني.يمكنك ببساطة تقسيم العالم إلى قطاعات، ثم التحقق فقط من وجود تصادم بين الكائنات الموجودة في نفس القطاعات.

لمزيد من الموارد، يمكنك الذهاب إلى sourceforge والبحث عن محرك Bullet Dynamics وهو محرك مفتوح المصدر للكشف عن التصادمات والفيزياء، أو يمكنك التحقق من ذلك http://www.gamedev.net التي تحتوي على الكثير من الموارد حول موضوعات تطوير اللعبة الغزيرة.

نصائح أخرى

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

بالنسبة لأليجرو هناك كوليجرو.لSDL هناك SDL_Collide.h أو SDL-تصادم.يمكنك استخدام I_COLLIDE مع برنامج OpenGL.يحتوي DarkBASIC على نظام تصادم مدمج، و الفيزياء المظلمة لتفاعلات دقيقة للغاية بما في ذلك الاصطدامات.

استخدم مكتبة، أوصي Box2D

هذا السؤال عام جدًا.هناك العديد من الطرق لاكتشاف الاصطدام في لعبة ثنائية الأبعاد.سيكون من المفيد معرفة ما تحاول القيام به.

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

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

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

يعد تنفيذ نظام الكشف عن الاصطدام أمرًا معقدًا، ولكن عليك أن تأخذ في الاعتبار ثلاث نقاط.

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

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

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

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

تصادم بين ماذا؟يعتمد الأمر على ما إذا كنت تستخدم النقوش المتحركة، أو المضلعات المقعرة، أو المضلعات المحدبة، أو المستطيلات، أو المربعات، أو الدوائر، أو النقاط...

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

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

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