日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

cocos2d-x 3.1.1 学习笔记[17] 关于这些活动功能

發布時間:2025/7/14 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 cocos2d-x 3.1.1 学习笔记[17] 关于这些活动功能 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
供cocos2d-x通常使用的方法,我有一個好臉色。這項研究真的獎勵。




向導首先,定義,實施一系列連續動作。

對于我們的行動能回調函數,我們必須申報并加以實施。

void callBack();void callBack_1(Node* node);void callBack_2(Node* node,const char* str);void Nice::callBack(){log("Nice::callBack()");}void Nice::callBack_1(Node* node){log("This tag is %d",node->getTag());}void Nice::callBack_2(Node* node,const char* str){log("This tag is %d, and str is %s",node->getTag(), str);}//然后就開始創建我們偉大的精靈了。sp_area = Sprite::create("newAlwaysShow.png");//sp_area is a class member ,Sprite* ap_area;sp_area->setTag(1314);auto sp_another = Sprite::create();sp_another->setTag(520);addChild(sp_another);addChild(sp_area);//翻滾吧。可愛的精靈們!/*CallFunc 創建的函數必須是無參數的CallFuncN 創建的函數能夠是一個至多個參數*/sp_area->runAction(Sequence::create(MoveTo::create(2, Vec2(200, 200)),CallFunc::create(CC_CALLBACK_0(Nice::callBack, this)),CallFuncN::create(CC_CALLBACK_1(Nice::callBack_2, this, "I have tow parameter")),NULL));//這樣寫完之后。發現runAction里面的東西好平淡(平淡有時候才不是真呢!

),于是我就瞎寫一通。殘忍的把它變成了這個樣子。 sp_area->runAction(Sequence::create(MoveTo::create(2, Vec2(200, 200)), CallFunc::create(CC_CALLBACK_0(Nice::callBack, this)), CallFunc::create([&]()->void{log("Done1");log("This tag is %d", sp_area->getTag());}), CallFunc::create(std::bind(&Nice::callBack, this)), CallFuncN::create(CC_CALLBACK_1(Nice::callBack_1, this)),//1314 CallFuncN::create(CC_CALLBACK_0(Nice::callBack_1, this, sp_another)),//520 CallFuncN::create([](Node* node){log("this tag is %d", node->getTag());}),//1314 CallFuncN::create(std::bind(&Nice::callBack_1, this, sp_area)),//1314 CallFuncN::create(std::bind(&Nice::callBack_1, this, sp_another)),//520 CallFuncN::create(CC_CALLBACK_1(Nice::callBack_2, this, "I have tow parameter")), NULL));



好吧,他如今已經面目全非了。事實上這么多行也僅僅是用到了兩種方法而已,第一種lambda表達式。另外一種std::bind()。

(尼瑪,你在逗我嗎?不是還有CC_CALLBACK_0嗎?)
額。既然這樣就讓我們來看下源代碼吧。

// new callbacks based on C++11 #define CC_CALLBACK_0(__selector__,__target__, ...) std::bind(&__selector__,__target__, ##__VA_ARGS__) #define CC_CALLBACK_1(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, ##__VA_ARGS__) #define CC_CALLBACK_2(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, ##__VA_ARGS__) #define CC_CALLBACK_3(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, ##__VA_ARGS__)



果不其然,宏僅僅是表面。內在還是偷偷的和std::bind勾搭在一起了!


我們來看下這個到處勾搭的宏是怎么定義的~~~
#define CC_CALLBACK_0(__selector__,__target__, ...) std::bind(&__selector__,__target__, ##__VA_ARGS__)
#define CC_CALLBACK_0( 方法,目標, 可變參數) std::bind(&取方法的地址,目標, 可變參數)
PS:在定義宏的時候是不能用...來當作前面的...作為可變參數的,必需要使用##__VA_ARGS__這個偉大的第三者來替換掉


可變參數在整個cocos-x中也還是用到非常多的。比方創建Sequence::create就是運動了,不然你怎么能在創建一連串的動作的時候傳入那么多的參數的說。


那么接下來就來看看源代碼吧。

(又是源代碼- -)


Sequece::create是分平臺實現的(分為win和其它)#if (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) || (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)// WP8 in VS2012 does not support nullptr in variable args lists and variadic templates are also not supportedtypedef FiniteTimeAction* M;static Sequence* create(M m1, std::nullptr_t listEnd) { return variadicCreate(m1, NULL); }static Sequence* create(M m1, M m2, std::nullptr_t listEnd) { return variadicCreate(m1, m2, NULL); }static Sequence* create(M m1, M m2, M m3, std::nullptr_t listEnd) { return variadicCreate(m1, m2, m3, NULL); }static Sequence* create(M m1, M m2, M m3, M m4, std::nullptr_t listEnd) { return variadicCreate(m1, m2, m3, m4, NULL); }static Sequence* create(M m1, M m2, M m3, M m4, M m5, std::nullptr_t listEnd) { return variadicCreate(m1, m2, m3, m4, m5, NULL); }static Sequence* create(M m1, M m2, M m3, M m4, M m5, M m6, std::nullptr_t listEnd) { return variadicCreate(m1, m2, m3, m4, m5, m6, NULL); }static Sequence* create(M m1, M m2, M m3, M m4, M m5, M m6, M m7, std::nullptr_t listEnd) { return variadicCreate(m1, m2, m3, m4, m5, m6, m7, NULL); }static Sequence* create(M m1, M m2, M m3, M m4, M m5, M m6, M m7, M m8, std::nullptr_t listEnd) { return variadicCreate(m1, m2, m3, m4, m5, m6, m7, m8, NULL); }static Sequence* create(M m1, M m2, M m3, M m4, M m5, M m6, M m7, M m8, M m9, std::nullptr_t listEnd) { return variadicCreate(m1, m2, m3, m4, m5, m6, m7, m8, m9, NULL); }static Sequence* create(M m1, M m2, M m3, M m4, M m5, M m6, M m7, M m8, M m9, M m10, std::nullptr_t listEnd) { return variadicCreate(m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, NULL); }// On WP8 for variable argument lists longer than 10 items, use the other create functions or variadicCreate with NULL as the last argumentstatic Sequence* variadicCreate(FiniteTimeAction* item, ...); #elsestatic Sequence* create(FiniteTimeAction *action1, ...) CC_REQUIRES_NULL_TERMINATION; #endifSequence* Sequence::create(FiniteTimeAction *action1, ...) {va_list params;va_start(params, action1);Sequence *ret = Sequence::createWithVariableList(action1, params);//傳給了createWithVariableList讓他來處理va_end(params);return ret; }Sequence* Sequence::createWithVariableList(FiniteTimeAction *action1, va_list args) {FiniteTimeAction *now;FiniteTimeAction *prev = action1;bool bOneAction = true;while (action1){now = va_arg(args, FiniteTimeAction*);//假設第二個動作存在if (now){prev = createWithTwoActions(prev, now);bOneAction = false;}//假設第二個動作不存在else{// If only one action is added to Sequence, make up a Sequence by adding a simplest finite time action.if (bOneAction){prev = createWithTwoActions(prev, ExtraAction::create());}break;}}return ((Sequence*)prev); }
我們就依照他的思路來實現一個可變參數的函數


void manyArgument(int num, ...);void Nice::manyArgument(int num, ...){va_list params;//va_start函數的第二個參數要和manyArgument的第一個參數一樣va_start(params, num);int now;log("fist is %d", num);while (true){now = va_arg(params, int);if (now != -1){log("now is %d", now);}else{break;}}va_end(params);}manyArgument(1, 2, 3, 4, -1);

能夠發現多個參數的的時候必需要有一個能夠終止的條件(比如最后一個為-1)??墒羌僭O在中途就要傳入-1怎么辦?
這個時候僅僅能把傳入的參數改為int*
? ? void manyArgument(int* num, ...);
然后再把最后終止的條件換為!= null,可是這樣在傳入參數的時候就麻煩(有得必有失)


void manyArgument(int* num, ...);void Nice::manyArgument(int* num, ...){va_list params;//va_start函數的第二個參數要和manyArgument的第一個參數一樣va_start(params, num);int* now;log("fist is %d", *num);while (true){now = va_arg(params, int*);if (now != nullptr){log("now is %d", *now);}else{break;}}va_end(params);}int arr[] {3,6,9,12};manyArgument(arr, arr+1, arr+2, arr+3, nullptr);


接著試試定義一個可變參數得宏 ?##__VA_ARGS__ 就代表著前面傳入進來的可變參數

#define MANYARGUMENT(__num__, ...) manyArgument(__num__, ##__VA_ARGS__)MANYARGUMENT(arr, arr+1, arr+2, nullptr);
別忘記我們還有std::placeholders::_1 占位沒有玩過呢= =


auto add_num = std::bind(&Nice::add, this, std::placeholders::_1, std::placeholders::_2, 10);log("sum is %d", add_num(1, 1));//12log("sum is %d", add_num(1, 1, 2));//12log("sum is %d", add_num(1, 1, 2, 4));//12//不管怎么改變參數的第三位也是固定死了是10的,奇妙的是竟然能傳入四個參數,明擺著就是僅僅認定前兩個參數是有效的,后面的統統無效。


學到這里。

貌似對這個流程還是比較清楚的嘛。盡管可能還有很多其它的僅僅是沒有發現,可是我們還有很多其它的時間沒實用呀!



轉摘請注明出處:http://blog.csdn.net/zhouyunxuan



















版權聲明:本文博主原創文章,博客,未經同意不得轉載。

總結

以上是生活随笔為你收集整理的cocos2d-x 3.1.1 学习笔记[17] 关于这些活动功能的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。