Arvanttt

تند و سریع

Arvant

تند و سریع












فصل دوم :آشنایی با اکشن ها

چهارشنبه, ۲۳ مهر ۱۳۹۳، ۰۶:۲۳ ب.ظ

آشنایی با اکشن ها:

Action عبارت است از رفتار خاصی که ما برای رسیدن به  هدف مورد نظر  بر روی اسپرایت اعمال می کنیم .انجین cocos2d-x  از اکشن های متفاوتی پشتیبانی می کند که در پروژه نمونه می توانید آنها را مشاهده کرده و فراخور نیاز از آنها استفاده کنید .

مثال های زیر همگی گونه ای از این اکشن ها هستند :

cc.moveTo/cc.moveBy:این اکشن باعث جابه جای اسپرایت به محل تعین شده می شود .

cc.scaleTo/cc.scaleBy: باعث تغیر اندازه اسپرایت به اندازه مورد نظر می شود .

cc.rotateTo/cc.rotateBy : باعث چرخش اسپرایت با زاویه مورد نظر می شود .

cc.jumpTo/cc.jumpBy: باعث جابه جایی به نقطه مورد نظر همراه با حرکت عرضی و طولی می شود که حالتی شبیه پرش را براساس  اندازه حداکثر ارتفاع و تعداد پرش  ایجاد می کند .

و....

برای استفاده از هر کدام از این اکشن ها باید با توجه به مقادیر ورودی یک نمونه از آنها را  ایجاد کرده و از طریق متد runAction  از کلاس اسپرایت اقدام به اجرای اکشن مورد نظر کرد.

به طور مثال:

 

var actionTo = cc.moveTo(2, cc.p(100, 100));

 

که اعلام می کند این اکشن باعث جابه جای اسپرایت مورد نظر به نقطه ای در صفحه با تاخیر زمانی 2 ثانیه می شود .

دوباره اعلام می کنم که بهترین راه برای اشنایی هر چه بیشتر با تمامی اکشن ها مراجعه به پروژه test  همراه انجین است که می توانید مثال های متنوعی از انواع اکشن ها همراه با نحوه استفاده از آنها را مشاهده کنید .

  • اکشن ها را می توان به صورت دنباله وار به دنبال هم اجرا کرد. با استفاده از  cc.sequence دنباله ای از اکشن ها را می توانید  اجرا کنید .

     

var actF = cc.sequence(act1, act2, act3, act4, act5, act6, act7, act8);

 

  • اکشن ها را می توان به صورت همزمان با هم توسط  اکشنcc.spawn  اجرا کرد:

 

var act= cc.spawn( a1, a2, ..., aN );

 

  • اکشن ها را می توان به صورت معکوس اجرا کرد.

 

var actionBy = cc.rotateBy(2, 360);
var actionByBack = actionBy.reverse();

 

  • اکشن ها را می توان به صورت تکرار دائم اجرا کرد .

 

var a = action.repeatForever();

 

بکار گیری اکشن ها :

پس از آشنایی کلی با اکشن ها حال نوبت استفاده از آن در پروژه FlappyBird  می رسد .

فعلاَ که در حال آماده سازی صفحه شروع بازی هستیم عناصری که می خواهیم اکشن ها را بر روی آنها اعمال کنیم شامل دکمه هایی هستند که باید در هنگامی که کاربر انها را انتخاب می کند با یک اکشن به اطلاع کاربر برساند که دکمه مورد نظر انتخاب شده است تا از انتخاب مجدد جلوگیری شود .

ابتدا از یکی دکمه ها شروع می کنیم و با تعریف یک اکشن باعث می شویم که سایز دکمه در هنگام تاپ توسط کاربر افزایش یافته و سپس به اندازه واقعی بازگردانده شود برای این کار در تابع مربوط به دکمه ها به این صورت عمل می کنیم .

برای درک بیشتر این کار را با ایجاد سه اکشن انجام می دهیم

اکشن اول باعث تغیر سایز دکمه به اندازه 0.2  می شود در مدت 0.1 ثانیه می شود .

 

var action1=cc.scaleTo(0.1, 1.2, 1.2);

 

اکشن دوم باعث تغیر سایز دکمه به سایز اصلی در مدت 0.1 ثانیه می شود .

 

var action2=cc.ScaleTo(0.1,1,1);

 

اکشن سوم هم باعث اجرای دو اکشن قبلی به صورت پشت سر هم می شود .

 

var action3=cc.sequence(action1,action2);

 

و در نهایت با توجه به دستور زیر این اکشن ها را می توان به دکمه نسبت داد می توانید برای تست، هر کدام از اکشن های بالا را جداگانه اجرا نمایید .

 

