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,const std::string& name, Ref *sender);
};
class CC_DLL NotificationObserver : public Ref
{
public:
/// 构造函数
/// target 想要观察通知事件的目标
/// seletor 当指定的通知事件被广播的时候调用的回调函数
/// name 通知的名字
/// sender 目标想要接收通知的对象。只有被这个发送者发送的通知会传递给目标。nullptr意味着发送者对于目标是否接受通知没有用。
NotificationObserver(Ref *target,
SEL_CallFuncO selector,
const std::string& name,
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");
}