CocosStudio v2.x版本教程——“回调特性”(C++语言版)

2015.1.23 技术干货 by cocos

简介: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三种事件的处理函数。(可以只重写你使用到的回调类型)。

如:

  1. //.h file
  2. #ifndef __TestCpp__MyClass__
  3. #define __TestCpp__MyClass__
  4. #include "cocos2d.h"
  5. #include "cocostudio/CocoStudio.h"
  6. #include "cocostudio/WidgetCallBackHandlerProtocol.h"
  7. class MyClass: public cocos2d::Node, publiccocostudio::WidgetCallBackHandlerProtocol
  8. {
  9. public:
  10. CREATE_FUNC(MyClass)
  11. MyClass();
  12. virtual cocos2d::ui::Widget::ccWidgetTouchCallback
  13. onLocateTouchCallback(const std::string &callBackName);
  14. virtual cocos2d::ui::Widget::ccWidgetClickCallback
  15. onLocateClickCallback(const std::string &callBackName);
  16. virtual cocos2d::ui::Widget::ccWidgetEventCallback
  17. onLocateEventCallback(const std::string &callBackName);
  18. void onTouch(cocos2d::Ref* sender, cocos2d::ui::Widget::TouchEventType type);
  19. void onClick(cocos2d::Ref* sender);
  20. void onEvent(cocos2d::Ref* sender, int eventType);
  21. private:
  22. std::vector _touchTypes;
  23. std::string _click;
  24. std::vector _eventTypes;
  25. };
  26. //.cpp file
  27. #include "MyClass.h"
  28. #include "ui/UIText.h"
  29. USING_NS_CC;
  30. using namespace std;
  31. using namespace cocos2d::ui;
  32. MyClass::MyClass()
  33. {}
  34. Widget::ccWidgetTouchCallback MyClass::onLocateTouchCallback(const string &callBackName)
  35. {
  36. if (callBackName == "onTouch")//判断事件名,返回对应的函数。下同
  37. {
  38. return CC_CALLBACK_2(MyClass::onTouch, this);
  39. }
  40. return nullptr;
  41. }
  42. Widget::ccWidgetClickCallback MyClass::onLocateClickCallback(const string &callBackName)
  43. {
  44. if (callBackName == "onClick")
  45. {
  46. return CC_CALLBACK_1(MyClass::onClick, this);
  47. }
  48. return nullptr;
  49. }
  50. Widget::ccWidgetEventCallback MyClass::onLocateEventCallback(const string &callBackName)
  51. {
  52. if (callBackName == "onEvent")
  53. {
  54. return CC_CALLBACK_2(MyClass::onEvent, this);
  55. }
  56. return nullptr;
  57. }
  58. void MyClass::onTouch(cocos2d::Ref* object, cocos2d::ui::Widget::TouchEventType type)
  59. {
  60. CCLOG("onTouch");
  61. }
  62. void MyClass::onClick(cocos2d::Ref* sender)
  63. {
  64. CCLOG("onClick");
  65. }
  66. void MyClass::onEvent(cocos2d::Ref* sender, int eventType)
  67. {
  68. CCLOG("onEvent");
  69. }

4. 为第3步编写的类创建工厂类

这个类必须继承cocostudio::NodeReader,并重写如下三个接口

getInstance —— 返回工厂类的单例

purge —— 销毁工厂类

createNodeWithFlatBuffers —— 创建第3步编写的类,并调用setPropsWithFlatBuffers

如:

  1. //.h file
  2. #ifndef __cocos2d_libs__MyClassReader__
  3. #define __cocos2d_libs__MyClassReader__
  4. #include "cocos2d.h"
  5. #include "cocostudio/CocosStudioExport.h"
  6. #include "cocostudio/WidgetReader/NodeReader/NodeReader.h"
  7. class MyClassReader : public cocostudio::NodeReader
  8. {
  9. public:
  10. MyClassReader() {};
  11. ~MyClassReader() {};
  12. static MyClassReader* getInstance();
  13. static void purge();
  14. cocos2d::Node* createNodeWithFlatBuffers(constflatbuffers::Table* nodeOptions);
  15. };
  16. #endif /*defined(__cocos2d_libs__MyClassReader__) */
  17. //.cpp file
  18. #include "MyClassReader.h"
  19. #include "MyClass.h"
  20. USING_NS_CC;
  21. static MyClassReader* _instanceMyClassReader = nullptr;
  22. MyClassReader* MyClassReader::getInstance()
  23. {
  24. if (!_instanceMyClassReader)
  25. {
  26. _instanceMyClassReader = new MyClassReader();
  27. }
  28. return _instanceMyClassReader;
  29. }
  30. void MyClassReader::purge()
  31. {
  32. CC_SAFE_DELETE(_instanceMyClassReader);
  33. }
  34. Node* MyClassReader::createNodeWithFlatBuffers(constflatbuffers::Table *nodeOptions)
  35. {
  36. MyClass* node = MyClass::create();
  37. setPropsWithFlatBuffers(node, nodeOptions);
  38. return node;
  39. }

5. 在加载节点之前注册这个接口到CSLoader中

  1. CSLoader* instance = CSLoader::getInstance();
  2. instance->registReaderObject("MyClassReader",(ObjectFactory::Instance)MyClassReader::getInstance);

注意第一个参数必须是第一步填写的自定义类名加”Reader”如上述的"MyClassReader"

6.使用CSLoader::createNode加载你设置了自定义类的CSB文件

注意:
你的自定义类的create已经委托给工厂类,只要你注册工厂类的时候没写错,工厂类会在createNode里边create你的自定义类。
所以不需要你自己再create自定义类。最终createNode返回的就是你的自定义类。