加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Natification:Cocos中的观察者模式

发布时间:2020-12-14 16:30:28 所属栏目:百科 来源:网络整理
导读:cocos 中的观察者: NotificationCenter :通知中心 NotificationObserver :通知的观察者 代码: class CC_DLL __NotificationCenter : public Ref{ friend class ScriptHandlerMgr;public:/// 构造函数 __NotificationCenter();/// 析构函数 ~__Notificati

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");
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读