cocos中的观察者:
NotificationCenter:通知中心
NotificationObserver:通知的观察者
代码:
class CC_DLL __NotificationCenter : public Ref { friend class ScriptHandlerMgr; public: /// 构造函数 __NotificationCenter(); /// 析构函数 ~__NotificationCenter(); /// 得到单例 static __NotificationCenter *getInstance(); /// 销毁单例 static void destroyInstance(); /// 添加一个观察者 /// 为指定的目标添加一个观察者 /// target 想要观察通知事件的目标 /// selector 指定的通知时间广播的时候,将被调用的回调函数。 /// name 通知的名字 /// sender(发送者)目标想要接收的通知的对象。只有通知被发送者发送的时候才会传递给目标。nullptr 意味着发送者对于是否传递通知给目标没什么意义。 void addObserver(Ref *target,SEL_CallFuncO selector,const std::string& name,Ref *sender); /// 移除观察者 /// 通过指定的目标和名字移除观察者 /// target 通知的目标 /// name 通知的名字 void removeObserver(Ref *target,const std::string& name); /// 移除目标注册的所有的通知 /// target 通知的目标 /// 返回移除的观察者的数量 int removeAllObservers(Ref *target); /// 为脚本绑定注册一个支持器 /// 现在只支持Lua绑定 /// handler Lua支持器 void registerScriptObserver(Ref *target,int handler,const std::string& name); /// 注销脚本观察者 void unregisterScriptObserver(Ref *target,const std::string& name); /// 根据名字广播一个通知 /// name 通知的名字 void postNotification(const std::string& name); /// 广播一个通知通过名字 /// name 通知的名字 /// sender 发布通知的对象,不能是nullptr void postNotification(const std::string& name,Ref *sender); /// 得到脚本支持器 /// 现在只支持lua绑定 /// 返回脚本支持器 inline int getScriptHandler() const { return _scriptHandler; }; /// 得到观察者的脚本支持器 /// name 通知的名字 /// 观察者的脚本支持器 int getObserverHandlerByName(const std::string& name); private: /// 通过指定的目标和名字检测观察者是否已经推出 bool observerExisted(Ref *target,Ref *sender); }; class CC_DLL NotificationObserver : public Ref { public: /// 构造函数 /// target 想要观察通知事件的目标 /// seletor 当指定的通知事件被广播的时候调用的回调函数 /// name 通知的名字 /// sender 目标想要接收通知的对象。只有被这个发送者发送的通知会传递给目标。nullptr意味着发送者对于目标是否接受通知没有用。 NotificationObserver(Ref *target,Ref *sender); /// 析构函数 ~NotificationObserver(); /// 调用这个观察者的回调函数 void performSelector(Ref *sender); };
使用:
思路:一个节点执行一个一直循环的动作,在动作序列结束的时候,回调,发布一条动作执行一遍的信息。
float dis = size.width + light->getContentSize().width; auto moveBy = MoveBy::create(0.8f,Vec2(dis,0)); auto place = Place::create(light->getPosition()); //最后执行的回调函数 auto callback = CallFuncN::create(CC_CALLBACK_1(DemoMainLayer::ActionCallback,this)); auto seq = Sequence::create(moveBy,Hide::create(),DelayTime::create(1.0f),place,Show::create(),callback,nullptr); light->runAction(RepeatForever::create(seq)); // 添加观察者 NotificationCenter::getInstance()->addObserver(this,CC_CALLFUNCO_SELECTOR(DemoMainLayer::observerCallback),MSG_ACTION_CALLBACK,this);
//动作的回调函数:
void DemoMainLayer::ActionCallback(cocos2d::Node * pNode) { // 广播信息 NotificationCenter::getInstance()->postNotification(MSG_ACTION_CALLBACK,this); }
观察者的回调函数:
void DemoMainLayer::observerCallback(cocos2d::Ref * pObj) { log("Action_calll"); }原文链接:https://www.f2er.com/cocos2dx/341511.html