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

来源:互联网 发布:淘宝的市场定位 编辑:程序博客网 时间:2024/05/24 06:35

简介: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, public cocostudio::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.   
  29. #include "ui/UIText.h"   
  30.   
  31. USING_NS_CC;   
  32. using namespace std;   
  33. using namespace cocos2d::ui;   
  34.   
  35. MyClass::MyClass()   
  36. {}   
  37.   
  38. Widget::ccWidgetTouchCallback MyClass::onLocateTouchCallback(const string &callBackName)   
  39. {   
  40.     if (callBackName == "onTouch")//判断事件名,返回对应的函数。下同   
  41.     {   
  42.         return CC_CALLBACK_2(MyClass::onTouch, this);   
  43.     }   
  44.   
  45.     return nullptr;   
  46. }   
  47.   
  48. Widget::ccWidgetClickCallback MyClass::onLocateClickCallback(const string &callBackName)   
  49. {   
  50.     if (callBackName == "onClick")   
  51.     {   
  52.         return CC_CALLBACK_1(MyClass::onClick, this);   
  53.     }   
  54.   
  55.     return nullptr;   
  56. }   
  57. Widget::ccWidgetEventCallback MyClass::onLocateEventCallback(const string &callBackName)   
  58. {   
  59.     if (callBackName == "onEvent")   
  60.     {   
  61.         return CC_CALLBACK_2(MyClass::onEvent, this);   
  62.     }   
  63.     return nullptr;   
  64. }   
  65.   
  66. void MyClass::onTouch(cocos2d::Ref* object, cocos2d::ui::Widget::TouchEventType type)   
  67. {   
  68.     CCLOG("onTouch");   
  69. }   
  70.   
  71. void MyClass::onClick(cocos2d::Ref* sender)   
  72. {   
  73.     CCLOG("onClick");   
  74. }   
  75.   
  76. void MyClass::onEvent(cocos2d::Ref* sender, int eventType)   
  77. {   
  78.     CCLOG("onEvent");   
  79. }   

 

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(const flatbuffers::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.     if (!_instanceMyClassReader) 
  24.     { 
  25.         _instanceMyClassReader = new MyClassReader(); 
  26.     } 
  27.     return _instanceMyClassReader; 
  28. void MyClassReader::purge() 
  29.     CC_SAFE_DELETE(_instanceMyClassReader); 
  30. Node* MyClassReader::createNodeWithFlatBuffers(const flatbuffers::Table *nodeOptions) 
  31.     MyClass* node = MyClass::create(); 
  32.     setPropsWithFlatBuffers(node, nodeOptions); 
  33.     return node; 
  34. }  

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返回的就是你的自定义类。
0 0
原创粉丝点击