`

Cocosd-x设计模式之五 :观察者模式

 
阅读更多

1、应用场景

前面在介绍单例模式的时候,提到了一个类CCNotificationCenter,它除了应用单例模式以外,还应用了观察者模式。CCNotificationCenter类是观察者模式中的目标对象,而CCNotificationObserver则是观察者。

一个目标对象可以注册多个观察者,当目标对象的状态改变的时候,可以通知观察者对象作出相应的响应。这是标准的观察者模式的实现,但是CCNotificationCenter稍微有些许差别。

首先,CCNotificationCenter不是通过自身状态改变来通知观察者,而是通过显式地发送观察者感兴趣的消息(postNotification)来通知它们。每一种消息类型可以对应多个观察者,同时,每一个观察者也可以“观察”多个消息类型。其次,观察者定义相应的响应事件同消息类型关联,当某个地方触发postNotification来广播一个消息的时候,CCNotificationCenter会遍历所有的观察者,判断它们注册的消息类型是否匹配,如果匹配,则触发相应的注册响应事件。最后,该观察者模式采用的是推模型,即由目标对象去通知所有的观察者。

其实CCNotificationCenter和CCNotificationObserver更准确的叫法是:订阅发布模式

2、使用此模式的优缺点

优点:

1)实现了目标对象和观察者之间的抽象耦合,在本例中,则是实现了消息与观察者的抽象耦合。可以定义一种消息与消息处理对象的一对多的关系,而不用担心彼此的实现细节。

2)观察者模式可以定义某种意义上的广播通信机制。

3)实现订阅者与发布者的松散耦合,同时保障了良好的扩展性。

缺点:

1)注册成为CCNotificationCenter的观察者后,如果忘记调用removeObserver,则会引起内存泄漏。因为addObserver会把观察者的引用计算加1.

3、此模式的定义及一般实现

定义:

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

UML图:

一般实现:参考CCNotificationCenter.h和CCNotification.cpp文件的实现

4、游戏开发中如何运用此模式

我们考虑cocos2d-x中一个非常典型的应用场景,你的GameScene里面有两个layer,一个gameLayer,它包含了游戏中的对象,比如玩家、敌人等。另一个层是HudLayer,它包含了游戏中显示分数、生命值等信息。如何让这两个层相互通信。

第一种办法,你可以让gameLayer包含一个hudLayer的引用,同时也可以让hudLayer包含一个gameLayer的引用。注意!这里问题出现了,如果两个类都包含彼此的强引用(所谓强引用就是retain),就会引起循环引用的情况,如果其中一个类包含的是弱引用,问题就不会出现。循环引用是使用引用计数管理内存的一个致命弱点,会导致资源永远得不到释放,而且查错起来非常麻烦。

第二种办法,把gameScene做成一个单例,同时让gameScene包含gameLayer和hudLayer的弱引用,这样就可以直接通过[GameScene sharedInstance].gameLayer或者[GameScene sharedInstance].hudLayer来访问了。

第三种办法,使用gameLayer->getParent()获得gameScene,再使用gameScene来获得hudLayer。

第四种办法,使用CCNotificationCenter。当hudLayer注册它感兴趣的消息,当gameLayer需要通知hudLayer的时候,只需通过CCNotificationCenter发送一个对应的消息即可。

5、此模式与其它模式的关系

观察者模式是实现MVC模式的重要组成部分,一个model可以对应多个views,model就是目标对象,而view则是观察者,当model改变的时候,要通知所有的view也相应的改变。

分享到:
评论

相关推荐

    基于cocosd-x引擎的神奇宝贝游戏系统的设计和实现.doc

    基于cocosd-x引擎的神奇宝贝游戏系统的设计和实现 本文主要介绍了基于cocosd-x引擎的神奇宝贝游戏系统的设计和实现。随着智能手机和3G、4G网络的普及,移动互联网以日新月异的发展趋势增长,手机已经成了人们必不可...

    Cocosd-x API 2.1版本的

    2.1版本是其历史版本之一,对于初学者和开发者来说,理解这个版本的API至关重要。Cocos2d-x基于C++,同时支持Lua和JavaScript脚本语言,使得游戏开发更具灵活性。 Cocos2d-x的API包含了许多核心概念和组件,例如...

    Cocosd-x文档(2.1)

    自制的cocos2dx参考文档 chm格式,查看方便,资源来源于cocos2dx官网,弥补官网没有chm文档下载在线的不方便查看而且格式不好的缺陷,该文档基于最新2.1发行版本,对于使用cocos2dx的开发人员有很大的帮助。

    cocos2d-x windows vs2010配置

    接着,打开一个新的 vs2010 程序,然后选择"文件—新建—项目",看到右面的 cocosd-*部分了吗?这就是刚刚那个 js 脚本添加进去的。 七、新建 HelloWorld 项目 最后一步,使用 Cocos2d-x 新建一个 HelloWorld,...

    cocos2d-x 《保卫萝卜》源代码

    《保卫萝卜》是一款深受玩家喜爱的塔防类游戏,它基于Cocos2d-x引擎开发。Cocos2d-x是一个跨平台的2D游戏开发框架,由C++编写,但支持Lua和Python等多种脚本语言,让开发者可以快速构建游戏。在这里,我们将深入探讨...

    cocos引擎老版本集合(cocos2d-x-2.2.1 - 3.5)

    cocos引擎老版本下载集合(cocos2d-x-2.2.1 - 3.5),分别有cocos2d-x-3.5、cocos2d-x-3.4、cocos2d-x-3.2、cocos2d-x-2.2.6、cocos2d-x-2.2.2和cocos2d-x-2.2.1。

    德州扑克算法cocos2d-x

    在本文中,我们将深入探讨基于Cocos2d-x游戏引擎实现的德州扑克算法。Cocos2d-x是一款广泛使用的开源2D游戏开发框架,它基于C++,支持跨平台开发,包括iOS、Android以及桌面系统。对于德州扑克游戏,算法是其核心...

    【Cocos2d-x 状态机篇】第03章源码

    本教程聚焦于Cocos2d-x中的状态机(FSM)设计模式,这是一种强大的工具,用于管理游戏对象的行为和状态转换。状态机使得游戏逻辑更加清晰,易于维护。 状态机是一种行为设计模式,它将一个对象的行为分解为一系列可...

    学习机源码开发

    在IT行业中,游戏开发是一项非常热门的技术领域,而Cocos2d-x则是一个广泛使用的开源游戏引擎,尤其适合跨...同时,对于初学者来说,分析现有源码是一种很好的学习方法,可以从中窥见实际项目中的设计思路和最佳实践。

    二维多边形的碰撞检测

    二维多边形碰撞检测是计算机图形学中的一个重要概念,它在游戏开发、物理模拟和图形渲染等领域有着广泛的应用。在C#中,我们可以利用GDI+(Graphics Device Interface Plus)库来实现这一功能。...

    配置Cocosd

    在本文中,我们将深入探讨...至此,你已经成功地在Mac上配置了Cocos2d-x开发环境,可以开始你的游戏开发之旅了。请注意,随着Cocos2d-x版本的更新,某些配置步骤可能会有所变化,建议定期查阅官方文档以获取最新信息。

    cocos2d-x实例——场景自动切换

    首先,我们需要了解Cocos2d-x中的`Director`类,它是整个游戏的管理者,负责调度场景的切换。使用`Director::replaceScene()`或`Director::pushScene()`方法可以实现场景之间的切换。`replaceScene()`会替换当前场景...

    chuanmeiLesson:创建传媒课程分支

    chuanmeiLesson传媒大学课程=================1.cppLesson:C++复习课程2.JavaLesson:Java课程学习3.AndroidLesson: Android课程4.Cocos2dxLesson:Cocosd2dx课程5.GameLesson: 游戏实战

    cocos2dx 水果忍者 2.0 简单版本

    2.0版本可能对游戏的物理引擎进行了优化,使得水果的飞行轨迹更加自然,切水果的反馈更真实,同时可能还增加了新的游戏模式或道具,以增强游戏的趣味性和挑战性。 针对iOS平台,开发者需要考虑设备的性能差异、不同...

    Cocos2D-中文版 文档

    Cocos2D支持多种平台,包括iOS、Android以及Mac OS X等。在这个文档集中,我们将深入探讨Cocos2D在iPhone和iPad游戏开发中的应用。 《Apress[1].Learn.iPhone.and.iPad.Cocos.2D.Game.Development.2010.pdf》这本书...

    cocos2d 带光标的多行输入框

    在Cocos2d游戏开发框架中,创建一个带...总的来说,创建一个带光标的多行输入框在Cocos2d中需要对UI设计、事件处理、文本操作和性能优化有深入理解。通过不断实践和调试,我们可以构建出用户友好且功能完善的输入界面。

    cocos2d例子

    cocos2d例子,js版本,用于测试,是关于游戏开发的,相当完善。

    cocos2d 例子 入门教程

    这个“cocos2d例子入门教程”旨在帮助初学者快速掌握Cocos2D的基础知识和开发技巧。 Cocos2D的核心概念包括场景(Scene)、层(Layer)、精灵(Sprite)和动作(Action)。场景是游戏或应用的主要容器,可以包含多...

    TexturePacker 3.1.2 破解版

    TexturePacker 3.1.2 for mac 破解版,谁用谁知道,不解释。

Global site tag (gtag.js) - Google Analytics