转:http://blog.csdn.net/lovelion/article/details/8262987

反恐精英(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类的代码片段如下所示:

public class Magazine {
private ArrayList weapons;
private Iterator iterator;
public Magazine() {
weapons = new ArrayList();
iterator = weapons.iterator();
}
public void display() {
while(iterator.hasNext()) {
((Weapon)iterator.next()).display();
}
}
......
}

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

      (5) 命令模式

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

图5 命令模式实例类图

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

……
<FunctionMapping keycode="87" commandClass="ShotCommand"/>
<FunctionMapping keycode="38" commandClass="GoAheadCommand"/>
……

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

(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()方法,从而实现通过手柄来控制游戏运行。

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

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

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

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

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

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

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

  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. modbus-rtu qt4-serialport1------ xp as host
  2. Python3 模块相关及输入输出模式
  3. [转载]从MyEclipse到IntelliJ IDEA-让你摆脱鼠标,全键盘操作
  4. C++构造函数详解(复制构造函数)
  5. 培养逻辑思维的app_数学逻辑思维app哪个好
  6. 控制理论个人学习笔记-非线性系统理论
  7. 防止电脑自动锁屏(Windows系统)
  8. [每日一氵] Python 训练过程中,如何优雅的保存loss
  9. iOS UILable换行相关设置
  10. 互联网早报:腾讯推出“电子签平台” 用微信就能开出具备法律效力的电子收据
  11. 程序猿真的觉得写代码比女朋友重要吗?
  12. uni-app -- 改变页面背景颜色
  13. 3月面试字节一面就被刷,9月二战字节终于上岸,准备了小半年,这我要个28K应该也不过分吧?
  14. Java面向对象程序设计实训教程_JAVA课程实验报告 实验二 JAVA面向对象程序设计...
  15. 基于MRS-Hudi构建数据湖的典型应用场景介绍
  16. 【QT】QT菜单栏、状态栏、工具栏
  17. 王垠 我和Google的故事
  18. Shellmo:用于娱乐和教育的Aquatic 3D打印机器人
  19. 首都师范 博弈论 4 1 1三人博弈的纳什均衡
  20. 3D动画片《不一样的卡梅拉》(小鸡来了) 中文版高清 23集,法国名著改编

热门文章

  1. RapidJSON 代码剖析(三):Unicode 的编码与解码
  2. 关于金融类APP测试的策略分析
  3. 给即将大三找方向的同学:放下焦虑,行动起来
  4. G1收集器STAB详解
  5. ios uri正则表达式_正确匹配URL的正则表达式
  6. 【新手入门嵌入式实验室】学习方向指导和建议
  7. 设计模式读书笔记(读后感)
  8. android开发 获取相册名称_android通过拍照、相册获取图片并显示 实例完整源码下载(亲测通过)...
  9. 林业有害生物防控远程实时监测及远程诊断系统
  10. hello dell