Cocos2d-x3.5下“回調(diào)特性”的一種簡(jiǎn)單的實(shí)現(xiàn)方法
Cocos2d-x3.5已經(jīng)發(fā)布了一小段時(shí)間了,細(xì)心的同學(xué)會(huì)發(fā)現(xiàn)這個(gè)版本增加了一個(gè)加載cocos資源的重載版本:
Node* CSLoader::createNode(const std::string &filename, const ccNodeLoadCallback &callback)
相比另一個(gè)版本,這個(gè)多了一個(gè)回調(diào)函數(shù)的參數(shù)。
框架用這個(gè)東西干了什么?
通過閱讀源碼可以知道,在加載完一個(gè)節(jié)點(diǎn)后,框架會(huì)將節(jié)點(diǎn)簡(jiǎn)單地回調(diào)給這個(gè)函數(shù)(除根節(jié)點(diǎn)外)。這樣,利用這個(gè)參數(shù),我們可以在加載資源的過程中對(duì)正在加載的節(jié)點(diǎn)做一些修飾處理。
這篇文章就來講講,怎么用這個(gè)東西來十分簡(jiǎn)便地實(shí)現(xiàn)此前那個(gè)有點(diǎn)復(fù)雜的功能:回調(diào)特性。
正文:
首先利用上邊的功能,我們可以在加載時(shí)得到各個(gè)節(jié)點(diǎn)對(duì)象,其次我們需要獲取Cocos中填寫的參數(shù)。
具體是怎么獲取呢?
先在CSLoader的源碼找找關(guān)于回調(diào)特性的原有實(shí)現(xiàn):
Widget* widget = dynamic_cast
if (widget)
{
std::string callbackName = widget->getCallbackName();
std::string callbackType = widget->getCallbackType();
bindCallback(callbackName, callbackType, widget, _rootNode);
}
以上這段代碼是在CSLoader::createNode加載Widget類型節(jié)點(diǎn)時(shí),針對(duì)回調(diào)特性的一些特殊處理。就是將我們?cè)贑ocos中填寫的兩個(gè)回調(diào)特性的字段取出來,聯(lián)通widget,_rootNode傳給bindCallback進(jìn)行綁定。
上邊的兩個(gè)函數(shù):getCallbackName,getCallbackType,取出來的就是我們?cè)贑ocos中所填寫的回調(diào)參數(shù)信息。
至此填了回調(diào)特性的節(jié)點(diǎn)及對(duì)應(yīng)的參數(shù)我們都有了。
接下來,如何實(shí)現(xiàn)呢?
我們可以考慮跟上述類似的做法:
CSLoader::createNode(root_path,[this](Node *node){//node既是當(dāng)前加載出來的節(jié)點(diǎn)
Widget* widget = dynamic_cast
if (widget){
//獲取回調(diào)特性相關(guān)屬性的信息。
std::string callbackName = widget->getCallbackName();
std::string callbackType = widget->getCallbackType();
//根據(jù)上述信息進(jìn)行綁定。
this.bindCallback(callbackName, callbackType, widget);
}
});
然后在當(dāng)前類實(shí)現(xiàn)一個(gè)bindCallback函數(shù),用callbackName和callbackType進(jìn)行一些字符串比對(duì)操作,找到一個(gè)合適的函數(shù),丟給widget做監(jiān)聽,比如:
void MyScene::bindCallback(const std::string &callbackName,const std::string &callbackType,widget){
if(callbackName == “animal1” && callbackType == “Click”){//假定有一個(gè)playAnimal1的接口
widget->addClickEventListener(CC_CALLBACK_2(MyScene::playAnimal1,this));//
}
else if(callbackName == “animal2” && callbackType == “Click”){//假定有一個(gè)playAnimal2的接口
widget->addClickEventListener(CC_CALLBACK_2(MyScene::playAnimal2,this));
}
……
}
后記:
1.目前為止Cocos2d-x的兩大腳本引擎都沒有提供對(duì)回調(diào)特性的支持,包括新重載的createNode函數(shù),也是沒有導(dǎo)出給兩個(gè)腳本引擎使用。
但getCallbackName、getCallbackType這兩個(gè)函數(shù)都是有導(dǎo)出的,我們可以自行遍歷加載出來的根節(jié)點(diǎn),利用這兩個(gè)函數(shù)來獲取Cocos中填寫的回調(diào)特性相關(guān)信息,根據(jù)這些信息,自己進(jìn)行綁定。
2.Cocos2.2開始提供了一個(gè)“用戶數(shù)據(jù)”的接口,這個(gè)接口所設(shè)置的數(shù)據(jù)可以通過Cocos2d::Node::getUserData獲取,配合這個(gè)東西具體能干什么,就看你的想象力了。