为了方便大家更加系统地学习和掌握各种常用的设计模式,下面通过一个综合实例——“多人联机射击游戏”来学习如何在实际开发中综合使用设计模式。

反恐精英(Counter-Strike, CS)、三角洲部队、战地等多人联机射击游戏广受玩家欢迎,在多人联机射击游戏的设计中,可以使用多种设计模式。下面我选取一些较为常用的设计模式进行分析:

      (1) 抽象工厂模式

在联机射击游戏中提供了多种游戏场景,不同的游戏场景提供了不同的地图、不同的背景音乐、不同的天气等,因此可以使用抽象工厂模式进行设计,类图如图1所示:

图1 抽象工厂模式实例类图

在图1中,SceneFactory充当抽象工厂,其子类SceneAFactory等充当具体工厂,可以创建具体的地图(Map)、背景音乐(Music)和天气(Weather)等产品对象,如果需要增加新场景,只需增加新的具体场景工厂类即可。

      (2) 建造者模式

在联机射击游戏中每一个游戏人物角色都需要提供一个完整的角色造型,包括人物造型、服装、武器等,可以使用建造者模式来创建一个完整的游戏角色,类图如图2所示:

图2 建造者模式实例类图

在图2中,PlayerCreatorDirector充当指挥者角色,PlayerBuilder是抽象建造者,其子类PlayerBuilderA和PlayerBuilderB是具体建造者,用于创建不同的游戏角色,Player是所创建的完整产品,即完整的游戏角色,它包含形体(body)、服装(costume)和武器(weapon)等组成部分。

      (3) 工厂方法模式

在射击游戏中,AK47冲锋步枪、狙击枪、**枪等不同武器(Weapon)的外观、使用方法和杀伤力都不相同,玩家可以使用不同的武器,而且游戏升级时还可以增加新的武器,无需对现有系统做太多修改,可使用工厂方法模式来设计武器系统,类图如图3所示:

图3 工厂方法模式实例类图

在图3中,WeaponFactory接口表示抽象武器工厂,其子类AK47GunFactory生产AK47Gun,SniperRifleFactory生产SniperRifle,不同的武器的display()、use()和fire()等方法有不同的实现。

      (4) 迭代器模式

在射击游戏中,一个玩家可以拥有多种武器,如既可以拥有AK47冲锋枪,还可以拥有**枪和匕首,因此系统需要定义一个弹药库(武器的集合),在游戏过程中可以遍历弹药库(Magazine),选取合适的武器,在遍历弹药库时可使用迭代器模式,如类图如图4所示:

图4 迭代器模式实例类图

在类Magazine中,可以通过迭代器遍历弹药库,Magazine类的代码片段如下所示:

 
[java] view plaincopy
  1. public class Magazine {
  2. private ArrayList weapons;
  3. private Iterator iterator;
  4. public Magazine() {
  5. weapons = new ArrayList();
  6. iterator = weapons.iterator();
  7. }
  8. public void display() {
  9. while(iterator.hasNext()) {
  10. ((Weapon)iterator.next()).display();
  11. }
  12. }
  13. ......
  14. }

除了遍历弹药库外,迭代器模式还可以用于遍历战队盟友等聚合对象。

      (5) 命令模式

在射击游戏中,用户可以自定义快捷键,根据使用习惯来设置快捷键,如“W”键可以设置为“开枪”的快捷键,也可以设置为“前进”的快捷键,可通过命令模式来实现快捷键设置,类图如图5所示:

图5 命令模式实例类图

在图5中,ShortcutKey充当请求调用者,在其press()方法中将判断用户按的是哪个按键,再调用命令对象的execute()方法,在具体命令对象的execute()方法中将调用接收者如ShotHandler、GoAheadHandler的action()方法来执行具体操作。在实现时可以将具体命令类类名和键盘按键的键码(Keycode)存储在配置文件中,配置文件格式如下所示:

 
[html] view plaincopy
  1. ……
  2. <FunctionMapping keycode="87" commandClass="ShotCommand"/>
  3. <FunctionMapping keycode="38" commandClass="GoAheadCommand"/>
  4. ……

如果需要更换快捷键,只需修改键码和具体命令类的映射关系即可;如果需要在游戏的升级版本中增加一个新功能,只需增加一个新的具体命令类,可通过修改配置文件来为其设置对应的按键,原有类库代码无需任何修改,很好地符合开闭原则。

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

转载于:https://www.cnblogs.com/duzib/p/3168816.html

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

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

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

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

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

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

          (6) 观察者模式      联机射击游戏可以实时显示队友和敌人的存活信息,如果有队友或敌人阵亡,所有在线游戏玩家将收到相应的消息,可以提供一个统一的中央角色控制类(CenterContr ...

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

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

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

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

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

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

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

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

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

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

  9. unity 第三人称射击游戏中如何防止跟随摄像机穿墙?

    在制作3d射击类游戏中,会遇到跟随角色的摄像机会穿透墙壁导致视野不佳情况,下面,介绍一下具体的解决方法. 我们需要用到的原理就是unity中射击线函数.具体的原理是,从相机的跟随点向相机的方向发射一条 ...

最新文章

  1. 数字通信原理_光纤通信原理是什么 光纤通信应用领域介绍【图文】
  2. 一句white-space:nowrap解决IE6,IE7下浮动元素不自动换行
  3. 解析SharedPreferences
  4. ECShop 模板库项目功能详解
  5. python set使用
  6. 如何在Android模拟器上安装和卸载APK程序包
  7. maximum mean discrepancy
  8. 安装django库 指定2.0版本
  9. 乔春洋:品牌文化的意义
  10. python相关工具使用技巧(pip)
  11. jquery 之简单好用的分页插件的使用方法 jQuery分页插件pageGroup.js
  12. 继续教育计算机组成原理a试卷,计算机组成原理试卷.docx
  13. 以太网转串口代码C语言,基于STM32 串口转以太网收发数据(stm32移植代码+网络调试助手等)...
  14. 【基础知识】【模块介绍】电机编码器
  15. python 生成16位integer
  16. 无序列表将点替换成图片
  17. 在word中写出打勾的方框
  18. mysql 时间函数的使用
  19. 关于Kaggle入门
  20. C++基础语法:字符串

热门文章

  1. 写给程序员的最好的13条建议
  2. u3d无锯齿遮罩shader-可用于ugui
  3. 3.db2性能和优化
  4. MySQL性能优化的21条最佳经验【转】
  5. 【maven】 pom.xml内容没有错,但一直报错红叉 解决办法
  6. 【VM单机模拟系列】VMware P2V简单实现
  7. [转帖]爬过这 6 个坡,你就能对 Linux 操作系统了如指掌
  8. MySQL:参数wait_timeout和interactive_timeout以及空闲超时的实现【转】
  9. Caffe---Pycaffe进行网络结构(xxx.prototxt)可视化
  10. Codeforces Beta Round #17 D. Notepad (数论 + 广义欧拉定理降幂)