美文网首页
游戏设计模式 之 策略模式

游戏设计模式 之 策略模式

作者: 徐福气的小想法 | 来源:发表于2020-01-11 21:54 被阅读0次
    strategy.gif

    引擎:CocoCreator2.1.0
    语言:TypeScript
    Git仓库地址:https://github.com/superXfx/GameDesignPatterns.git

    定义——
    封装算法,并可在运行时切换,切算法的变化独立于其的使用者。

    此demo中使用 策略模式 来处理英雄“变身”时两种不同的移动逻辑。
    即Move行为独立于Hero,将Move于Hero解耦,并可以在运行时切换。

    类图——


    Strategy.jpg

    从类图中可以发现,从MoveBehavior类派生出MoveNormal和MoveRotation两个Move的具体类。
    Hero持有MoveBehavior的引用并可在运行时用具体类赋值它,从而切换行为。

    接下来看看代码具体实现
    1、基类 MoveBehavior


    image.png

    2、派生类,MoveNormal,MoveRotation


    image.png image.png

    从代码可以看出:
    1>update()方法是move行为真正执行的地方,派生类继承并实现update来实现自己的move行为。
    2>setDir(dir)方法则是设置移动方向
    3>至于packParam(),unPackParam(dt)比较有趣,它是用来在切换行为时,“继承”上一个行为的参数用的。
    在这里就是dir参数,即切换move行为后保持方向不变



    接下来看看move行为的拥有者Hero,以及对Move行为的具体使用方法。


    image.png image.png

    1>首先Hero持有一个Move行为的引用,即MoveBehavior,显而易见。
    2>在changeHero中会动态的切换Move行为,
    即this.mMoveInterface = new MoveNormal(this); 或 this.mMoveInterface = new MoveRotation(this);
    非常简单,简洁优雅的就改变了Hero的行为。
    另外切换前使用packParam(),unPackParam(data)传递参数。
    3>前面说过,真正的move行为在update中实现,那么在Hero的update中驱动Move行为的update即可。

    至此,策略模式 在Hero移动上的应用已经全部完成,可以发现两个很棒的优点:
    1、Move行为与Hero解耦。
    这意味着Move行为可以应用在任何可移动体上。比如敌人甚至炮弹上。
    2、当有新的Move行为时,可以做到“对扩展开放,对修改关闭”原则
    只需实现一个新的行为类——此处是扩展开放。
    而不需要修改任何现有代码——此处是对修改关闭。

    下一篇,游戏设计模式 之 触发器
    https://www.jianshu.com/p/8427617be61e

    相关文章

      网友评论

          本文标题:游戏设计模式 之 策略模式

          本文链接:https://www.haomeiwen.com/subject/qxdynctx.html