يجب أن تعتمد الألعاب على معدل الإطار فقط؟

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

  •  05-09-2019
  •  | 
  •  

سؤال

أود اقتراحك حول هذه المشكلة ...

لجعلها بسيطة، سوف أفكر فقط المحور x.

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

بعد استدعاء أول التحديث، أصبح موقعه الآن 90 عاما وهناك كائن آخر من نفس الحجم في الموضع 120.

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

الآن يأتي سؤال بسيط ...

ماذا تفعل في هذه الحالة؟

تفعل شيئا مثل:

Position start = destinationPos - currentPos;
for (int i; i < start; i++)
    if (IsColliding(movingObj.Position + i, staticObj))
        //do the colliding stuff here

أنا لا أحب هذا الحل، قد يكون بخير لهذه الحالة، ولكن ماذا لو كان لديك X، Y، Z والكثير من الأشياء المتحركة؟

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

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

ما اعتقد يا رفاق؟

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

المحلول

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

إذا لم تكن مهتما بشكل خاص في تنفيذ خوارزميات التصادم Deteciton بنفسك، فسأبحث في استخدام مكتبة تقوم بهذا النوع من الشيء بالفعل:

واحدة من العديد من الكتب الجيدة حول هذا الموضوع كشف الاصطدام في الوقت الحقيقي.

نصائح أخرى

لمس مايك دانيلز على هذا، لكن إجابتك لا: لا تريد أن تعامل كائناتك على أنها تتحرك في "رشقات" منفصلة. دعنا نتحمل مثالا في 1D: تبدأ السيارة في X = 0، وتسارع 2 وحدة / ثانية ^ 2 في الاتجاه الأمامي. لن إعادة حساب السرعة والموقف في كل إطار. بدلا من ذلك، ستعمل استخدام بعض التفاضل والتكامل البسيط: السرعة هي جزءا لا يتجزأ من التسارع، والموضع هو جزء من التسارع. وهكذا v = 2*t و p = t^2. وبعد كل ما تفعله بعد ذلك هو بديلا عن ر ومقدار الوقت الذي مر الوقت منذ الشرط الأولية.

افترض الآن أن لديك كائن ثان في الموضع 100، وتسريع في 3 وحدات / ثانية ^ 2. ثم سرطتها هي -3*t وموقفها هو 100 - (3/2)*t^2. وبعد حل عندما تكون المراكز 2 تساوي بعضها البعض، يمكننا أن نرى أنها تصطدمت عندما تي = 40.

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

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

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

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