這個類管理著所有的事件監聽器,其分為兩大類,一類是綁定在node上的事件,其監聽器的執行優先級取決于node在場景中的層級順序,上層先于下層即:
std::vector<EventListener*>* _sceneGraphListeners;
另一類則是指定優先級的監聽器集合:
std::vector<EventListener*>* _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<EventListener*>* getFixedPriorityListeners() const { return _fixedListeners; };
inline std::vector<EventListener*>* getSceneGraphPriorityListeners() const { return _sceneGraphListeners; };
inline ssize_t getGt0Index() const { return _gt0Index; };
inline void setGt0Index(ssize_t index) { _gt0Index = index; };
private:
std::vector<EventListener*>* _fixedListeners;
std::vector<EventListener*>* _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<EventListener*>();
_sceneGraphListeners->reserve(100);
}
_sceneGraphListeners->push_back(listener);
}
else
{
if (_fixedListeners == nullptr)
{
_fixedListeners = new std::vector<EventListener*>();
_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,小結
所以從這幾個函數可以知道,這個類其實就是管理者兩個集合罷了,操作便是對這些集合的添加刪除,并沒有很大的障礙。