Cocos Studio“回调特性“使用教程
在Cocos Studio 2.0.5版本中,新增了回调特性功能。借助该功能,现在可以直接在编辑器里指定某个控件事件的处理函数,无需逐个获取控件,也无需在修改控件名或其他属性后去修改程序,这些任务可交由策划人员完成。下面将详细介绍这一特性的使用方法。
1. 创建文件并修改自定义类名称
首先,点击根节点,然后在属性栏中修改自定义类的类名,例如将其设置为 MyClass。
2. 加入UI控件并修改回调方法
选中想要设置回调特性的控件,进入高级属性,修改回调方法和对应回调的名称。例如,将 Touch 方法的名称设置为 onTouch。完成设置后,发布资源。
3. 在C++中创建自定义类
这个自定义类需要遵循以下要求:
- 继承要求:继承
WidgetCallBackHandlerProtocol和Node(或其他继承自Node的类)。 - 重写接口:重写
onLocateTouchCallback、onLocateClickCallback和onLocateEventCallback这三个接口,用于返回对Touch、Click、Event三种事件的处理函数。可以只重写实际使用到的回调类型。
以下是示例代码:
.h 文件
#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<int> _touchTypes;
std::string _click;
std::vector<int> _eventTypes;
};
#endif
.cpp 文件
#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 文件
#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
.cpp 文件
#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 中。示例代码如下:
CSLoader* instance = CSLoader::getInstance();
instance->registReaderObject("MyClassReader", (ObjectFactory::Instance)MyClassReader::getInstance);
需要注意的是,第一个参数必须是第一步填写的自定义类名加上 “Reader ”,例如上述的 "MyClassReader"。
6. 使用CreateNode加载节点
由于自定义类的 create 方法已经委托给工厂类,只要在注册工厂类时没有写错,工厂类会在 createNode 方法中创建自定义类。因此,不需要手动创建自定义类,最终 createNode 返回的就是自定义类的实例。