游戏开发引擎Cocos2dx观察者模式其实很简单 《赵云要格斗》13.docx

上传人:b****2 文档编号:2274789 上传时间:2022-10-28 格式:DOCX 页数:10 大小:19.10KB
下载 相关 举报
游戏开发引擎Cocos2dx观察者模式其实很简单 《赵云要格斗》13.docx_第1页
第1页 / 共10页
游戏开发引擎Cocos2dx观察者模式其实很简单 《赵云要格斗》13.docx_第2页
第2页 / 共10页
游戏开发引擎Cocos2dx观察者模式其实很简单 《赵云要格斗》13.docx_第3页
第3页 / 共10页
游戏开发引擎Cocos2dx观察者模式其实很简单 《赵云要格斗》13.docx_第4页
第4页 / 共10页
游戏开发引擎Cocos2dx观察者模式其实很简单 《赵云要格斗》13.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

游戏开发引擎Cocos2dx观察者模式其实很简单 《赵云要格斗》13.docx

《游戏开发引擎Cocos2dx观察者模式其实很简单 《赵云要格斗》13.docx》由会员分享,可在线阅读,更多相关《游戏开发引擎Cocos2dx观察者模式其实很简单 《赵云要格斗》13.docx(10页珍藏版)》请在冰豆网上搜索。

游戏开发引擎Cocos2dx观察者模式其实很简单 《赵云要格斗》13.docx

游戏开发引擎Cocos2dx观察者模式其实很简单《赵云要格斗》13

游戏开发引擎—Cocos2d-x观察者模式其实很简单--之游戏开发《赵云要格斗》(13)

本文检索关键词:

游戏引擎,游戏开发引擎,cocos引擎html5游戏开发

本文主要详细讲解了设计模式中的观察都模式及其在Coco2d-x的简单应用,最后,结合游戏中的技能冷却类放大招进行了一个使用。

Cocos2d-x版本:

2.2.5

工程环境:

Windows7+VS2010

打开方式:

将工程放在cocos2d-x安装目录下的project文件夹下用VS打开

先来看看效果:

 

一、观察者模式简介 

观察者模式(有时又被称为发布/订阅模式)是软件设计模式的一种。

在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。

这通常透过呼叫各观察者所提供的方法来实现。

此种模式通常被用来实作事件处理系统。

《24天学会设计模式----观察者模式》一文中有更加详细的介绍,有兴趣可以看这里。

在开发游戏的时候我们经常需要在层与层之间、场景与场景之间传递数据和消息,Cocos2dx框架应用观察者模式为我们封装了一CCNotificationCenter类,也叫消息通知中心,它也是一个单例类。

从观察者模式来讲,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为消息体。

具体实现如下:

1

2

3

4

  CCNotificationCenter:

:

