(6) 观察者模式

     联机射击游戏可以实时显示队友和敌人的存活信息,如果有队友或敌人阵亡,所有在线游戏玩家将收到相应的消息,可以提供一个统一的中央角色控制类(CenterController)来实现消息传递机制,在中央角色控制器中定义一个集合用于存储所有的玩家信息,如果某玩家角色(Player)阵亡,则调用CenterController的通知方法notifyPlayers(),该方法将遍历用户信息集合,调用每一个Player的display()方法显示阵亡信息,队友阵亡和敌人阵亡的提示信息有所不同,在使用notifyPlayers()方法通知其他用户的同时,阵亡的角色对象将从用户信息集合中被删除。可使用观察者模式来实现信息的一对多发送,类图如图6所示:

图6 观察者模式实例类图

在图6中,CenterController充当观察目标,Observer充当抽象观察者,Player充当具体观察者。在Player类中,name属性表示角色名,type属性表示角色类型,如“战队A”或“战队B”等。Player的die()方法执行时将调用CenterController的notifyPlayers()方法,在notifyPlayers()方法中调用其他Player对象的提示方法,如果是队友阵亡则调用displayTeam(),如果是敌人阵亡则调用displayEnemy();还将调用detach()方法删除阵亡的Player对象,其中CenterController类的notifyPlayers()方法代码片段如下所示:

