继续上一篇内容,这次说塔防类型游戏的炮塔设计思路
图片压缩gif的时候有问题..但是可以将就看.
这里我一共实现了5种炮塔的攻击:
- 单体暴击
- 范围群攻
- 毒液
- 减速
- 整排攻击
先说下我之前见过的这类游戏的源码,然后再说下我的做法.
看过的几个源码,基本上实现的思路就是:
- 炮塔选中目标
- 炮塔发射子弹
- 炮塔控制子弹
- 子弹打中目标
- 炮塔根据自身攻击计算损失血量,或者怪物收到炮塔攻击事件,计算血量
这种做法看起来还是蛮流畅的,但实际上拓展性不是很好.设计上来讲,这种做法把炮塔与子弹耦合在了一起,导致把他俩变成了一个整体,不便于后面整个游戏内容策划的修改,或者延展,而且代码看起来应该也会很多.
我的做法流程大体如下:
- 炮塔选中目标
- 炮塔创建子弹,告诉子弹目标以及炮塔的攻击力
- 子弹自行计算轨迹,控制位置移动(从这里开始,身为子弹,我只知道我的目标,不知道谁把我弄出来的)
- 子弹打中目标
- 根据自身属性,以及不知道谁告诉我的攻击力数值,进行掉血计算
这样做是不是就把炮塔以及子弹分成了两个个体,这种做法其实也可以把子弹叫成技能,炮塔的技能.
炮塔的设计:初期设计的时候,在炮塔基类内,只需实现目标选中,发射炮弹即可,然后子类里面做一些特效处理,例如:攻击动画,待机动画,转向动画,等一些显示方面的事情,我只做我自己该做的事情.至于我发射出来什么子弹,就不是我关心的问题了,如果游戏足够复杂,这部分后边也可以做成工具,策划只需要给不同炮塔配置相关技能就好
子弹(技能)的设计:这里面就很简单了.因为在子弹这里,只需要做移动,以及自身的特效显示.也是不需要关系其他的事情.
这样的设计代码看起来会非常简洁,增加了可读性,程序在开发过程中,只专注于小部分业务逻辑即可:
- 程序A:写炮塔,只需要考虑目标的选中,自身显示效果(选中可以在基类里,更多的工作是专注于特效显示)
- 程序B:写子弹,只需要考虑,从坐标x移动到坐标y,还有自身的显示.
所以我在写这几个技能的时候,每个基类里面其实只是实现了下攻击轨道,配置下移动速度,还有就是一些技能特效的定义(持续掉血,减速),具体去做这些特效处理的事情,交给受到攻击的怪物就好了,通过不同的状态,做不同的处理,减速只需要调整speed,毒液只需要显示个中毒效果,以及定时掉血,代码多的也就是那个范围攻击,因为有个贝塞尔曲线的实现,贴个简单的类
--减速炮塔子类实现
local BulletSlowView = class("BulletSlowView",BulletBaseView)
function BulletSlowView:onCreate()
self.png = "textures/bullet/bullet.png"
self.super.onCreate(self)
self.sprite:setColor(cc.c3b(180, 250, 250))
--属性
self.model.slowRate = 0.7 --减速比例(这个是数据,不应该在这里赋值,仅是作为举例)
self.model.slowTime = 2 --减速时间
end
--减速攻击(如果后期代码复杂,这部分内容应该放到cotroller处理)
function BulletSlowView:AttackedTarget()
--攻击特效的数据 {类型,减速比例,减速时间}
local attackData = {type=AttackType.slow,slowRate = self.model.slowRate,slowTime = self.model.slowTime}
self.model.target:loseLife(self.model.damage,attackData)
self.model.target:update()
end
return BulletSlowView
总的来讲,逻辑会变得清晰很多,后期不论如何修改,都可以完美的应对.并且这种思路可以应用到很多游戏中,最接近的是雷电这类的射击游戏内.复杂点的就是梦幻一类的回合游戏,这种做法会更符合这种回合制游戏,策划可以随意给不同的怪物绑定不同的技能,也可以实现boss的多技能组合.这样看起来,是不是这种大型游戏实现难度就不大啦