引擎: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
网友评论