for(Object player : players) {if(player.getName().equals(name)) {this.detach(player);  //删除阵亡的角色}else {if(player.getType().equals(type)) {player.displayTeam(name);  //队友显示提示信息}else {player.displayEnemy(name);  //敌人显示提示信息}}
}

      (7) 单例模式

为了节约系统资源,在联机射击游戏中可以使用单例模式来实现一些管理器(Manager),如场景管理器(SceneManager)、声音管理器(SoundManager)等,如图7所示的场景管理器SceneManager类:

图7 单例模式实例类图

SceneManager类的实现代码片段如下所示【注:以下代码未考虑多线程访问的问题】:

class SceneManager {private static SceneManager sManager = null;private SceneManager() {//初始化代码}public synchronized static SceneManager getInstance() {if(sManager==null) {sManager = new SceneManager();}return sManager;}public void manage() {//业务方法}
}

      (8) 状态模式

在射击游戏中,游戏角色存在几种不同的状态,如正常状态、暂停状态、阵亡状态等,在不同状态下角色对象的行为不同,可使用状态模式来设计和实现角色状态的转换,类图如图8所示:

图8 状态模式实例类图

在图8中,游戏角色类Player充当环境类,State充当抽象状态类,其子类NormalState、PauseState和DeathState充当具体状态类,在具体状态类的pause()、start()、beAttacked()等方法中可实现状态转换,其中NormalState类的代码片段如下所示:

class NormalState extends State
{public void pause()  //游戏暂停{//暂停代码省略player.setState(new PauseState(this));  //转为暂停状态}public void start()  //游戏启动{//游戏程序正在运行中,该方法不可用}public void beAttacked()  //被攻击{//其他代码省略if(lifeValue<=0){player.setState(new DeathState(this));  //转为阵亡状态}}public void shot()  //射击{//代码省略}public void move()  //移动{//代码省略}
}

       (9) 适配器模式

为了增加游戏的灵活性,某些射击游戏还可以通过游戏手柄来进行操作,游戏手柄的操作程序和驱动程序由游戏手柄制造商提供,为了让当前的射击游戏可以与游戏手柄兼容,可使用适配器模式来进行设计,类图如图9所示:

图9 适配器模式实例类图

在图9中,GamepadsAdapter充当适配器,它将游戏手柄中按键(GamepadsKey)的方法适配到现有系统中,在其move()方法中可以调用MoveKey类的handle()方法,在其shot()方法中可以调用ShotKey的handle()方法,从而实现通过手柄来控制游戏运行。

【作者:刘伟 http://blog.csdn.net/lovelion】

多人联机射击游戏中的设计模式应用(二)相关推荐

  1. 【转】多人联机射击游戏中的设计模式应用(一)

    为了方便大家更加系统地学习和掌握各种常用的设计模式,下面通过一个综合实例--"多人联机射击游戏"来学习如何在实际开发中综合使用设计模式. 反恐精英(Counter-Strike, ...

  2. 多人联机射击游戏中的设计模式应用

    转:http://blog.csdn.net/lovelion/article/details/8262987 反恐精英(Counter-Strike, CS).三角洲部队.战地等多人联机射击游戏广受 ...

  3. 多人联机射击游戏中的设计模式应用(一)

    为了方便大家更加系统地学习和掌握各种常用的设计模式,下面通过一个综合实例--"多人联机射击游戏"来学习如何在实际开发中综合使用设计模式. 反恐精英(Counter-Strike, ...

  4. Unity Networking开发多人联机射击游戏

    UNet开发多人联机射击游戏 引言: Networking作为Unity官方的用于开发多人在线游戏的网络模块,开发者可以不用自己搭建网络模块的底层,通过使用Unity提供的一些相关组件,可以轻松实现简 ...

  5. 上班最强摸鱼游戏-多人联机小游戏 (一)

    highlight: a11y-dark 多人在线射击游戏.最强摸鱼游戏 在想体验地址====> github地址: 开发不易,多谢大哥大姐们点个start吧,点个小爱心吧 技术栈 canvas ...

  6. 游戏开发入门(二)游戏中的设计模式

    视频链接:游戏开发入门(二)游戏中的设计模式(3节课 时常:约2小时40分钟) 该视频主要围绕游戏中常见的设计模式展开讲解并实践,需要大家多多实践与理解 笔记与总结(请先学习视频内容): 1.有必要深 ...

  7. 手机射击游戏中弹幕的开发

    射击游戏中弹幕的开发 http://blog.vckbase.com/knight/archive/2005/03/29/4174.html 作者:牛阿牛      2005-02-28 nhf_20 ...

  8. 在浏览器中创建一个多人海盗射击游戏:

    制作多人游戏具有挑战性,原因有以下几个:托管成本昂贵,设计棘手且难以实施. 通过本教程,我希望解决最后一个障碍. 这是针对那些知道如何制作游戏并熟悉JavaScript但从未制作过在线多人游戏的开发人 ...

  9. 游戏中的设计模式(1)--观察者模式

    作为本系列文章的第一篇,笔者在此想表达一下个人对于设计模式的一些理解.因此笔者自问自答几个问题.1,什么是设计模式?2,在软件快速迭代的今天,设计模式是否重要?3,四人帮提出了23个设计模式,是不是设 ...

最新文章

  1. 都是套路!要毁灭人类、喷马斯克、还获得公民身份的机器人Sophia,真相确是...
  2. Python时间序列模型推理预测实战:时序推理数据预处理(特征生成、lstm输入结构组织)、模型加载、模型预测结果保存、条件判断模型循环运行
  3. 日志系统新贵 Loki,真香!!
  4. php 两个二维数组怎么去重,php 二维数组怎么不去重合并
  5. DATA SHARING Help JetBrains improve its products by sending anonymous data about features and plugin
  6. matlab ssb,MatlabSSB信号的仿真分析.doc
  7. 计算机网络路由器方面的论文,简析计算机网络问题中路由器故障的论文
  8. 匹配objectuse rootsift= sqrt( sift / sum(sift) ) to improve object retrieval
  9. 浏览器兼容性-JS篇
  10. python flask 分页_python flask实现分页效果
  11. 《数据挖掘概念与技术》读书笔记
  12. Tomcat线程池原理
  13. 全国所有火车站站点信息
  14. 酞菁-氧化石墨烯(NiPc- NHCO-EGO)|齐岳生物提供酞菁定制材料
  15. sql服务器虚拟内存不足,SQL Server虚拟内存不足的解决方法
  16. php smarty框架案例,PHP框架_Smarty
  17. 传统零售加速向新零售演进升级,零售数字化势在必行
  18. 使用xshell登陆腾讯云主机
  19. python强制终止_python强制终止
  20. 高通android q 通过backtrace,使用addr2ine工具,定位crash问题记录

热门文章

  1. 我的vscode的C/C++配置
  2. 面试iOS招聘题 机会在自己手中
  3. Hive 观看时长秒数、毫秒数转化为时分秒格式
  4. cocos-lua 多重继承的iskindof的BUG
  5. gtsam配置MATLAB toolbox
  6. .net core 登入全局验证过滤器
  7. 什么是数据库的执行计划?
  8. Qihoo360/RePlugin 简单项目构建
  9. 中央处理器 —— 硬布线控制器和微程序控制器
  10. MongoDB Windows环境备份和还原