【游戏功能】
火把怪围住了,怪却不跑?幽冥鬼火最反常识的就是这一点:它不是追着怪咬的火,是以怪为圆心绕着转的火——怪挪步,圈心跟着挪,火永远在它身边漂。今天拆幽冥鬼火,看"环绕体"这个形状怎么把持续伤害演出成一场招魂。
一、点灯、绕圈、吸魂三段
幽冥鬼火的循环三段。点灯段:道士掐诀,三盏鬼火依次从指尖飘出,绕着狼怪脚下转起一圈淡紫的光——三盏错开一百二十度入场,先来后到看得清。绕圈段:鬼火以椭圆轨道绕狼怪胸口高度漂移,转速恒定、间距均分——环绕的关键是"心随怪走":圈心每帧向怪的位置收敛,怪走火跟,怪停火绕。吸魂段:每盏火掠过胸口附近时吸走一口血,紫色小字带"吸魂"二字冒出——三盏火轮班,吸魂的节拍比单火密三倍,但每一口都小。三段的核心是"环绕即持续":它不追求任何一下的重,只追求"总有一下在路上"的压迫感。
完整演示在这,默认自动循环:
fx-wispdrain
二、幂尔框架实现:轨道参数与圈心跟随
鬼火是一组带相位差的轨道坐标,圈心做低通跟随:
local WispDrain = {}
local ORBITS, RADIUS, LIFE = 3, 52, 6.0
local TICK = 1.2
local wisps = nil
function SL:CastWisps(caster, target)
SL:PlayActorAct(caster, "cast")
wisps = { cx = SL:GetValue("actorX", target), t = 0, acc = 0 }
for i = 1, ORBITS do
local ph = (i - 1) / ORBITS * math.pi * 2
SL:SpawnOrbiter("ghost_fire", ph)
end
SL:ScheduleRepeat(0.016, function()
if not wisps then return end
wisps.t = wisps.t + 0.016
wisps.cx = wisps.cx + (SL:GetValue("actorX", target) - wisps.cx) * 0.032
for i = 1, ORBITS do
local a = wisps.t * 2.1 + (i - 1) / ORBITS * math.pi * 2
local ox = wisps.cx + math.cos(a) * RADIUS
local oy = SL:GetValue("actorY", target) - 56 + math.sin(a) * 26
SL:MoveOrbiter(i, ox, oy)
end
wisps.acc = wisps.acc + 0.016
if wisps.acc >= TICK then
wisps.acc = wisps.acc - TICK
SL:HitActor(target, 6)
SL:ShowTipAbove(target, "-6 吸魂", "#c9a8f5")
end
if wisps.t >= LIFE then
wisps = nil
SL:ClearOrbiters()
end
end)
end
return WispDrain
圈心跟随用的是最温和的一档收敛(每帧百分之三点二)——跟得慢,鬼火才有"飘"的味道;跟得太紧,环绕就变成了吸附。吸魂走独立的节拍器,与轨道转速解耦:三盏火轮到谁只是视觉的事,掉血按秒表走。
三、鬼火的画法与"飘"的分寸
鬼火的本体是一团径向渐变:亮紫的芯、中段过渡到透明——没有轮廓的火才是"魂火",描了边的圆就成灯笼了。透明度以每秒九次的频率轻颤,三盏的颤动相位错开——同颤像灯串,错颤才像三缕各自不安的魂。轨道压扁成椭圆(纵横比一半),鬼火转到"远处"时略微调小调淡——这一层伪透视让环绕有了前后纵深,平面转圈立刻变成立体盘旋。吸魂那一下的演出要"收":血从狼怪胸口冒出两三粒紫色光点向上飘散——被吸走的魂向上走,这是招魂题材的视觉常识,向下掉就成放血了。
四、环绕体的定位账
鬼火在伤害体系里是"细水长流"的一档:六秒总伤三十六,还不如一次普攻——它的真实产出是压制:怪在火圈里不敢久站,走位被圈牵着走。这份定位决定两条边界:其一,环绕体不吃暴击——暴击的爆发感与细水长流的美学互斥,鬼火暴击等于把招魂演成放炮;其二,圈心跟随有粘滞——怪用位移技能猛冲出圈,火要晚半秒才追上,这半秒就是走位的意义,环绕体的威胁必须"逃得掉但逃得难受"。与放血对照着看更清楚:同样是小额慢扣,放血贴在伤口上,鬼火飘在轨道上——一个惩罚"挨过的刀",一个惩罚"站的位"。持续伤害的两条路线在演出上分了家,玩家的选择才有味道。点灯、绕圈、吸魂三段,圈心缓跟、颤光错拍、魂向上走,四件凑齐,幽冥鬼火才烧得不像火,像一场收魂的仪式。
五、环绕的节奏学:转速、节拍与怪的选择
鬼火真正值得抠的是两根时间轴的配比。轨道转速每秒两圈上下是甜点:转快了三盏火糊成一圈光环,吸魂的"轮班感"消失;转慢了鬼火像散步,压迫感散光。吸魂节拍一点二秒一口,刻意与轨道半圈错开——观众看到的每一次掉血都能指认出"是哪盏火掠过的",因果对得上号,持续伤害才读得懂。而这套节奏真正的产品是选择压力:怪站在圈里每一点二秒掉六点,走出去火圈跟着挪——它发现逃不掉之后会转而加速进攻,试图在火耗死自己之前先耗死人。演示里狼怪被火圈罩住后的巡逻频率明显变快,就是这个选择的演出。道士玩家由此读出鬼火的第二用法:不是等它烧,是逼它动——用火圈把怪逼出巡逻路线、逼进队友的刀位,伤害是利息,驱赶才是本金。最后留一条工程省心账:三盏鬼火共用一个圈心、一份节拍器,轨道相位只是显示层的参数——圈心收敛、计时扣血这些逻辑只存一份,改节奏时改一处全盘生效,环绕体系才养得起。
这轮写下来还有一句想留的话:这类技能最容易在迭代里走形——改一次数值、调一次粒子,最初的那个"为什么好看"就慢慢丢了。把每个技能最核心的那一句话钉在模块头部注释里,往后任何一次改动,先问一句还符不符合那句话,再动手。表现层的所有分歧,最后都要回到那句话上对表。
招魂的仪式感说到底就是分寸感的别名——火小一分是萤,大一分是灾,烧在分寸里的那点紫光,才配叫鬼火。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 它的爪子明明挥向了你,怎么落在自己脸上?夺舍的答案邪门到家:道士的魂钻进了狼怪的身子——占据三秒,这三秒里它每…
【游戏功能】 墙又不追人,怪为什么次次撞?水墙的定位写在物理里:它立在路中央六秒,是一块"会推人的地形"——狼怪巡逻的弧线扫…
【游戏功能】 左手五刀右手五刀,怎么就数得清是双刀?双刀交叉斩的答案在弧线上:左刀的弧向右扫,右刀的弧向左扫,两把刀的弧线在…
【游戏功能】 隔着半个屏幕扎草人,狼怪为什么跟着一抽一抽?咒怨娃娃的逻辑古老而瘆人:草人与目标结咒之后,草人就是它——针扎草…
【游戏功能】 雷云的全部机制就这一行:一朵乌云升到目标头顶,慢半拍地跟着挪,每一点二秒掉一道小雷。云不追人——它认的是"头顶…
【游戏功能】 跑赢了的怪,怎么反倒挨了烧?火焰冲刺的账目反直觉就在这:冲刺是位移,火径是遗产——人冲过去了,路留在原地烧三秒…