游戏设计模式 之 策略模式

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

你可能感兴趣的:(游戏设计模式 之 策略模式)