【游戏功能】
一、一次分了三岔的火球
多重火球类技能首版的动图看着很美:大火球半路裂成三枚小火球扇形散开——然后三枚全飞偏了,一枚上屏一枚下屏一枚出界。分裂给了排面,没给归宿。分裂弹幕的核心不是"裂",是裂开之后每一枚的去向管理:散开是过程,收拢咬人才是目的。追踪转向力(前面写过的咬尾模型)配分裂,就是花架子变杀阵的全部工程量。
二、机制原理:分裂点的时机与去向
多重火球的链路是两段。母弹段:大火球直线飞向目标方向,飞行零点五五秒或到达预定距离即触发分裂——分裂点离施法者太近,散开的三枚没有追击空间;太远,浪费母弹的压迫感,半路最佳。子弹段:三枚小火球从分裂点以扇形散开(中间直飞、上下按分裂角偏移),随后各自转入追踪模式:转向力限制下的咬尾曲线,追的都是目标实时的头胸位置。扇形张角是表现参数,追踪转向力是手感参数,一个管散得开不开,一个管咬得死不死。
fx-multifire
三、正确写法:分裂追踪(幂尔版)
local MultiFire = {}
local CONST = { MSG_ID = 12110, KEY = "MultiFire", SPLIT_T = 0.55, ANG = 40 }
function MultiFire.Cast(myID, targetID)
MultiFire._big = CreateBigFire(myX + 26, myY - 64)
MultiFire._tid = targetID
PerformWithDelayGlobal(function()
MultiFire.Split()
end, CONST.SPLIT_T * 1000)
end
function MultiFire:Split()
local big = self._big
local ang = CONST.ANG * math.pi / 180
for i = -1, 1 do
local a = i * ang / 2
local child = CreateFireOrb(big.x, big.y)
child:SetVelocity(math.cos(a) * 300, math.sin(a) * 300)
child:SetHoming(self._tid, 4.0) -- 追踪转向力 4/s
child:OnArrive(function()
SpawnSmallBoom(child:GetPos())
self._target:OnHit(30)
end)
end
big:Remove()
SpawnSplitFlash(big.x, big.y) -- 分裂点的爆闪
end
return MultiFire
四、四个必须钉死的细节
五、心法:分裂是承诺不是散场
一裂三的瞬间玩家会预期"这三枚都算数",追踪转向就是兑现这份预期的方式。凡是"一变多"的表现——分身、多重弹、连锁闪电——变出来的每一份都要有独立的目的地与结算,变出来就不管的,玩家记住的不是那一下的华丽,是落空之后的空门。
还有一条实战细节留给抄作业的人:分裂的三个目标允许重叠,但三枚追同一目标时命中要有零点一秒的间隔队列,三发同时结算的瞬间飘字叠成一团,玩家看不出是三段伤害。连发类技能的飘字排班,从来都是表现层自己的功课,数值层帮不上忙。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 一、一个被投诉的手感 格挡类玩法首测,最扎心的反馈是:"我按了格挡,还是掉血,那我按它干嘛?"复盘发现三档判定…
【游戏功能】 一、一个只写在面板上的攻速 血怒类增益技能初版,面板攻速翻倍,实际战斗里玩家毫无感觉——动作动画的播放速度压根…
【游戏功能】 一、一行代码拆解 ctx.ellipse(0, 0, 26 pul, 44 pul, 0, 0, 7) ——传…
【游戏功能】 一、先抛一个坑 地刺为什么从脚下开始、沿着一条线追到敌阵?做成目标脚下原地一丛刺不行吗?行,但那是控制技。地刺…
【游戏功能】 一、先抛一个坑 三段连斩的第一版做出来,策划看完只说了一句:"这是三个技能吧?"三刀的斩痕分别从上斜、下斜、平…
【游戏功能】 一、一个只有正前方能躲的技能 月刃横扫类范围技能第一版,判定画的是以角色为圆心的整圆,视觉画的是身前一扇新月。…