Skip to content

Commit

Permalink
Merge pull request #422 from dualface/fix_touch_node
Browse files Browse the repository at this point in the history
Fix touch node
  • Loading branch information
SunLightJuly committed Apr 3, 2015
2 parents 30e3165 + b87aac8 commit ac5d8b4
Show file tree
Hide file tree
Showing 10 changed files with 51 additions and 41 deletions.
1 change: 1 addition & 0 deletions cocos/2d/CCNode.cpp
Expand Up @@ -172,6 +172,7 @@ Node::~Node()
{
ScriptEngineManager::getInstance()->getScriptEngine()->removeScriptHandler(_updateScriptHandler);
}
ScriptEngineManager::getInstance()->getScriptEngine()->removeTouchNodeEvent(this);
#endif

// User object has to be released before others, since userObject may have a weak reference of this node
Expand Down
4 changes: 3 additions & 1 deletion cocos/base/CCScriptSupport.h
Expand Up @@ -390,7 +390,9 @@ class CC_DLL ScriptEngineProtocol
* @lua NA
*/
virtual void removeScriptHandler(int handler) {};


virtual void removeTouchNodeEvent(Node *node) {};

/** Reallocate script function handler, only LuaEngine class need to implement this function.
* @js NA
* @lua NA
Expand Down
7 changes: 7 additions & 0 deletions cocos/scripting/lua-bindings/manual/CCLuaEngine.cpp
Expand Up @@ -33,6 +33,8 @@
#include "lua_cocos2dx_coco_studio_manual.hpp"
#include "lua_cocos2dx_ui_manual.hpp"

extern int removeLuaTouchNode(Node *node);

NS_CC_BEGIN

LuaEngine* LuaEngine::_defaultEngine = nullptr;
Expand Down Expand Up @@ -81,6 +83,11 @@ void LuaEngine::removeScriptHandler(int nHandler)
_stack->removeScriptHandler(nHandler);
}

void LuaEngine::removeTouchNodeEvent(Node *node)
{
removeLuaTouchNode(node);
}

int LuaEngine::executeString(const char *codes)
{
int ret = _stack->executeString(codes);
Expand Down
4 changes: 3 additions & 1 deletion cocos/scripting/lua-bindings/manual/CCLuaEngine.h
Expand Up @@ -83,7 +83,9 @@ class LuaEngine : public ScriptEngineProtocol
@brief Remove Lua function reference
*/
virtual void removeScriptHandler(int nHandler);


virtual void removeTouchNodeEvent(Node *node);

/**
@brief Reallocate Lua function reference
*/
Expand Down
15 changes: 5 additions & 10 deletions external/lua/quick/LuaEventNode.cpp
Expand Up @@ -44,28 +44,24 @@ LuaEventNode::LuaEventNode(Node *node)
, _bTouchSwallowEnabled(true)
, _bTouchEnabled(false)
, _eTouchMode(modeTouchesOneByOne)
, _nodePreuse(nullptr)
{
_node = node;
_nodeID = node->_ID;
}

LuaEventNode::~LuaEventNode()
{
// log("---> Release LuaEventNode %p", this);
}

Node *LuaEventNode::getDetachedNode() const
Node *LuaEventNode::getActiveNode() const
{
if (_node)
{
return _node;
}
return _nodePreuse;
return _node;
}

Node *LuaEventNode::getActiveNode() const
unsigned int LuaEventNode::getNodeID() const
{
return _node;
return _nodeID;
}

LuaEventNode* LuaEventNode::getParent()
Expand Down Expand Up @@ -121,7 +117,6 @@ bool LuaEventNode::isRunning() const
void LuaEventNode::detachNode()
{
// log("---> Detach LuaEventNode %p", this);
_nodePreuse = _node;
_node = nullptr;
}

Expand Down
4 changes: 2 additions & 2 deletions external/lua/quick/LuaEventNode.h
Expand Up @@ -55,8 +55,8 @@ class LuaEventNode : public Ref

~LuaEventNode();

Node *getDetachedNode() const;
Node *getActiveNode() const;
unsigned int getNodeID() const;
void detachNode();

virtual LuaEventNode* getParent();
Expand Down Expand Up @@ -106,7 +106,7 @@ class LuaEventNode : public Ref
LuaEventNode(Node *node);

Node *_node;
Node *_nodePreuse;
unsigned int _nodeID;

