游戏开发引擎Cocos2dx观察者模式其实很简单 《赵云要格斗》13文档格式.docx
《游戏开发引擎Cocos2dx观察者模式其实很简单 《赵云要格斗》13文档格式.docx》由会员分享,可在线阅读,更多相关《游戏开发引擎Cocos2dx观察者模式其实很简单 《赵云要格斗》13文档格式.docx(10页珍藏版)》请在冰豆网上搜索。
![游戏开发引擎Cocos2dx观察者模式其实很简单 《赵云要格斗》13文档格式.docx](https://file1.bdocx.com/fileroot1/2022-10/28/b390b1c7-5ab4-4b8b-b970-7e792aae4d6b/b390b1c7-5ab4-4b8b-b970-7e792aae4d6b1.gif)
从观察者模式来讲,CCNotificationCenter类是观察者模式中的目标对象(主题),而CCNotificationObserver则是观察者。
一个目标对象可以注册多个观察者,当目标对象的状态改变的时候,可以通知观察者对象作出相应的反应,这是标准的观察者模式的实现。
但是CCNotificationCenter稍微有些许差别,CCNotificationCenter不是通过自身状态改变来通知观察者,而是通过显式地发送观察者感兴趣的消息来通知它们,消息名称则是用来标识观察者是否感兴趣。
每次消息传递给CCNotificationCenter,CCNotificationCenter就会遍历所有的观察者,找到注册了该消息标识符的观察者,然后将消息发送给它们。
实现步骤
1、添加观察者:
在任何地方,只要你你对某个消息感兴趣(和pureMVC中的listNotification一样),你就可以在那里监听该消息。
1
void
addObserver(CCObject*
target,SEL_CallFuncO
callBack,const
char*
name,
CCObject*
data);
参数1为事件监听的目标,参数2为回调函数(即接收到消息后执行的函数),参数3为消息名,参数4为消息体。
具体实现如下:
2
3
4
CCNotificationCenter:
:
sharedNotificationCenter()->
addObserver(this,
callfunco_selector(GameLayer:
callBack),
name,
NULL
2、发送消息:
在需要发送消息的地方,调用postNotification方法即可,postNotification有两种,可以不带数据和带数据。
postNotification(const
name);
name,CCObject*
name是消息名,是消息唯一标识,在整个游戏过程中是唯一的,因此,我们一般把所有的消息名放在一个头文件中,纺织消息名重复,data是消息体,即发送的数据。
发送通知如下:
postNotification(name);
3、释放消息观察者:
释放消息观察者是很重要的,不释放的话,会产生内存泄露。
我们需要在析构函数方法里面,释放消息观察者。
removeObserver(
this,
name
//消息名
}
二、使用范例
1、一个层内使用观察者模式
首先,新建一个HelloWord的工程,然后HelloWorldScene.h添加
//添加目标通知观察者之后调用的事件
ObserverFunction(CCObject
*
object);
打开HelloWorldScene.cpp,在init()函数添加
//注册Message,如果接收到了,执行ObserverFunction
addObserver(this,callfuncO_selector(HelloWorld:
ObserverFunction),"
Message"
NULL);
然后HelloWorld:
~HelloWorld()添加:
//注意最后一定要释放消息,否则内容泄露
removeObserver(this,"
);
再实现函数:
5
HelloWorld:
object)
{
CCLOG("
You
Click
menuButton"
接下来就可以给观察都通知事件了~,这里我直接把项目的menu按钮的事件(它原本是退出的)改成:
//第一个参数是消息的名字,第二个参数是CCObject
类型的消息值,也就是你要发送的东西
postNotification("
看看效果:
观察都模式不仅可以通知更新,也可以传递数据,下面来看看第2个例子。
2、两个不同的层使用观察都模式
(1)首先,还是新建一个HelloWord工程,然后新建一个层类SecondLayer
头文件SecondLayer.h
6
7
8
9
10
11
12
13
14
15
16
17
18
#ifndef
__SecondLayer_SCENE_H__
#define
#include
"
cocos2d.h"
class
SecondLayer
public
cocos2d:
CCLayer
public:
virtual
bool
init();
~SecondLayer();
static
CCScene*
scene();
CREATE_FUNC(SecondLayer);
};
#endif
//
__SecondLayer_SCENE_H__
实现文件SecondLayer.cpp
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
SecondLayer.h"
USING_NS_CC;
SecondLayer:
scene()
CCScene
*scene
=
CCScene:
create();
*layer
scene->
addChild(layer);
return
scene;
}
~SecondLayer()
init()
if
(
!
CCLayer:
)
false;
addObserver(this,callfuncO_selector(SecondLayer:
true;
Receive
num=%d"
(int)object);
(2)使用
HelloWorldScene.cpp中添加头文件#include"
init()函数中添加:
SecondLayer*
second=SecondLayer:
this->
addChild(second,0);
改写项目menu按钮的事件:
menuCloseCallback(CCObject*
pSender)
int
num=CCRANDOM_0_1()*1000;
//0-1000的随机数
(CCObject
*)num);
//向观察者传递数据
(3)效果:
看到了吧,SenondLayer类可以收到目标发给它的消息了啦!
三、《赵云要格斗》中使用观察者模式
前面我们设计了一个技能冷却的类,不懂看这里Cocos2d-x技能冷却还要等多久?
---之游戏开发《赵云要格斗》(9),它是一个层类,现在我们要实现我们一旦按下特殊技能的按钮,赵云就要释放特殊技能(放大招),这里我的思路是在英雄类(即赵云)中设置成一个观察者,一旦观察到按下了特殊技能的按钮,而且技能不在冷却,那么赵云就停下所有动作,直接放大招。
英