簡介:Cocos Studio2.0.5版本新增回調特性功能。可以直接在編輯器裏邊指定某個控件的事件的處理函數。這樣就可以指定某個控件的事件處理函數,不再需要一個一個去get控件,也不再需要因爲修改了控件名或者其他屬性後,就得去改程序啦。
這些,都可以交給策劃了。
ok,以下是正文
1. 創建文件,修改自定義類名稱。
點擊根節點
在屬性欄中修改自定義類類名,如:MyClass
2. 加入UI控件, 修改回調方法。
選中想要設置回調特性的控件,進入高級屬性,修改回調方法和對應回調的名稱。
如:Touch方法,名稱爲onTouch
然後發佈資源
3. 在C++中,創建一個自己的自定義類。
這個類必須遵循如下要求:
a.繼承WidgetCallBackHandlerProtocol和 Node(或其他繼承自Node的類)
b.重寫如下接口:
onLocateTouchCallback
onLocateClickCallback
onLocateEventCallback
返回對Touch、Click、Event三種事件的處理函數。(可以只重寫你使用到的回調類型)。
如:
- //.h file
- #ifndef __TestCpp__MyClass__
- #define __TestCpp__MyClass__
- #include "cocos2d.h"
- #include "cocostudio/CocoStudio.h"
- #include "cocostudio/WidgetCallBackHandlerProtocol.h"
- class MyClass: public cocos2d::Node, public cocostudio::WidgetCallBackHandlerProtocol
- {
- public:
- CREATE_FUNC(MyClass)
- MyClass();
- virtual cocos2d::ui::Widget::ccWidgetTouchCallback
- onLocateTouchCallback(const std::string &callBackName);
- virtual cocos2d::ui::Widget::ccWidgetClickCallback
- onLocateClickCallback(const std::string &callBackName);
- virtual cocos2d::ui::Widget::ccWidgetEventCallback
- onLocateEventCallback(const std::string &callBackName);
- void onTouch(cocos2d::Ref* sender, cocos2d::ui::Widget::TouchEventType type);
- void onClick(cocos2d::Ref* sender);
- void onEvent(cocos2d::Ref* sender, int eventType);
- private:
- std::vector _touchTypes;
- std::string _click;
- std::vector _eventTypes;
- };
- //.cpp file
- #include "MyClass.h"
- #include "ui/UIText.h"
- USING_NS_CC;
- using namespace std;
- using namespace cocos2d::ui;
- MyClass::MyClass()
- {}
- Widget::ccWidgetTouchCallback MyClass::onLocateTouchCallback(const string &callBackName)
- {
- if (callBackName == "onTouch")//判斷事件名,返回對應的函數。下同
- {
- return CC_CALLBACK_2(MyClass::onTouch, this);
- }
- return nullptr;
- }
- Widget::ccWidgetClickCallback MyClass::onLocateClickCallback(const string &callBackName)
- {
- if (callBackName == "onClick")
- {
- return CC_CALLBACK_1(MyClass::onClick, this);
- }
- return nullptr;
- }
- Widget::ccWidgetEventCallback MyClass::onLocateEventCallback(const string &callBackName)
- {
- if (callBackName == "onEvent")
- {
- return CC_CALLBACK_2(MyClass::onEvent, this);
- }
- return nullptr;
- }
- void MyClass::onTouch(cocos2d::Ref* object, cocos2d::ui::Widget::TouchEventType type)
- {
- CCLOG("onTouch");
- }
- void MyClass::onClick(cocos2d::Ref* sender)
- {
- CCLOG("onClick");
- }
- void MyClass::onEvent(cocos2d::Ref* sender, int eventType)
- {
- CCLOG("onEvent");
- }
4. 爲第3步編寫的類創建工廠類
這個類必須繼承cocostudio::NodeReader,並重寫如下三個接口
getInstance —— 返回工廠類的單例
purge —— 銷燬工廠類
createNodeWithFlatBuffers —— 創建第3步編寫的類,並調用setPropsWithFlatBuffers
如:
- //.h file
- #ifndef __cocos2d_libs__MyClassReader__
- #define __cocos2d_libs__MyClassReader__
- #include "cocos2d.h"
- #include "cocostudio/CocosStudioExport.h"
- #include "cocostudio/WidgetReader/NodeReader/NodeReader.h"
- class MyClassReader : public cocostudio::NodeReader
- {
- public:
- MyClassReader() {};
- ~MyClassReader() {};
- static MyClassReader* getInstance();
- static void purge();
- cocos2d::Node* createNodeWithFlatBuffers(const flatbuffers::Table* nodeOptions);
- };
- #endif /*defined(__cocos2d_libs__MyClassReader__) */
- //.cpp file
- #include "MyClassReader.h"
- #include "MyClass.h"
- USING_NS_CC;
- static MyClassReader* _instanceMyClassReader = nullptr;
- MyClassReader* MyClassReader::getInstance()
- {
- if (!_instanceMyClassReader)
- {
- _instanceMyClassReader = new MyClassReader();
- }
- return _instanceMyClassReader;
- }
- void MyClassReader::purge()
- {
- CC_SAFE_DELETE(_instanceMyClassReader);
- }
- Node* MyClassReader::createNodeWithFlatBuffers(const flatbuffers::Table *nodeOptions)
- {
- MyClass* node = MyClass::create();
- setPropsWithFlatBuffers(node, nodeOptions);
- return node;
- }
5. 在加載節點之前註冊這個接口到CSLoader中
- CSLoader* instance = CSLoader::getInstance();
- instance->registReaderObject("MyClassReader",(ObjectFactory::Instance)MyClassReader::getInstance);
注意第一個參數必須是第一步填寫的自定義類名加“Reader”如上述的"MyClassReader"
6.使用CSLoader::createNode加載你設置了自定義類的CSB文件
注意:你的自定義類的create已經委託給工廠類,只要你註冊工廠類的時候沒寫錯,工廠類會在createNode裏邊create你的自定義類。 所以不需要你自己再create自定義類。最終createNode返回的就是你的自定義類。