【教程】“回撥特性”的使用教程(C++語言)

峻峰飛陽發表於2016-11-02

(原文:http://www.cocoachina.com/bbs/read.php?tid-274210.html)

【新功能】“回撥特性”的使用教程:

簡介:Cocos Studio2.0.5版本新增回撥特性功能。

現在可以直接在編輯器裡邊指定某個控制元件的事件的處理函式。
不再需要一個一個去get控制元件啦。也不再需要因為修改了控制元件名或者其他屬性後,就得去改程式啦。
這些,都可以交給策劃了。                           


ok,以下是正文

1. 建立檔案,修改自定義類名稱。
點選根節點

 



在屬性欄中修改自定義類類名,如:MyClass

 

2. 加入UI控制元件修改回撥方法。
選中想要設定回撥特性的控制元件,進入高階屬性,修改回撥方法和對應回撥的名稱。
如:Touch方法,名稱為onTouch

 

然後釋出資源
3. C++中,建立一個自己的自定義類。
這個類必須遵循如下要求:
a.繼承WidgetCallBackHandlerProtocol Node(或其他繼承自Node的類)
b.重寫如下介面:
onLocateTouchCallback
onLocateClickCallback
onLocateEventCallback
返回對TouchClickEvent三種事件的處理函式。(可以只重寫你使用到的回撥型別)。
如:
//.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<std::string> _touchTypes;
std::string _click;
std::vector<std::string> _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 MyClassReadergetInstance();
static void purge();
cocos2d::NodecreateNodeWithFlatBuffers(const flatbuffers::TablenodeOptions);
};
#endif /*defined(__cocos2d_libs__MyClassReader__) */
//.cpp file
#include "MyClassReader.h"
#include "MyClass.h"
USING_NS_CC;
static MyClassReader_instanceMyClassReader = nullptr;
MyClassReaderMyClassReader::getInstance()
{
if (!_instanceMyClassReader)
    {
_instanceMyClassReader = new MyClassReader();
    }
return _instanceMyClassReader;
}
void MyClassReader::purge()
{
CC_SAFE_DELETE(_instanceMyClassReader);
}
NodeMyClassReader::createNodeWithFlatBuffers(const flatbuffers::Table *nodeOptions)
{
MyClassnode = MyClass::create();
setPropsWithFlatBuffers(nodenodeOptions);
return node;
}

5. 在載入節點之前註冊這個介面到CSLoader
CSLoaderinstance = CSLoader::getInstance();
instance->registReaderObject("MyClassReader",(ObjectFactory::Instance)MyClassReader::getInstance);
注意第一個引數必須是第一步填寫的自定義類名加“Reader ”如上述的"MyClassReader"
6.  使用CreateNode
載入你的節點。



!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!注意:!!!
你的自定義類的create已經委託給工廠類,只要你註冊工廠類的時候沒寫錯,工廠類會在createNode裡邊create你的自定義類。
所以不需要你自己再create自定義類。
最終createNode返回的就是你的自定義類。
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#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<std::string> _touchTypes;
std::string _click;
std::vector<std::string> _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");
}
[ 此帖被DDDigua在2015-06-03 17:55重新編輯 ]

相關文章