cocos studio csb 回调

2015年01月22日 10:06 0 点赞 0 评论 更新于 2025-11-21 15:04

在开发过程中,很多开发者可能对 Cocos Studio CSB 回调的实现方式不太了解。本文将详细介绍如何实现 Cocos Studio CSB 回调,下面我们一起来看具体步骤。

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

首先,打开相关文件,点击根节点。然后在属性栏中修改自定义类类名,例如将其设置为 MyClass

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

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

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

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

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

以下是示例代码:

头文件(.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<std::string> _touchTypes;
std::string _click;
std::vector<std::string> _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 /*defined(__cocos2d_libs__MyClassReader__) */

实现文件(.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 返回的就是你的自定义类。

通过以上步骤,你就可以实现 Cocos Studio CSB 回调功能。希望本文对你有所帮助。

作者信息

feifeila

feifeila

共发布了 3994 篇文章