ارسالها: 940
موضوعها: 56
تاریخ عضویت: مرد 1393
مکان: مشهد
سپاسها: 338
2562 سپاس گرفتهشده در 736 ارسال
سلام. روش استاندارد ساخت Pause، همون تایماسکال هست. اگه هم یه جاهایی از بازی با تایماسکال متوقّف نشد (که در بعضی مواقع اتّفاق میافته) میتونستید بپرسید و خیلی راحت به جوابش برسید.
حالا از این بگذریم، چیزی که در ایونتشیت بالا به نظر من مشکوکه و کار رو خراب میکنه، اینه که در هنگام توقّف Floor_Create_Time رو مساوی صفر قرار میدین و بعد از Resume شدن، اونو به مقدار قبلش بر میگردونید. این یک کار اضافی به نظر میرسه. به چه دلیل مقدارش رو صفر میکنید؟ اگه این کارو انجام ندین که مشکلی پیش نمیاد.
باز هم توصیه میکنم برای پاوس از تایماسکال استفاده کنید.
معجزات طبیعت هایی هستند که با آنها مأنوس نشدهایم
و طبیعت معجزهایست که با آن انس گرفتهایم
ارسالها: 277
موضوعها: 53
تاریخ عضویت: آذر 1393
سپاسها: 189
90 سپاس گرفتهشده در 63 ارسال
الان با موبایل ولی اره حق با تو هست به احتمال زیاد همون باید باشه
.
تایم اسکیل برای زمانه زمان مثل انیمیشن و... ولی من از اکشن move at angle استفاده کردم و distance. رو برابر متغیر عددی قرار دادم پس وقتی متوقف میشه که این مقدار صفر باشه و دلیلی نداره بعد از اسکیل تایم انجین دست به مقدار متغیر های ما بزنه
ارسالها: 940
موضوعها: 56
تاریخ عضویت: مرد 1393
مکان: مشهد
سپاسها: 338
2562 سپاس گرفتهشده در 736 ارسال
کلید رسیدن به استقلال از فریم ریت، اکسپرشن سیستمی dt است. dt مخفف delta-time میباشد. دلتا (∆) به معنی تغییر در یک کمیّت است، بنابراین دلتا تایم (t∆) یعنی تغییرات زمان از تیک قبلی تا حالا در واحد ثانیه (به زمان سپری شدن یک فریم در بازی تیک گفته میشود).
برای مثال dt در ۱۰۰FPS میشود 0.01 (یک صدم ثانیه)، و در 10FPS میشود 0.1 (یک دهم ثانیه)، در عمل، مقدار dt در هر تیک نسبت به تیک دیگر فرق دارد، پس بعید است که در مدّتی طولانی dt ثابت باقی بماند.
اگر یک متغیّر بسازید و تنظیم کنید در هر تیک (Every tick) به اندازهی dt به آن اضافه شود، آنگاه میبینید که در هر ثانیه یکی به آن اضافه میشود، زیرا جمع تمام زمانهای بین تیکها در یک ثانیه همان یک ثانیه میشود! (با افزودن dt به یک متغیّر به طور دستی میتوانید یک تایمر ایجاد کنید.)
در حالت عادی ایونتها در هر تیک یک بار بررسی میشوند، یعنی وقتی شما در ایونتی تنظیم میکنید یک شیء x پیکسل حرکت کند، در اصل در هر تیک x پیکسل حرکت میکند، حالا در حالت ایدهآل هر ۶۰ تیک یک ثانیه میشود، ولی به مجموع دلتاتایم در هر ثانیه (۶۰ تیک) فقط یکی اضافه میشه، بنابراین ۶۰ برابرش میکنیم، تا سرعت شیءتون با سرعت فعلی فرق نکنه.
معجزات طبیعت هایی هستند که با آنها مأنوس نشدهایم
و طبیعت معجزهایست که با آن انس گرفتهایم
ارسالها: 940
موضوعها: 56
تاریخ عضویت: مرد 1393
مکان: مشهد
سپاسها: 338
2562 سپاس گرفتهشده در 736 ارسال
خوب این یعنی استقلال از فریمریت، در حالت ایدهآل بازی 60FPS است. مثلاً اگه فریمریت بازی 60FPS باشه دلتاتایم میشه یکشصتم ثانیه، حالا مثلاً اگه ما تنظیم کردهباشیم dt * 60 پیکسل در هر تیک حرکت کنه، در هر تیک یک پیکسل حرکت میکنه و چون فریمریت ما 60FPS بود، هر ثانیه میشه شصت تیک و در نتیجه در هر ثانیه 60 پیکسل حرکت میکنه (یعنی با سرعت ۶۰ پیکسل بر ثانیه)
حالا در یک کامپیوتر ضعیف، که بازی رو با فریمریت مثلاً 10FPS اجرا میکنه، دلتاتایم میشه 0.1 ثانیه، حالا dt * 60 میشه 0.1 * 60 یعنی 6 پیکسل در هر تیک، چون فریمریت بازی 10FPS هست، هر ده تیک میشه یک ثانیه، در نتیجه شیء ما در هر ثانیه 60 پیکسل حرکت میکنه (یعنی باز هم با سرعت ۶۰ پیکسل بر ثانیه)
همون طور که دیدید، اگه بازی ما مستقل از فریمریت باشه، در هر کامپیوتر، چه قوی، چه ضعیف، با سرعت یکسان اجرا میشه، چون سرعت شیء در هر فریمریتی یکسان هست. ولی بازیهای وابسته به فریمریت در کامپیوترهای قوی سریعتر از کامپیوترهای ضعیف اجرا میشوند.
معجزات طبیعت هایی هستند که با آنها مأنوس نشدهایم
و طبیعت معجزهایست که با آن انس گرفتهایم
ارسالها: 940
موضوعها: 56
تاریخ عضویت: مرد 1393
مکان: مشهد
سپاسها: 338
2562 سپاس گرفتهشده در 736 ارسال
من نفهمیدم مشکلتون دقیقاً چیه. چون اینو که راحت میشه قبل از اینکه امتیاز رو صفر کنید اوّل تو اون متغیّر دیگه ذخیرهکنید، بعد امتیاز رو صفر کنید. اگه هم مشکل اینه که یک ایونت بیشتر از یکبار اجرا میشه، با یه Trigger once ساده میتونید حلش کنید.
معجزات طبیعت هایی هستند که با آنها مأنوس نشدهایم
و طبیعت معجزهایست که با آن انس گرفتهایم