项目中关于策略模式的使用

我们在开发游戏的时候经常会用到各种各样的设计模式,例如常见的单利模式,工厂模式(简单工厂,工厂方法,抽象工厂),观察者模式,等等,不过光在网上看一些用例,却也是只看表面能“略懂”而真正到实际项目中却不知道怎么下手,以至于在做项目的时候将这些设计模式强制加入,设计模式本就是为了能将项目做的通俗易懂,易于维护修改,好的代码并不是别人看了看不懂,而是别人看了能立刻明了,比如公司里有一个同事有事辞职了,他以前的代码都交给你维护了,因为他写的代码风格与你的不一样,而且写的比较杂乱,以至于你看他的代码有一种从心里就想“read the fucking code”的冲动,后期维护太艰难,想给他重写吧,又需要时间项目不允许,给他改吧又看不懂,哎,说多了都是泪。

吐槽完了,接下来说一下本人对设计模式中的策略模式的理解,都是个人看法,如有见解忘及时指出。

 

前几天在做项目中的一个小功能,转盘抽奖,一开始觉得很简单不难,不就是个转盘在哪里转吗,直接让他转就是喽,定位到一个位置就提示相应的奖励。不过后来才发现项目里用的不是那种传统的转盘,而是类似于“熊猫机”的那种光圈随着物品在移动的功能,心里又想这也不难啊,将所有奖励物品的游戏对象放进一个链表里,每隔一段时间依次取出一个对象将坐标赋值给光圈,就让它动呗,然后就一直做,做完了,发现这有问题啊,转起来跟游戏机上面的不一样啊感觉,少了减速的效果,然后又开始改,将取出的时间间隔乘以一个速度变量,动态的去改变这个速度来实现慢慢减速,效果也实现了,然后又出问题了,转盘里要有一个“暴击”效果,也就是在转到指定的物品的时候要再次转一遍,然后就不能做减速运动了,就要做成那种匀加速,现在项目中的转盘要用到“匀速”“匀加速”“匀减速”“不规则速度”,轮到策略模式上场了。上代码:

 

WheelContext 转盘旋转控制类

 

 public class WheelContext

 

里面的关键代码。

 

/// <summary>
/// 转盘动画驱动
/// </summary>
/// <returns>动画是否完成</returns>
public void OnUpdate()
{
if (!isStart) return;
mTime += Time.smoothDeltaTime * mSpeed;
if (mTime >= 1)
{
mTime = 0;
mPlayCount--;
curWheelStrategy.AlgorithmInterface(ref mSpeed, mPlayCount, bb);
if (PlayCallBack != null){
if (mPlayCount > 0){
PlayCallBack(false);
}
else{
isStart = false;
PlayCallBack(true);
}
}
}
}

旋转基类:

 

/// <summary>
/// 转盘旋转算法策略抽象
/// </summary>
public abstract class WheelStrategy
{
public abstract void AlgorithmInterface(ref float speed, float playCount, float totalPlayCount);
}

 

各个子类

 

/// <summary>
/// 匀加速旋转
/// </summary>
public class AcceleratedEqually : WheelStrategy
{
public override void AlgorithmInterface(ref float speed, float playCount, float totalPlayCount)
{

}
}

 

/// <summary>
/// 不规则旋转
/// </summary>
public class Anomaly : WheelStrategy
{
public override void AlgorithmInterface(ref float speed, float playCount, float totalPlayCount)
{
if (playCount > totalPlayCount - 4)
{
speed += 1.5f;
}
else if (playCount < 5)
{
if (playCount == 4)
{
speed = 10;
}
else
{
speed -= 3;
}
}
else
{
speed = 15;
}
}
}

 

 

 

 

 

 

 

然后匀速的跟上面一样,就是类名不一样

 

 

调用的时候

 

// Update is called once per frame
void Update () {
if (mWt == null)
{
mWt = new WheelContext();
}
mWt.OnUpdate();
}

 

在updata里面每帧调用一下旋转管理类里面的OnUpdata方法,方法里会有一个cueWheelStrategy变量,利用多态将继承它的子类实例赋值,再去调用抽象的Algorithminterface函数,这样就可以将各个旋转控制速度的算法分给各个子类来实现了,如果以后要加别的样子的速度算法就直接继承那个基类再去调用就ok了。

 

 

头一次写博客,如有不好的地方请多多指出。

转载于:https://www.cnblogs.com/huangguadazhanxihongshi/p/5234321.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值