AOE这个词的意思,我相信玩过WOW的人都不陌生,包括玩过LoL的也不会陌生,说穿了就是一个区域内发生效果(Area of effect)。这里我们要讨论的就是关于一个适合于几乎所有游戏的AOE机制,当然之所以能适合于所有游戏,因为它也只是一个机制,一个机制从策划语法来就是一种思路,而不是一套代码。
<ignore_js_op>
在这里我可能会用到一些类似DSL的东西,至于DSL是什么,别去百度,那里你得不到答案,这里有一个云风的帖你可以看一下,至于DSL的好坏,我觉得如果你的程序员有一定经验和水平,是不难看出的,怎么说呢,这就好比HTML和SQL的关系,SQL很好用,但是如何让一个HTML程序员用……传送门http://blog.codingnow.com/2012/01/dev_note_8.html 1,AOE和AOEObj 首先要说清的是AOE和AOEObj的区别,这其实本质上是一个Struct和一个Instance的区别,AOE更多的是来自表项的数据,当然拜读了DSL概念之后,我觉得这个表项也可以写成DSL;而AOEObj则是工作的实体,有程序在运行过程中临时创建删除。 2,AOE通用表项 这里我用的DSL是一个混合了Pascal Lua和Haxe的写法。
3,AOEObj及其工作原理
1)AOEObj产生时,调用AOEObj.aoe.onCreate(AOEObj),如果策划有设计这个的话,其实我觉得大多时候是不需要的。 2)当角色进入AOE时,调用AOEObj.aoe.onGuyEnter(AOEObj, guy),这里涉及到一个遍历,优化关键之一。 3)当角色离开AOE时,调用AOEObj.aoe.onGuyLeave(AOEObj, guy),同上。 4)当aoe的tick>0同时onTick并不是空的时候,我们要定时触发onTick(AOEObj, guysInAOE),当然这里有人提出了聪明的做法,就是角色进入AOE给他添加一个Buff,离开时移除这个Buff,这个可以视情况决定,诸如AOE的ontick是当偶数tick冒一下红色火焰,奇数tick冒一下绿色火焰的时候,这个想法根本行不通。而且是用自身的tick精确度会更高,比如一块地刺钉板,每5秒伸出地刺伤害区域内的人,这时候你用onTick的触发就会更精确的反应,而不会因为进入钉板区域的人进入时间不统一而产生麻烦。 4,策划对于这个机制的运用 看到这里,有人会觉得这么设计AOE既浪费又不好理解,这是当然,我还是那句话——当你用战斗机只是杀1、2人的时候,他是不如砍刀实惠的,如果你的策划心中的AOE只有那些战斗效果,什么暴风雨魔法,剑刃风暴,那这简直就是浪费这套机制——“剑本凡铁,因执拿而通灵”,这关键还是看策划有没有灵性。 最简单的例子,我们在游戏中有个buff叫冒火,每3秒对角色造成一次火焰伤害,可以堆叠20层,默认上10层,这时候我们地图上有2块区域,一个油坑和一片河流,其实我们地图上有3个AOE区域: 1)油坑:玩家进入后,如果身上有冒火,则会每秒中叠加1层冒火。 2)浅水区:如果玩家进入后身上有冒火和翻滚2个buff,那么就删除所有冒火的debuff。 3)深水区:玩家进入后直接消除身上所有的冒火debuff。 以上是这3个区域的逻辑效果,但事实上你还需要利用好buff机制和AOE机制,去把细节做到位,比如冒火的buff在buffOccur时判断层数,不同的层数会导致视觉特效不同,或会随层数增加越来越旺;而水的AOE在消除火时会根据冒火的层数来播放不同程度的烟。 有人又要说了“啊呀,谁在乎这些细节啊,我把项目做出来就好了就能赚钱了”,我想起一个故事——落潮的时候,沙滩上都是鱼,一个孩子一条一条地捡起沙滩上的濒死小鱼,把它们重新放进大海。有人对孩子说:“沙滩上那么多的小鱼,你捡得过来吗?一条小鱼而已,有谁会在乎呢?”孩子一边不停地往海里扔鱼,一边说:“你看,这一条在乎,这一条也在乎。”,谁在乎呢?其实每一条鱼都在乎,只是他们没有能力自己回到水里罢了。 |
转载于:https://www.cnblogs.com/colourstar/p/8149387.html