// touch events
bool _bTouchCaptureEnabled;
Expand Down
2 changes: 1 addition & 1 deletion external/lua/quick/LuaNodeManager.cpp
Expand Up @@ -78,7 +78,7 @@ LuaEventNode* LuaNodeManager::getLuaNodeByNode(Node *node, bool toCreate)
for (auto it = _luaNodes.begin(); it != _luaNodes.end(); ++it)
{
auto lt = (LuaEventNode *)*it;
if (lt->getActiveNode() == node) //A detached node maybe use same mem address
if (lt->getNodeID() == node->_ID)
{
lnode = lt;
break;
Expand Down
26 changes: 13 additions & 13 deletions external/lua/quick/LuaTouchEventManager.cpp
Expand Up @@ -100,14 +100,14 @@ std::string LuaTouchEventManager::getDescription() const
return StringUtils::format("<LuaTouchEventManager | tag = %d>", _tag);
}

void LuaTouchEventManager::addTouchableNode(LuaEventNode *node)
void LuaTouchEventManager::addTouchableNode(LuaEventNode *lnode)
{
Node *activeNode = node->getActiveNode();
Node *activeNode = lnode->getActiveNode();
if (!activeNode) return;
if (!_touchableNodes.contains(node))
if (!_touchableNodes.contains(lnode))
{
_touchableNodes.pushBack(node);
_nodeLuaEventNodeMap.insert(std::make_pair(activeNode, node));
_touchableNodes.pushBack(lnode);
_nodeLuaEventNodeMap.insert(std::make_pair(activeNode->_ID, lnode));
//CCLOG("ADD TOUCHABLE NODE <%p>", node->getNode());
if (!m_touchDispatchingEnabled)
{
Expand All @@ -116,14 +116,14 @@ void LuaTouchEventManager::addTouchableNode(LuaEventNode *node)
}
}

void LuaTouchEventManager::removeTouchableNode(LuaEventNode *node)
void LuaTouchEventManager::removeTouchableNode(LuaEventNode *lnode)
{
if (_bDispatching) {
return;
}

_touchableNodes.eraseObject(node);
auto found = _nodeLuaEventNodeMap.find(node->getDetachedNode());
_touchableNodes.eraseObject(lnode);
auto found = _nodeLuaEventNodeMap.find(lnode->getNodeID());
if (found != _nodeLuaEventNodeMap.end())
{
_nodeLuaEventNodeMap.erase(found);
Expand Down Expand Up @@ -361,14 +361,14 @@ void LuaTouchEventManager::sortAllTouchableNodes(Vector<LuaEventNode*>& nodes)

// After sort: priority < 0, > 0
std::sort(nodes.begin(), nodes.end(), [this](const LuaEventNode* l1, const LuaEventNode* l2) {
return _nodePriorityMap[l1->getDetachedNode()] > _nodePriorityMap[l2->getDetachedNode()];
return _nodePriorityMap[l1->getNodeID()] > _nodePriorityMap[l2->getNodeID()];
});

#if DUMP_LISTENER_ITEM_PRIORITY_INFO
log("-----------------------------------");
for (auto& l : nodes)
{
log("listener priority: node ([%s]%p), priority (%d)", typeid(*l->getNode()).name(), l->getNode(), _nodePriorityMap[l->getNode()]);
log("listener priority: node ([%s]%d), priority (%d)", typeid(*l->getNode()).name(), l->getNodeID(), _nodePriorityMap[l->getNodeID()]);
}
#endif
}
Expand Down Expand Up @@ -582,7 +582,7 @@ void LuaTouchEventManager::visitTarget(Node* node, bool isRootNode)
break;
}

if (_nodeLuaEventNodeMap.find(node) != _nodeLuaEventNodeMap.end())
if (_nodeLuaEventNodeMap.find(node->_ID) != _nodeLuaEventNodeMap.end())
{
_globalZOrderNodeMap[node->getGlobalZOrder()].push_back(node);
}
Expand All @@ -596,7 +596,7 @@ void LuaTouchEventManager::visitTarget(Node* node, bool isRootNode)
}
else
{
if (_nodeLuaEventNodeMap.find(node) != _nodeLuaEventNodeMap.end())
if (_nodeLuaEventNodeMap.find(node->_ID) != _nodeLuaEventNodeMap.end())
{
_globalZOrderNodeMap[node->getGlobalZOrder()].push_back(node);
}
Expand All @@ -620,7 +620,7 @@ void LuaTouchEventManager::visitTarget(Node* node, bool isRootNode)
{
for (const auto& n : _globalZOrderNodeMap[globalZ])
{
_nodePriorityMap[n] = ++_nodePriorityIndex;
_nodePriorityMap[n->_ID] = ++_nodePriorityIndex;
}
}

Expand Down
4 changes: 2 additions & 2 deletions external/lua/quick/LuaTouchEventManager.h
Expand Up @@ -100,10 +100,10 @@ class LuaTouchEventManager : public Node
void visitTarget(Node* node, bool isRootNode);

/** The map of node and LuaEventNode */
std::unordered_map<Node*, LuaEventNode*> _nodeLuaEventNodeMap;
std::unordered_map<unsigned int, LuaEventNode*> _nodeLuaEventNodeMap;

/** The map of node and its event priority */
std::unordered_map<Node*, int> _nodePriorityMap;
std::unordered_map<unsigned int, int> _nodePriorityMap;

/** key: Global Z Order, value: Sorted Nodes */
std::unordered_map<float, std::vector<Node*>> _globalZOrderNodeMap;
Expand Down
25 changes: 14 additions & 11 deletions external/lua/quick/lua_cocos2dx_quick_manual.cpp
Expand Up @@ -281,6 +281,19 @@ static int tolua_Cocos2d_Node_getTouchMode(lua_State* tolua_S)
#endif
}

int removeLuaTouchNode(Node *node)
{
auto mng = LuaNodeManager::getInstance();
auto lnode = mng->getLuaNodeByNode(node, false);
if (!lnode) {
return -1;
}
lnode->setLuaTouchEnabled(false);
lnode->detachNode(); //this LuaEventNode will be removed in TouchTargetNode
mng->removeLuaNode(lnode);
return 0;
}

static int tolua_Cocos2d_Node_removeTouchEvent(lua_State* tolua_S)
{
#if COCOS2D_DEBUG >= 1
Expand All @@ -297,17 +310,7 @@ static int tolua_Cocos2d_Node_removeTouchEvent(lua_State* tolua_S)
#if COCOS2D_DEBUG >= 1
if (!node) tolua_error(tolua_S,"invalid 'self' in function 'removeTouchEvent'", nullptr);
#endif
{
auto mng = LuaNodeManager::getInstance();
auto lnode = mng->getLuaNodeByNode(node, false);
if (!lnode) {
lua_settop(tolua_S, 1);
return 1;
}
lnode->setLuaTouchEnabled(false);
lnode->detachNode(); //this LuaEventNode will be removed in TouchTargetNode
mng->removeLuaNode(lnode);
}
removeLuaTouchNode(node);
}
lua_settop(tolua_S, 1);
return 1;
Expand Down

0 comments on commit ac5d8b4

Please sign in to comment.