اشتباهات رایج در استفاده از ایونتهای کانستراکت 2
|حلقهی For-each غیر لازم
در بسیاری از مواقع حلقهی For-each خیلی مفید است، امّا اغلب درجایی استفاده میشود که تغییری ایجاد نمیکند. نحوهی عملکرد ایونتها به این صورت است که ابتدا کاندیشنها برای تکتک اینستنسها بررسی میشوند و بعد اکشنها برای هر اینستنسی[1] که آن شرط برایش برقرار باشد اجرا میشوند. پس طبق این جمله، موتور کانستراکت 2 از قبل یک حلقهی for-each به صورت خودکار دارد، تا به شما کمک کند ایونتها آن طور که انتظار دارید عمل کنند. برای مثال ایونت زیر را در نظر بگیرید:
کانستراکت 2 اینگونه ایونت بالا را اجرا میکند: برای هر هیولایی که دارد شکار میشود، زاویهاش را به سمت مکان پلیر تنظیم کن. با این حال گاهی میبینیم بعضیها از ایونتی مشابه زیر استفاده میکنند:
در این مورد استفاده از حلقهی For each زاید است. این نشاندهندهی فهم نادرست از نحوهی عملکرد ایونتهای کانستراکت 2 است. این کار اصلاً معنای ایونت را تغییر نمیدهد، کانستراکت 2 به صورت خودکار این را انجام میدهد. این کار دو عیب دارد: اوّلاً اینکه استفاده از ایونتهایی که اثری در بازی نمیگذارند گیجکننده است، ولی نگرانی اصلی در این مورد عملکرد بازی است. حلقهی for-each داخلی خود کانستراکت 2 در سطح جاوااسکریپت به طور مستقیم اجرا میشود؛ حلقههای for-each که در ایونتشیت بازی وجود دارند نیز روی آن اجرا میشوند، که باعث میشود پردازش CPU بسیار بیشتر شود، در حالیکه سازندگان کانستراکت 2 به سختی کار کردهاند تا بازی را بهینه کنند، این کار زحماتشان را بر باد می دهد، پس در مواقع غیر ضروری اصلاً نباید از for-each استفاده کرد.
پس کی از حلقهی for-each استفاده کنیم؟ فقط وقتی که حلقهی خود انجین به تنهایی کافی نباشد، معمولاً زمانی که میخواهیم همهی اکشنها به ازای هر کدام از اینستنسها به طور جداگانه اجرا شوند، نه فقط اکشنهای مربوط به آن شیء. اغلب زمانی از این حلقه استفاده میکنیم که میخواهیم کاندیشنها یا اکشنهای سیستمی به ازای هرکدام از اینستنسها یکبار اجرا شود (که در حالت عادی کلّاً یکبار اجرا میشوند، زیرا فقط یک اینستنس از شیء System وجود دارد). برای مثال، اگر در ایونت بالا یک اکشن سیستمی برای کم کردن مقدار یک متغیّر اضافه کنیم (Subtract from)، افزودن for-each به آن، عملکرد ایونت را تغییر میدهد. بدون این حلقه، هر وقت که ایونت اجرا شود، بدون توجّه به اینکه چند اینستنس از هیولا پیک شدهاست، فقط یک بار از مقدار متغیّر کم میشود؛ با وجود این حلقه، آن اکشن سیستمی به ازای هر کدام از هیولاها یکبار اجرا میشود، یعنی کم شدن مقدار متغیّر به تعداد هیولاهایی که پیک شدهاند بستگی دارد. مطمئناً در اینجا این حلقه مفید است، امّا مواردی که در آنها استفاده از حلقهی for-each مفید است خیلی کم تر از آن است که کاربران فکر میکنند. در اغلب موارد نیازی به استفاده از این حلقه نیست.
[1] این عبارت، حلقهی For each instance به معنی «برای هر اینستنس» را تداعی میکند.
سلام وخسته نباشید به داداش گلم اقامجتبی
من 2تابازیکن دارم که میخوام به هرکدوم یک ماموریت مخصوص بدم که هرکدوم وظیفه داده شده راانجام بده. به طور واضح تربگم میخوام وقتی به پلیر Aماموریت دادم به ماموریتش به پردازه و درهمان زمان من پلیر Bرا ماموریت بدم
ایشالا جوابمو بگیرم
علیک سلام
لطفاً سؤالاتتون رو در انجمن بپرسید.
سلام خسته نباشید
میخواستم بدونم چگونه stop و play برای بازی ام بسازم؟؟؟
ممنون
علیک سلام،
میتونید جلسهی ششم دورهی تابستانی ما رو ببینید:
http://construct2.ir/showthread.php?tid=609
خواهش میکنم