سباق لعبة سباق، سيارة تتحرك بشكل أسرع على الكمبيوتر أسرع

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

  •  18-09-2019
  •  | 
  •  

سؤال

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

أظن أن لدي نفس المشكلة باستخدام أي مكتبة ... هذه هي المرة الأولى لي في الوقت الحقيقي أشياء مثل هذا.

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

المحلول

أظن رمزك الحالي يبدو بطريقة أو بأخرى

 // to be called every frame
 void OnEveryFrame()
 {
     MoveCar();
     DrawCarToScreen();
 }

ولكن ينبغي أن يكون مثل هذا:

 // to be called - for example - 50 times per second:
 void OnEveryTimerEvent()
 {
     MoveCar();
 }

 // to be called every frame
 void OnEveryFrame()
 {
     LockTimerEvents();
     DrawCarToScreen();
     UnlockAndProcessOutstandingTimerEvents();
 }

يجب عليك إعداد حدث وفقا للموقت، بالطبع.

نصائح أخرى

تحريك السيارة وفقا ل Timers وليس Framerate. يجب أن يكون نموذج السيارة مستقلا عن تمثيل العرض.

يمكنك حل هذا باستخدام أجهزة ضبط الوقت الدقيقة والسيارات الرياضيات.

لذلك، من أجل الحجة، يتيح اقتراح يمكن استدعاء رمز الرسم الخاص بك في أي وقت في الوقت المناسب، على سبيل المثال 1 ثانية على حدة أو 3 ثاني ثانية أو 0.02 ثانية.

خذ سرعة حركة السيارة لتكون 40 بكسل ثانية.

وبالتالي، فإن عدد بكسل يجب أن تتحرك هو (TIME_NOW - last_frame_time) * 40px.

يجب تقييد الحركة من خلال تأخير وقت "حقيقي"، أي سيحرك السيارة بسرعة X Pixel في وقت الزمن.

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

تحتاج إلى غطاء إطارات Framerate To X في الثانية (60 إطارا في الثانية هو الأكثر شيوعا). هذه ميزة شائعة في معظم أطر الوسائط المتعددة، بما في ذلك SFML. ل sfml كنت أنظر إلى طريقة النافذة / renderwindow setframeratelimit (الحد الدولي غير المؤقت).

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

عليك أن تنقذ الوقت قبل نقل السيارات والرسومات.
توفير الوقت بعد جميع الحسابات.
حرك سيارتك بواسطة npixels / ثانية

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