سؤال

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

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

ليس لدي سؤال محدد حقا، لكن أبحث عن نصائح أو بعض البرامج التعليمية المفيدة. كل ما تمكنت من العثور عليه حتى الآن فقط تغطية التقاطعات المستطيلية.

أنا أستخدم XNA إذا كان يحدث أي فرق.

شكرًا،
كاميرون

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

المحلول

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

هناك حلولان لهذا:

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

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

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

نصائح أخرى

من المقبول عموما أنه بسبب TIMESTEP ستقوم تصادمك بتقاطع نقطة مقبولة بين التحديثات.

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

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