Cocos Studio“回调特性“使用教程

2015年03月22日 09:12 0 点赞 0 评论 更新于 2017-05-09 13:23

在Cocos Studio 2.0.5版本中,新增了回调特性功能。借助该功能,现在可以直接在编辑器里指定某个控件事件的处理函数,无需逐个获取控件,也无需在修改控件名或其他属性后去修改程序,这些任务可交由策划人员完成。下面将详细介绍这一特性的使用方法。

1. 创建文件并修改自定义类名称

首先,点击根节点,然后在属性栏中修改自定义类的类名,例如将其设置为 MyClass

2. 加入UI控件并修改回调方法

选中想要设置回调特性的控件,进入高级属性,修改回调方法和对应回调的名称。例如,将 Touch 方法的名称设置为 onTouch。完成设置后,发布资源。

3. 在C++中创建自定义类

这个自定义类需要遵循以下要求:

  • 继承要求:继承 WidgetCallBackHandlerProtocolNode(或其他继承自 Node 的类)。
  • 重写接口:重写 onLocateTouchCallbackonLocateClickCallbackonLocateEventCallback 这三个接口,用于返回对 TouchClickEvent 三种事件的处理函数。可以只重写实际使用到的回调类型。

以下是示例代码:

.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 返回的就是自定义类的实例。

作者信息

boke

boke

共发布了 1025 篇文章