Cocos2d-x 3.x 版本事件机制-EventListenerVector

这个类管理着所有的事件监听器,其分为两大类,一类是绑定在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,小结

所以从这几个函数可以知道,这个类其实就是管理者两个集合罢了,操作便是对这些集合的添加删除,并没有很大的障碍。

你可能感兴趣的:(Cocos2d-x 3.x 版本事件机制-EventListenerVector)