mirror of https://github.com/axmolengine/axmol.git
Merge pull request #4852 from dumganhar/iss3579-lua-bugtest914-crash
closed #3579: TestLua->BugsTest->bug914 crashes if clicking 'reset' button all the time.
This commit is contained in:
commit
f3eb21e748
|
@ -279,11 +279,10 @@ void EventDispatcher::associateNodeAndEventListener(Node* node, EventListener* l
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
listeners = new std::vector<EventListener*>();
|
listeners = new std::vector<EventListener*>();
|
||||||
|
_nodeListenersMap.insert(std::make_pair(node, listeners));
|
||||||
}
|
}
|
||||||
|
|
||||||
listeners->push_back(listener);
|
listeners->push_back(listener);
|
||||||
|
|
||||||
_nodeListenersMap.insert(std::make_pair(node, listeners));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void EventDispatcher::dissociateNodeAndEventListener(Node* node, EventListener* listener)
|
void EventDispatcher::dissociateNodeAndEventListener(Node* node, EventListener* listener)
|
||||||
|
@ -311,29 +310,7 @@ void EventDispatcher::addEventListener(EventListener* listener)
|
||||||
{
|
{
|
||||||
if (_inDispatch == 0)
|
if (_inDispatch == 0)
|
||||||
{
|
{
|
||||||
EventListenerVector* listenerList = nullptr;
|
forceAddEventListener(listener);
|
||||||
|
|
||||||
auto iter = _listeners.find(listener->getListenerID());
|
|
||||||
if (iter == _listeners.end())
|
|
||||||
{
|
|
||||||
listenerList = new EventListenerVector();
|
|
||||||
_listeners.insert(std::make_pair(listener->getListenerID(), listenerList));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
listenerList = iter->second;
|
|
||||||
}
|
|
||||||
|
|
||||||
listenerList->push_back(listener);
|
|
||||||
|
|
||||||
if (listener->getFixedPriority() == 0)
|
|
||||||
{
|
|
||||||
setDirty(listener->getListenerID(), DirtyFlag::SCENE_GRAPH_PRIORITY);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
setDirty(listener->getListenerID(), DirtyFlag::FIXED_PRITORY);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -343,6 +320,44 @@ void EventDispatcher::addEventListener(EventListener* listener)
|
||||||
listener->retain();
|
listener->retain();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void EventDispatcher::forceAddEventListener(EventListener* listener)
|
||||||
|
{
|
||||||
|
EventListenerVector* listeners = nullptr;
|
||||||
|
EventListener::ListenerID listenerID = listener->getListenerID();
|
||||||
|
auto itr = _listeners.find(listenerID);
|
||||||
|
if (itr == _listeners.end())
|
||||||
|
{
|
||||||
|
|
||||||
|
listeners = new EventListenerVector();
|
||||||
|
_listeners.insert(std::make_pair(listenerID, listeners));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
listeners = itr->second;
|
||||||
|
}
|
||||||
|
|
||||||
|
listeners->push_back(listener);
|
||||||
|
|
||||||
|
if (listener->getFixedPriority() == 0)
|
||||||
|
{
|
||||||
|
setDirty(listenerID, DirtyFlag::SCENE_GRAPH_PRIORITY);
|
||||||
|
|
||||||
|
auto node = listener->getSceneGraphPriority();
|
||||||
|
CCASSERT(node != nullptr, "Invalid scene graph priority!");
|
||||||
|
|
||||||
|
associateNodeAndEventListener(node, listener);
|
||||||
|
|
||||||
|
if (node->isRunning())
|
||||||
|
{
|
||||||
|
resumeTarget(node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
setDirty(listenerID, DirtyFlag::FIXED_PRITORY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void EventDispatcher::addEventListenerWithSceneGraphPriority(EventListener* listener, Node* node)
|
void EventDispatcher::addEventListenerWithSceneGraphPriority(EventListener* listener, Node* node)
|
||||||
{
|
{
|
||||||
CCASSERT(listener && node, "Invalid parameters.");
|
CCASSERT(listener && node, "Invalid parameters.");
|
||||||
|
@ -356,13 +371,6 @@ void EventDispatcher::addEventListenerWithSceneGraphPriority(EventListener* list
|
||||||
listener->setRegistered(true);
|
listener->setRegistered(true);
|
||||||
|
|
||||||
addEventListener(listener);
|
addEventListener(listener);
|
||||||
|
|
||||||
associateNodeAndEventListener(node, listener);
|
|
||||||
|
|
||||||
if (node->isRunning())
|
|
||||||
{
|
|
||||||
resumeTarget(node);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void EventDispatcher::addEventListenerWithFixedPriority(EventListener* listener, int fixedPriority)
|
void EventDispatcher::addEventListenerWithFixedPriority(EventListener* listener, int fixedPriority)
|
||||||
|
@ -873,33 +881,9 @@ void EventDispatcher::updateListeners(Event* event)
|
||||||
|
|
||||||
if (!_toAddedListeners.empty())
|
if (!_toAddedListeners.empty())
|
||||||
{
|
{
|
||||||
EventListenerVector* listeners = nullptr;
|
|
||||||
|
|
||||||
for (auto& listener : _toAddedListeners)
|
for (auto& listener : _toAddedListeners)
|
||||||
{
|
{
|
||||||
EventListener::ListenerID listenerID = listener->getListenerID();
|
forceAddEventListener(listener);
|
||||||
auto itr = _listeners.find(listenerID);
|
|
||||||
if (itr == _listeners.end())
|
|
||||||
{
|
|
||||||
|
|
||||||
listeners = new EventListenerVector();
|
|
||||||
_listeners.insert(std::make_pair(listenerID, listeners));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
listeners = itr->second;
|
|
||||||
}
|
|
||||||
|
|
||||||
listeners->push_back(listener);
|
|
||||||
|
|
||||||
if (listener->getFixedPriority() == 0)
|
|
||||||
{
|
|
||||||
setDirty(listenerID, DirtyFlag::SCENE_GRAPH_PRIORITY);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
setDirty(listenerID, DirtyFlag::FIXED_PRITORY);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
_toAddedListeners.clear();
|
_toAddedListeners.clear();
|
||||||
}
|
}
|
||||||
|
|
|
@ -155,9 +155,18 @@ protected:
|
||||||
ssize_t _gt0Index;
|
ssize_t _gt0Index;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Adds event listener with item */
|
/** Adds an event listener with item
|
||||||
|
* @note if it is dispatching event, the added operation will be delayed to the end of current dispatch
|
||||||
|
* @see forceAddEventListener
|
||||||
|
*/
|
||||||
void addEventListener(EventListener* listener);
|
void addEventListener(EventListener* listener);
|
||||||
|
|
||||||
|
/** Force adding an event listener
|
||||||
|
* @note force add an event listener which will ignore whether it's in dispatching.
|
||||||
|
* @see addEventListener
|
||||||
|
*/
|
||||||
|
void forceAddEventListener(EventListener* listener);
|
||||||
|
|
||||||
/** Gets event the listener list for the event listener type. */
|
/** Gets event the listener list for the event listener type. */
|
||||||
EventListenerVector* getListeners(const EventListener::ListenerID& listenerID);
|
EventListenerVector* getListeners(const EventListener::ListenerID& listenerID);
|
||||||
|
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
9f5dda004e2659caf1fc9f9032e7b386754c7200
|
16af4ad046f4db00af7a229d89c406054d8616c3
|
|
@ -1 +1 @@
|
||||||
31ce7e2d174b3b02eb3a30cbc999f1302c70b685
|
f0ef8eb2f398001c933c2608c1eb219db7deaebf
|
|
@ -1,4 +1,4 @@
|
||||||
require "Cocos2dStudio"
|
require "CocoStudio"
|
||||||
|
|
||||||
local TMoveBy = class("TMoveBy")
|
local TMoveBy = class("TMoveBy")
|
||||||
TMoveBy._tag = -1
|
TMoveBy._tag = -1
|
||||||
|
|
Loading…
Reference in New Issue