【游戏功能】
巡查群的凌晨有条没人认领的报障:练级点的狼怪集体"变慢"了,走两步卡一步,像在水里蹚——读条记录翻到最后才发现,是半小时前一位道士试新符把半张地图的水口开了没关。水漫金山的效果就是这么不讲理:大水漫过来,它站不稳,也追不上。今天拆水漫金山,看"控场系"怎么把一整片水域演成一道无形的墙。
一、开闸、齐腰、退水三段
水漫金山的循环三段。开闸段:脚下水口嗡的一声荡开,水面从看不见的地方一层层涨上来——开闸段要给足"涨"的过程:水线爬升肉眼可见,狼怪的脚踝先没进去,再是膝盖——水漫的压迫感全在这一寸一寸的爬升里。齐腰段:水位停在齐腰,狼怪整只泡在水里,步子迈成慢动作,走两步荡一圈涟漪——齐腰段是全技能的主戏:减速一半的狼怪追不上人,出刀也钝了半拍,整片场子的节奏权被水没收了。退水段:水线缓缓落回去,狼怪的脚一步一步重新踩实,步子恢复利落——退水段是秩序的归还:水退之前场子是你的,水退之后各凭本事。三段的核心是"水即减速":这片水不咬人,它只是把"快"这个字从狼怪的字典里泡软了。
完整演示在这,默认自动循环:
fx-risingtide
二、幂尔框架实现:水位是一条全场共用的线
水位与减速都长在同一个表上:
local RisingTide = {}
local TIDE_H = 58 -- 齐腰水位
local TIDE_LIFE = 6.0 -- 六秒退水
local SLOW_RATE = 0.5 -- 蹚水减速一半
local tide = { h = 0, target = 0, left = 0 }
function SL:CastRisingTide(caster)
if tide.target > 0 then
SL:ShowTipAbove(caster, "水还漫着")
return
end
SL:PlayActorAct(caster, "cast")
tide.target = TIDE_H
tide.left = TIDE_LIFE
SL:Cooldown("risingtide", 9.0)
end
function SL:OnTick(dt)
tide.h = tide.h + (tide.target - tide.h) * math.min(1, dt * 2.2)
if tide.left > 0 then
tide.left = tide.left - dt
if tide.left <= 0 then tide.target = 0 end -- 到时开闸退水
end
end
function SL:ActorSpeed(base) -- 全场的脚都来问水
if tide.h > 22 then
return base * SLOW_RATE
end
return base
end
return RisingTide
减速闸挂在速度的出口上而不是每只怪的脚本里——水位是全场的公账,谁的腿快谁先来查水,改一只怪的速度是打补丁,改水位才是控场。
三、漫水的演出规格
水线要"活":水面一道正弦细浪匀速横移,浪高两像素半——死平的水面是贴图,动起来的水才是场子。泡水角色的腰以下罩一层半透明蓝——水色罩到哪、减速到哪,玩家对"它泡了多深"零歧义。蹚水的狼怪每走两步荡出一粒水花,走路动画的帧率当场减半——动作的慢比数字的慢更直观,减速一半先让腿演出来。退水时要给"踩实"的细节:水线每退一寸,狼怪的脚踝从蓝罩里露出一截——归还节奏权的过程要一寸一寸演完。水位表压在技能栏:蓄水的冷却与当前水深同框,开闸与退水的时机都写在明面上。
四、定价与三条水规
控场系的定价一句话:齐腰六秒、减速一半、九秒蓄水——六秒的场子对九秒的空窗,水漫金山是节奏的存取,不是伤害的买卖。三条水规:其一,水不认人——道士自己蹚水一样减速,控场不分敌我,会玩的是把水口开在自己逃生的那条路上;其二,泡水不吃挑飞——它已经在水里了,掀不上去,浮空与浮水二选一;其三,水位不打折——水漫到膝盖照样是全程减速,控场的档位只留"有水"和"没水"两档,半泡的水是事故。与疾行术对照着看:同是管"快慢",疾行是给自己加油——赚的是自己的腿;水漫是给全场泼冷水——收的是所有人的腿,加速系管自己,控场系管天下,两个门派在"改谁的脚"上分了家。
五、控场系的地图学:把地形做成一招
水漫金山最迷人的地方是它把"地形"变成了一次可以随时捏在手里的筹码:平时平地,开闸六秒泽国——同一片场子在水里水外是两种性格,狼怪的巡逻线、玩家的风筝位全部重排。老道士的功课是选水口:开在怪堆的必经之路,一波水吃一轮怪;开在自己身后,撤退的水路永远比它快半步。对观战者,水位就是战况的晴雨表:水涨了,所有人都知道这六秒道士说了算。工程收尾记一笔:水面高度是全场公账,任何跳跃、挑飞、落地的判定都要来查这条线——半截身子在水里挨挑飞的怪,故障截图能挂一星期。最后留给数值组的一句话:减速一半对六秒,配上九秒的蓄水,账是平的——控场系的收益从来不在数字上,在"这六秒里它追不上我"的从容里。
水跟别的技能碰在一起还有几出好戏:火系的术法落进水里,伤害打个对折、火苗当场矮半截——水火相克的账摆在明面上;雷系落水,泡在水里的目标多挨一截麻——同一场水,对火是坟、对雷是桥。玩家摸清这套脾气之后,水漫金山就从一招减速变成了一张地形牌:先看队伍里带的是火还是雷,再决定这口水开不开。
写完再留一句给做控场系的同学:控场最容易做成"一个减速百分比",而它本该是一片有自己的水位的场子——涨要看得见、泡要有形状、退要一寸一寸还,场子有脾气,玩家才有故事讲。
补一个演示彩蛋位:水位过膝的时候,狼怪的怒吼会冒一串水泡——泡在水里的火气也是要打折扣的,观众看得乐,玩家记住了"水深"这个字眼。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【语法算法】 上一版埋了个越用越错的隐蔽报错:长按的计时不在抬手时清零——第一次长按松手后,秒表没归零,第二次轻轻一点直接被…
【语法算法】 接着抛坑:淡入没播完又来一个淡出,会怎样?答不好的界面都会出事——同一个面板的透明度被两个渐变同时抢,一个往上…
【语法算法】 上一版留了排"齐步走"的图标的隐蔽报错:一排波浪排布的图标同起同落——设计稿上是此起彼伏的波浪,实机上整排图标…
【语法算法】 先抛一个坑:按钮太小点不中,为什么不做大热区?界面上那个二十像素的小圆钮,玩家戳三次中一次——把按钮画大又会破…
【语法算法】 vel=vel math.pow(0.01,dt) ——先拆这一行。击退的全部手感都在这一行的衰减里:初速三百…
【语法算法】 上个月一场闪了全屏的事故成了组里的教材:受击闪白上线第一天,玩家一挨打整个界面白一遍——血条、按钮、聊天框全泡…