sharedNotificationCenter()->addObserver(this,

        callfunco_selector(GameLayer:

:

callBack),

        name,

        NULL

2、发送消息:

在需要发送消息的地方,调用postNotification方法即可,postNotification有两种,可以不带数据和带数据。

1

2

void postNotification(const char* name);

void postNotification(const char* name,CCObject* data);

name是消息名,是消息唯一标识,在整个游戏过程中是唯一的,因此,我们一般把所有的消息名放在一个头文件中,纺织消息名重复,data是消息体,即发送的数据。

发送通知如下:

1

CCNotificationCenter:

:

sharedNotificationCenter()->postNotification(name);

3、释放消息观察者:

释放消息观察者是很重要的,不释放的话,会产生内存泄露。

我们需要在析构函数方法里面,释放消息观察者。

1

2

3

4

CCNotificationCenter:

:

sharedNotificationCenter()->removeObserver(

         this,

         name  //消息名

}

二、使用范例

1、一个层内使用观察者模式

首先,新建一个HelloWord的工程,然后HelloWorldScene.h添加

1

2

//添加目标通知观察者之后调用的事件  

void ObserverFunction(CCObject * object);

打开HelloWorldScene.cpp,在init()函数添加

1

2

//注册Message,如果接收到了,执行ObserverFunction  

CCNotificationCenter:

:

sharedNotificationCenter()->addObserver(this,callfuncO_selector(HelloWorld:

:

ObserverFunction),"Message",NULL);

然后HelloWorld:

:

~HelloWorld()添加:

1

2

//注意最后一定要释放消息,否则内容泄露  

 CCNotificationCenter:

:

sharedNotificationCenter()->removeObserver(this,"Message");

再实现函数:

1

2

3

4

5

//添加目标通知观察者之后调用的事件  

void HelloWorld:

:

ObserverFunction(CCObject * object)  

{  

    CCLOG("You Click menuButton");  

}

接下来就可以给观察都通知事件了~,这里我直接把项目的menu按钮的事件(它原本是退出的)改成:

1

2

//第一个参数是消息的名字,第二个参数是CCObject * 类型的消息值,也就是你要发送的东西  

CCNotificationCenter:

:

sharedNotificationCenter()->postNotification("Message",NULL);

看看效果:

观察都模式不仅可以通知更新,也可以传递数据,下面来看看第2个例子。

2、两个不同的层使用观察都模式

(1)首先,还是新建一个HelloWord工程,然后新建一个层类SecondLayer

头文件SecondLayer.h

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

#ifndef __SecondLayer_SCENE_H__  

#define __SecondLayer_SCENE_H__  

   

#include "cocos2d.h"  

   

class SecondLayer :

 public cocos2d:

:

CCLayer  

{  

public:

  

    virtual bool init();    

    ~SecondLayer();  

    static cocos2d:

:

CCScene* scene();  

    CREATE_FUNC(SecondLayer);  

   

    //添加目标通知观察者之后调用的事件  

    void ObserverFunction(CCObject * object);  

};  

   

#endif // __SecondLayer_SCENE_H__

实现文件SecondLayer.cpp

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

#include "SecondLayer.h"  

   

USING_NS_CC;  

   

CCScene* SecondLayer:

:

scene()  

{  

   

    CCScene *scene = CCScene:

:

create();  

    SecondLayer *layer = SecondLayer:

:

create();  

    scene->addChild(layer);  

    return scene;  

}  

SecondLayer:

:

~SecondLayer()  

{  

    //注意最后一定要释放消息,否则内容泄露  

    CCNotificationCenter:

:

sharedNotificationCenter()->removeObserver(this,"Message");  

}  

bool SecondLayer:

:

init()  

{  

    if ( !

CCLayer:

:

init() )  

    {  

        return false;  

    }  

    //注册Message,如果接收到了,执行ObserverFunction  

    CCNotificationCenter:

:

sharedNotificationCenter()->addObserver(this,callfuncO_selector(SecondLayer:

:

ObserverFunction),"Message",NULL);  

    return true;  

}  

   

//添加目标通知观察者之后调用的事件  

void SecondLayer:

:

ObserverFunction(CCObject * object)  

{  

    CCLOG("SecondLayer Receive num=%d",(int)object);  

}

(2)使用

HelloWorldScene.cpp中添加头文件#include"SecondLayer.h"

init()函数中添加:

1

2

SecondLayer* second=SecondLayer:

:

create();  

    this->addChild(second,0);

改写项目menu按钮的事件:

1

2

3

4

5

6

void HelloWorld:

:

menuCloseCallback(CCObject* pSender)  

{  

       

    int num=CCRANDOM_0_1()*1000;//0-1000的随机数  

    CCNotificationCenter:

:

sharedNotificationCenter()->postNotification("Message",(CCObject *)num);//向观察者传递数据  

}

(3)效果:

看到了吧,SenondLayer类可以收到目标发给它的消息了啦!

三、《赵云要格斗》中使用观察者模式

前面我们设计了一个技能冷却的类,不懂看这里Cocos2d-x技能冷却还要等多久?

---之游戏开发《赵云要格斗》(9),它是一个层类,现在我们要实现我们一旦按下特殊技能的按钮,赵云就要释放特殊技能(放大招),这里我的思路是在英雄类(即赵云)中设置成一个观察者,一旦观察到按下了特殊技能的按钮,而且技能不在冷却,那么赵云就停下所有动作,直接放大招。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1