cocos2dx中的观察者模式

cocos2dx中的观察者模式,第1张

概述** 一、什么是观察者模式 当我们对感兴趣的消息进行订阅,一旦有新的动态,就可以收到这些消息。更重要的是,我们不需要时刻关注,消息会自动到达,这就是观察者模式。 在游戏中,观察者模式有很大的作用。比如游戏中的战斗,角色的死亡信息可以被订阅,当角色死亡时,订阅该消息的主体就能做出一些处理(比如怪物停止攻击,d出死亡界面等等) ** 二、cocos中提供的观察者模式工具类 1.addObserve

**

一、什么是观察者模式
当我们对感兴趣的消息进行订阅,一旦有新的动态,就可以收到这些消息。更重要的是,我们不需要时刻关注,消息会自动到达,这就是观察者模式。  在游戏中,观察者模式有很大的作用。比如游戏中的战斗,角色的死亡信息可以被订阅,当角色死亡时,订阅该消息的主体就能做出一些处理(比如怪物停止攻击,d出死亡界面等等)

**

二、cocos中提供的观察者模式工具类

1.addobserver(订阅消息)
1)Ref* target:要订阅的消息主体
2)SEL_CallFunco selector:消息的回调函数
3)const std::string& name:消息名称
4)Ref* sender: 要传递的数据

2.removeObserver(取消订阅消息)
1)Ref* target:取消订阅消息的主体
2)const std::string& name:消息名称

3.postNotification(发布消息)
1)const std::string& name:消息名称

4.postNotification(发布消息)
1)const std::string& name:消息名称
2)Ref* sender:传递的数据
在发布消息的时候带上一个数据,订阅者在接收消息的时候就能获得所需要的数据

下面通过程序创建两个层,分别是HelloWorld与otherLayer,HelloWorld作为主体订阅otherLayer发布的消息。
查看下面例子方便理解

#ifndef __HELLOWORLD_SCENE_H__#define __HELLOWORLD_SCENE_H__#include "cocos2d.h"class HelloWorld : public cocos2d::Layer{public:    static cocos2d::Scene* createScene();    virtual bool init();      CREATE_FUNC(HelloWorld);    /* 发布test消息 */    voID sendMsg(float dt);    /* 接收test消息的回调函数 */    //voID testMsg(Ref* pSender);};#endif // __HELLOWORLD_SCENE_H__

头文件在下面的cpp文件实现

#include "HelloWorldScene.h"#include "OtherLayer.h"USING_NS_CC;Scene* HelloWorld::createScene(){    auto scene = Scene::create();    auto layer = HelloWorld::create();    scene->addChild(layer);    /* 再添加一个layer */    auto otherLayer = OtherLayer::create();    scene->addChild(otherLayer);    return scene;}// on "init" you need to initialize your instancebool HelloWorld::init(){    if (!Layer::init())    {        return false;    }    /* 订阅消息类型为test的消息,不传递数据 */// NotificationCenter::getInstance()->addobserver(// this,// callfuncO_selector(HelloWorld::testMsg),// "test",// NulL);    /* 3秒后发布test消息 */    this->schedule(schedule_selector(HelloWorld::sendMsg),3.0f);    return true;}voID HelloWorld::sendMsg(float dt) {    /* 发布test消息,不传递数据 */    NotificationCenter::getInstance()->postNotification("test",NulL);}//voID HelloWorld::testMsg(Ref* pSender) {// log("testMsg");//}

这里新建了一个OtherLayer,在该类里面订阅test消息,将原来HelloWorldScene里面的testMsg函数删除,订阅消息的代码也删除。
我们把OtherLayer添加到HelloWorldScene的场景中,并把HelloWorldScene订阅消息的代码删除,则HelloWorldScene现在只负责3秒后的发送消息,运行最后可以看到日志输出
testMsg in OtherLayer

#ifndef _OtherLayer_H_#define _OtherLayer_H_#include "cocos2d.h"USING_NS_CC;class OtherLayer : public Layer {public:    CREATE_FUNC(OtherLayer);    virtual bool init();private:    /* 接收test消息的回调函数 */    voID testMsg(Ref* pData);};#endif
#include "OtherLayer.h"bool OtherLayer::init() {    if (!Layer::init())    {        return false;    }    /* 订阅消息类型为test的消息,传递数据 */    NotificationCenter::getInstance()->addobserver(        this,callfuncO_selector(OtherLayer::testMsg),"test",NulL);    return true;}voID OtherLayer::testMsg( Ref* pData ) {    //log("testMsg in OtherLayer");    log("testMsg in OtherLayer");}

总结:我们在HelloWorldScene里面发布消息,在OtherLayer里面接收消息。
HelloWorldScene是订阅的主体,接受了OtherLayer传递过来的数据。

/* 3秒后发布test消息 */    this->schedule(schedule_selector(HelloWorld::sendMsg),NulL);}

而OtherLayer在向HelloWorldScene这个层传递消息时,需要建立消息的订阅

NotificationCenter::getInstance()->addobserver(        this,NulL);voID OtherLayer::testMsg( Ref* pData ) {    //log("testMsg in OtherLayer");    log("testMsg in OtherLayer");
三、关于addobserver与postNotification函数中最后个参数传递数据的区别

1.如果addobserver与postNotification同时发布了数据,并且不是同一个数据,则无法发布消息 2.要发布消息的条件是,要么两个数据相同,要么两者其中之一为空值,才能发布消息

总结

以上是内存溢出为你收集整理的cocos2dx中的观察者模式全部内容,希望文章能够帮你解决cocos2dx中的观察者模式所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1081145.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存