这个类管理着所有的事件监听器,其分为两大类,一类是绑定在node上的事件,其监听器的执行优先级取决于node在场景中的层级顺序,上层先于下层即:
std::vector* _sceneGraphListeners;
另一类则是指定优先级的监听器集合:
std::vector* _fixedListeners;
这两大类型具体有何不同,且往下分析,首先来看下EventListenerVector的定义
class EventListenerVector
{
public:
EventListenerVector();
~EventListenerVector();
size_t size() const;
bool empty() const;
void push_back(EventListener* item);
void clearSceneGraphListeners();
void clearFixedListeners();
void clear();
inline std::vector* getFixedPriorityListeners() const { return _fixedListeners; };
inline std::vector* getSceneGraphPriorityListeners() const { return _sceneGraphListeners; };
inline ssize_t getGt0Index() const { return _gt0Index; };
inline void setGt0Index(ssize_t index) { _gt0Index = index; };
private:
std::vector* _fixedListeners;
std::vector* _sceneGraphListeners;
ssize_t _gt0Index;
};
除去开头介绍的两个属性之外,还有一个
ssize_t _gt0Index;
这个属性?
1,函数解析
构造函数和析构函数
EventListenerVector();
~EventListenerVector();
这两个函数是对两类监听器集合做的初始化和销毁,没有太多代码。
EventDispatcher::EventListenerVector::EventListenerVector() :
_fixedListeners(nullptr),
_sceneGraphListeners(nullptr),
_gt0Index(0)
{
}
EventDispatcher::EventListenerVector::~EventListenerVector()
{
CC_SAFE_DELETE(_sceneGraphListeners);
CC_SAFE_DELETE(_fixedListeners);
}
size_t size() const;
这个函数是用来获取监听器的个数,是包括两大类的监听器
size_t EventDispatcher::EventListenerVector::size() const
{
size_t ret = 0;
if (_sceneGraphListeners)
ret += _sceneGraphListeners->size();
if (_fixedListeners)
ret += _fixedListeners->size();
return ret;
}
bool empty() const;
判断监听器集合是否为空,两大类同时为空方才返回true,逻辑很简单,一看便知。
bool EventDispatcher::EventListenerVector::empty() const
{
return (_sceneGraphListeners == nullptr || _sceneGraphListeners->empty())
&& (_fixedListeners == nullptr || _fixedListeners->empty());
}
void push_back(EventListener* item);
往容器中添加监听器,这个函数稍微有些逻辑,if,endif部分用来调试所用,根据宏
CC_NODE_DEBUG_VERIFY_EVENT_LISTENERS
来做判断,这个宏默认是0,也就是说这个ifendif之间的逻辑是默认不执行的。
往下是走的两条分支
listener->getFixedPriority() == 0
根据监听器的优先级来做的判断,只有绑定node的监听器,其优先级才为0,而指定优先级的监听器虽然可以指定却不能指定为0,关于监听器将在下一篇做讲解,所以根据优先级可以判断这个监听器的类型,从而插入两个不同的容器中,这里用到了vector的一个函数
_sceneGraphListeners->reserve(100);
这个函数是一个容量大小声明的函数,为容器预留100个对象的空间,但是并不会生成对象和resize有所不同。
void EventDispatcher::EventListenerVector::push_back(EventListener* listener)
{
#if CC_NODE_DEBUG_VERIFY_EVENT_LISTENERS
CCASSERT(_sceneGraphListeners == nullptr ||
std::count(_sceneGraphListeners->begin(), _sceneGraphListeners->end(), listener) == 0,
"Listener should not be added twice!");
CCASSERT(_fixedListeners == nullptr ||
std::count(_fixedListeners->begin(), _fixedListeners->end(), listener) == 0,
"Listener should not be added twice!");
#endif
if (listener->getFixedPriority() == 0)
{
if (_sceneGraphListeners == nullptr)
{
_sceneGraphListeners = new std::vector();
_sceneGraphListeners->reserve(100);
}
_sceneGraphListeners->push_back(listener);
}
else
{
if (_fixedListeners == nullptr)
{
_fixedListeners = new std::vector();
_fixedListeners->reserve(100);
}
_fixedListeners->push_back(listener);
}
}
void clearSceneGraphListeners();
清空SceneGraphListeners集合,并重新赋值空指针
void EventDispatcher::EventListenerVector::clearSceneGraphListeners()
{
if (_sceneGraphListeners)
{
_sceneGraphListeners->clear();
delete _sceneGraphListeners;
_sceneGraphListeners = nullptr;
}
}
void clearFixedListeners();
清空FixedListeners集合,并重新赋值空指针
void EventDispatcher::EventListenerVector::clearFixedListeners()
{
if (_fixedListeners)
{
_fixedListeners->clear();
delete _fixedListeners;
_fixedListeners = nullptr;
}
}
void clear();
清空所有集合
void EventDispatcher::EventListenerVector::clear()
{
clearSceneGraphListeners();
clearFixedListeners();
}
2,小结
所以从这几个函数可以知道,这个类其实就是管理者两个集合罢了,操作便是对这些集合的添加删除,并没有很大的障碍。