playItem.runAction(action3);

 

همین کار را برای دکمه دیگر هم انجام می دهید .

تکرار دسته ای دستورات در بازه های زمانی :

و اما حرکت زمین ،برای این کار ما ابتدا اسپرایتی را که قبلاَ ایجاد  کرده ایم به حرکت در خواهیم اورد سپس در زمانی که اسپرایت به انتهای صفحه رسید یک شی دیگر از همان اسپرایت را نیز که ایجاد کرده بودیم  در ادامه اسپرایت اولی قرار می دهیم .

هر وقت که اسپرایت به صورت کامل از صفحه خارج شد آن را دوباره به انتهای اسپرایت قبلی بر می گردانیم .

در اینجا ما می خواهیم به صورت معمولی یک اکشن را شبیه سازی کنیم به این صورت که در بازه های زمانی به مقدار مورد نظر زمین بازی را جابه جا می کنیم و چنان که تکه مورد نظر از صفحه بازی خارج شد آن را به انتهای قطعه بعد اضافه می کنیم .مطماناَ برای انجام این شیوه حرکت ها می توان از کد های مختلفی بهره برد و من در اینجا به نظرم برای آشنای با متد schedule بهترین شیوه استفاده از تابعی بود که در بازه زمانی خاص به میزان خاصی اسپرایت صفحه را جا به جا کند .

برای این کار ما نیازمند یک اسپرایت دیگر برای زمین هستیم که آن را همانند اسپرایت اول ایجاد می کنیم .

همچین نیازمند تابعی هستیم که عمل جابه جا کردن و انتقال به انتهای اسپرایت بعدی را انجام دهد که در اینجا از تابع scrollGround استفاده کرده ایم .

همچین در انجین برای آنکه مشخص کنید که یک تابع در بازه زمانی خاصی باید اجرا شود از متد schedule  استفاده کنیم ،بدین صورت که اسم تابع مورد نظر و همچنین بازه زمانی مورد نظر را مشخص می کنیم .برای خروج تابع از حالت اجرا نیز می توان از unschedule  به همراه نام تابع استفاده کرد که بعداَ در پایان صفحه از آن استفاده خواهیم کرد.

برای اینکار در تابع سازنده لایه MainMenuLayer  و پس از تعریف اسپرایت Ground  اقدام به پیاده سازی دستورات زیر می نماییم .

 

        //add Ground1
        var Ground1=new cc.Sprite(res.Ground_png);
        Ground1.attr({
            x:Ground.x+Ground.width-1,
            y:56
        });
       this.addChild(Ground1,1);

       //run function scrollGround in loop with delay 0
       this.schedule(scrollGround,0);

       //scroll Ground Sprites and move it
       function scrollGround (dt){
         cc.log("Scroll");
         Ground.x=Ground.x-1;
         Ground1.x=Ground1.x-1;
         if(Ground.x+Ground.width/2<0){
               Ground.x=Ground1.x+Ground1.width-5;
         }

         if(Ground1.x+Ground1.width/2<0){
               Ground1.x=Ground.x+Ground.width-5;
         }
       };

 

در این بخش فقط تغیرات در فایل app.js ایجاد شد به همین دلیل فقط این فایل برای مطالعه قرار داده شده است .

دانلود

  • موافقین ۲ مخالفین ۵
  • چهارشنبه, ۲۳ مهر ۱۳۹۳، ۰۶:۲۳ ب.ظ
به اشتراک می گذارم : به اشتراک بگذاریم به اشتراک بگذاریم به اشتراک بگذاریم به اشتراک بگذاریم

نظرات  (۱)

سلام. مثل همیشه عالی بود فقط چند نکته:

فایل ground.png دارای یک پیکسل اضافه است. من آن را حذف کرده ام تا خطوط عمودی ایجاد نشوند.

پس هنگام تعریف مشخصات Ground1 احتیاجی به کم کردن آن یک پیکسل نخواهد بود. یعنی می توان از کد زیر استفاده کرد:
x: Ground.x + Ground.width,
در قسمت schedule به جای دو if از یکی استفاده کردم و خوشبختانه جواب داد. اگر دوست داشتید امتحان کنید.
if(Ground.x < 0){
    Ground.x = 168;
    Ground1.x = Ground.x + Ground.width;
}
منتظر درس های بعدی تان هستم. با تشکر.
پاسخ:
سلام
خیلی ممنون از راهنمایتون لطفا راهنمایی هاتون رو به همین صورت عمومی ارسال کنید تا در قسمت نظرات قابل انتشار باشد.
در مورد عکس زمین هم نخواستم که عکس رو دوباره ارسال کنم ممنونم از توجه و به اشتراک گزاری فعالیت هاتون