zoukankan      html  css  js  c++  java
  • GoF之状态(State)模式

    状态模式的定义

    状态模式,在GOF中的解释是:让一个对象的行为随着内部状态的改变而改变,而该对象也像换了类一样


     普通状态模式的UML图


    使用状态模式实现游戏场景的切换

       在Unity3D的环境中,一次运行只能在一个场景中运行,一个场景负责一个不同的功能,而状态模式每次同样也只能存在一个在运行的状态,所以设计游戏的时候,我们

    可以将一个状态和一个游戏场景进行绑定;场景之间的转换便成为了状态之间的切换;状态由一个状态控制器(StateController)控制,每个状态不必关注上一个状态的情况,

    增加一个场景的时候,也不需要改变太多之前设计的东西,只需要重新设计一个继承与基础状态类的子类,修改状态控制器,在一定程度上也减少了代码的修改,符合开闭原

    则,减少了状态之间的依赖程度。


     

    状态模式的优点

    减少错误的发生并降低维护难度     

      不在使用switch case来判断当前的状态,可以减少新增状态时候修改switch case带来的错误,符合开闭原则。

    状态执行环境单一化

      与每一个状态有关的对象及操作都被是现在一个场景状态下,对程序设计者来说,可以清楚的知道每一个状态执行时候

    所需要的对象及配合的类

    不同项目之间的共享

      状态模式可以用于不同状态之间的共享,例如开始场景和开始状态可用于游戏的载入场景,加载游戏的一些初始化工作,如游戏的载入动画等。

    特别是在网络在线游戏项目中,玩家的上线,登录,验证,数据同步等过程,实现上存在一定的复杂度,并且相同公司不同游戏项目这些操作重复度很高,

    如果将这些复杂重复的操作放在共享场景中,共享使用与维护,就可以在一定程度上减少开发时间和成本。


    状态模式面对变化

      当游戏后期游戏企划提出新的系统功能来增加游戏内容的时候,这些提案可能是增加游戏小关卡,提供查看角色信息图鉴,玩家排行等功能。当程序设计人员

    分析这些新增功能的需求后,如果觉得在现有的场景中解决不了,或者修改过多的话,可以尝试设计一个新的场景来完成这些功能。这是我们需要:

      在Unity3D中新建一个场景

      加入一个新的场景切换状态类,对应新的场景上,与之绑定,并在类中实现相关功能。

      决定要从那个现有的场景切换到新的场景

      决定新的场景结束后要转换到那个场景

    上述流程就程序的代码设计而言,只是增加一个场景状态类,增加一些相关功能的类文件,不会设计到太多原有类的修改或者替换,符合一定的开闭原则。


    状态模式的其他应用方式

    角色AI

      使用状态模式来控制角色的不同状态下的AI行为。

    游戏服务器连接状态

      网络游戏的客户端,需要处理与游戏服务器的连接状态,一般包含了开始连接,连接中,断线等状态,而在不同的状态下,会有不同的封包信息处理方式,需要

    分别实现。

    游戏关卡设计

      如果是通关类型游戏,进入关卡时候通常会分成不同的阶段,包含加载数据,显示管卡信息,倒数通知开始,关卡进行,关卡结束和分数计算,这些不同的阶段可以用不同的

    状态类进行负责。


      至此,状态模式的随笔结束,此文只是作为学习的小结,感谢蔡升达先生的书籍《设计模式与游戏完美开发》。

      另附github练习源码:状态模式练习

  • 相关阅读:
    CodeForces
    CodeForces
    Comet OJ
    CodeForces
    2019年第五届计蒜之道复赛总结
    2019计蒜之道初赛4 B. 腾讯益智小游戏—矩形面积交(简单)(矩形交集)
    2019计蒜之道初赛3 D. 阿里巴巴协助征战SARS(困难)(大数取余+欧拉降幂)
    2018计蒜之道复赛 贝壳找房函数最值(贪心+优先队列)
    牛客想开了大赛2 A-【六】平面(切平面)
    2018年第九届蓝桥杯国赛试题(JavaA组)
  • 原文地址:https://www.cnblogs.com/springword/p/8203280.html
Copyright © 2011-2022 走看看