Hi everyone,
I follow this post to implement a custom class to manage touch events on a node. This node is design with Cocos Studio ans i add “Custom Class Callback feature” and a method name on touch in the main panel.
I made two classes : “PopUpCallBack” wich is my widget representation and “PopUpCallBackReader”.
The code is :
PopUpCallback.h
#pragma once
#include "cocos2d.h"
#include "cocostudio/CocoStudio.h"
#include "cocostudio/WidgetCallBackHandlerProtocol.h"
#include <string>
class PopUpCallBack : public cocos2d::Node, public cocostudio::WidgetCallBackHandlerProtocol
{
private:
std::vector<std::string> _touchTypes;
std::string _click;
std::vector<std::string> _eventTypes;
public:
PopUpCallBack(void);
~PopUpCallBack(void);
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);
CREATE_FUNC(PopUpCallBack)
};
PopUpCallBack.cpp
#include "PopUpCallBack.h"
PopUpCallBack::PopUpCallBack(void)
{
}
PopUpCallBack::~PopUpCallBack(void)
{
}
cocos2d::ui::Widget::ccWidgetTouchCallback PopUpCallBack::onLocateTouchCallback(const std::string &callBackName)
{
if (callBackName == "onTouch")
{
return CC_CALLBACK_2(PopUpCallBack::onTouch, this);
}
return nullptr;
}
cocos2d::ui::Widget::ccWidgetClickCallback PopUpCallBack::onLocateClickCallback(const std::string &callBackName)
{
if (callBackName == "onClick")
{
return CC_CALLBACK_1(PopUpCallBack::onClick, this);
}
return nullptr;
}
cocos2d::ui::Widget::ccWidgetEventCallback PopUpCallBack::onLocateEventCallback(const std::string &callBackName)
{
if (callBackName == "onEvent")
{
return CC_CALLBACK_2(PopUpCallBack::onEvent, this);
}
return nullptr;
}
void PopUpCallBack::onTouch(cocos2d::Ref* object, cocos2d::ui::Widget::TouchEventType type)
{
CCLOG("onTouch");
}
void PopUpCallBack::onClick(cocos2d::Ref* sender)
{
CCLOG("onClick");
}
void PopUpCallBack::onEvent(cocos2d::Ref* sender, int eventType)
{
CCLOG("onEvent");
}
PopUpCallBackReader.h
#pragma once
#include "cocos2d.h"
#include "PopUpCallBack.h"
#include "cocostudio/CocosStudioExport.h"
#include "cocostudio/WidgetReader/NodeReader/NodeReader.h"
class PopUpCallBackReader : public cocostudio::NodeReader
{
public:
PopUpCallBackReader(void);
~PopUpCallBackReader(void);
static PopUpCallBackReader* getInstance();
static void purge();
cocos2d::Node* createNodeWithFlatBuffers(const flatbuffers::Table* nodeOptions);
};
PopUpCallBackReader.cpp
#include "PopUpCallBackReader.h"
USING_NS_CC;
PopUpCallBackReader::PopUpCallBackReader(void)
{
}
PopUpCallBackReader::~PopUpCallBackReader(void)
{
}
static PopUpCallBackReader* _instanceMyWidgetReader = nullptr;
PopUpCallBackReader* PopUpCallBackReader::getInstance()
{
if (!_instanceMyWidgetReader)
{
_instanceMyWidgetReader = new PopUpCallBackReader();
}
return _instanceMyWidgetReader;
}
void PopUpCallBackReader::purge()
{
CC_SAFE_DELETE(_instanceMyWidgetReader);
}
Node* PopUpCallBackReader::createNodeWithFlatBuffers(const flatbuffers::Table *nodeOptions)
{
PopUpCallBack* node = PopUpCallBack::create();
setPropsWithFlatBuffers(node, nodeOptions);
return node;
}
And finally, i add the node in the layer like this
CSLoader* instance = CSLoader::getInstance();
instance->registReaderObject("PopUpCallBackReader", (ObjectFactory::Instance)PopUpCallBackReader::getInstance);
this->goalPopUp = PopUpManager::makeGoalPopUp(nullptr);
PopUpManager::showPopUp(this->goalPopUp, this, "popUpGoal");
My issue is, when i start the game with the debugger, the “onLocateTouchCallback” function is call with the callbackName I add on the panel in Cocos Studio. So, i didn’t touch the screen ! After that, when I touch the panel on the screen, nothing happen !
Have you got any idea ? I search on the web and on the forum and i don’t find anything on this issue.
Thanks for advance !