【游戏功能】
上周排位局有人把天女散花打成了"单发飞刀"——五瓣花瓣出手,狼怪稳稳站扇心,他却只吃到一瓣的伤害。回放一看,他的角色面朝向偏了十度,整个扇面跟着偏,四瓣全擦着狼怪身子飞过去。这个事故说明一件事:扇面散射的伤害不是数值决定的,是角度决定的。今天拆天女散花,看"扇"这个形状怎么从朝向里长出来。
一、撒瓣、飞行、结账三段
天女散花的循环三段。撒瓣段:角色一挥手,五片花瓣沿扇面同时出手——五瓣的射角是固定的一组:正中、左右各偏十度、左右各偏二十度,扇面的开合角度写死在配置里,谁出手都一样。飞行段:五瓣各走各的直线,互不干扰——扇面的形状只在出手瞬间由朝向决定,出手之后每片花瓣就是一枚普通的直线弹,没有追踪没有拐弯。结账段:花瓣擦过狼怪身位的记一次命中,命中数结算伤害——站扇心的吃满五瓣,站扇边只擦一两片。三段的核心是"一次成形":扇面在撒出的瞬间定型,角度即伤害——这和追踪弹的"锁定即伤害"是两个世界,天女散花惩罚站位偏差,奖励出手时机。
完整演示在这,默认自动循环:
fx-fanpetals
二、幂尔框架实现:射角表与命中计数
扇面就是一张射角表,命中靠逐瓣计数:
local FanPetals = {}
local ANGS = { -0.34, -0.17, 0, 0.17, 0.34 } -- 五瓣射角(弧度)
local PETAL_DMG = 22
function SL:CastFan(caster, target)
SL:PlayActorAct(caster, "attack")
local facing = SL:GetValue("facing", caster) -- 角色当前朝向
local hits = 0
for i, a in ipairs(ANGS) do
local ang = facing + a
SL:FireProjectile("petal", caster, ang, 300, function(px, py)
if SL:InHitBox(px, py, target) then
hits = hits + 1
SL:PlayBurst(px, py, "petal_pop", 4)
end
end)
end
SL:ScheduleOnce(function()
if hits > 0 then
SL:HitActor(target, hits * PETAL_DMG)
SL:ShowTipAbove(target, "-" .. (hits * PETAL_DMG)
.. (hits == 5 and " 吃满!" or (" " .. hits .. "瓣")))
end
end, 0.9)
end
return FanPetals
两个易错点钉在这:其一,facing 取一次就够——五瓣共享同一个朝向基准,循环里再取朝向,中途的角色转向会把扇面拧歪;其二,结账用延迟一次汇总而不是逐瓣结算——逐瓣飘五个小数字不如一个汇总数字带"吃满"来得清爽。
三、扇面三参数:开角、瓣数、速差
扇面的手感全在三个参数的配比里。开角:总开角四十度上下是甜点——再宽就成无差别轰炸,站位失去意义;再窄就退化成高散布单体弹,"扇"名不副实。瓣数:五瓣是信息量的上限——玩家扫一眼能数清扇面里有几道缝,七瓣以上扇面糊成一团,站位博弈变成抽卡。速差:相邻瓣速错开一成——五瓣同时出手但不同时到达,扇面在飞行中微微"张开",这让同样四十度的扇形看着比匀速的大一圈,纯视觉的便宜。花瓣本体的画法走"轻"字诀:椭圆小瓣、加法混合的粉光、飞行中自旋——花瓣是全场最轻的弹体,越轻,扇面的"撒"字越成立。命中反馈按瓣数分档:一瓣灰字、三瓣粉字、五瓣大字加粉色冲击环——玩家从数字的颜色和个头直接读出"这一把撒得值不值"。
四、朝向事故的根治与扇的战术面
开头那起"单发飞刀"事故,根因是朝向读取时机错了——那位开发在花瓣出手的循环里逐瓣取朝向,角色攻击动作中途的自转把后四瓣带偏。根治就一条:扇面类技能的朝向在出手帧锁定一次,写进框架的使用规约里。战术面上,扇的乐趣在"等狼怪对正":巡逻折返的那半秒,狼怪的行进方向恰好对准扇心,此时撒瓣五瓣全中——演示的自动演武就掐这个时机出手,玩家看两轮就能学会"等它转头"。再往上一层是和推退技的配合:气功波把狼怪推向扇心,推的动作本身就在替玩家校准角度——两个技能的参数不用为配合改一个字,扇面与推力的几何关系天然咬合。射角表、单次朝向、速差张扇、按瓣分档——四件凑齐,天女散花才是"一把撒出去的刀雨",而不是五发齐射的机枪。
五、花瓣落地的余韵
撒完之后的半秒也有戏可做。擦身而过的花瓣不打断、不消失,继续飞到扇面尽头才散——擦伤的"擦"字要飞完全程才算数,半路消失的擦伤像判错了的球。落地的花瓣在地面留两三片粉点,一秒淡去——"撒"是有残渣的,残渣让扇面留在玩家的记忆里比冲击环更久。音效的层次跟着瓣数走:出手一声轻响、每片命中一声"叮"、五瓣全中追加一声风铃式的尾音——尾音是"吃满"的听觉签名,老玩家闭着眼听尾音就知道这一把值不值。还有一处在演示里能看出来的小选择:狼怪被擦中后不停顿——单瓣擦伤不给受击僵直,只有吃满五瓣才顿一帧——擦伤是"蹭",满中是"打",两档反馈的力度必须拉开,否则扇边与扇心在手感上没了区别。最后把话收回工程侧:花瓣的物理是全场最简单的——直线、匀速、无重力、无碰撞体积,只有命中框一查——但把最简单的弹体配上最讲究的出手几何,就是"散射"类技能的全部深度。简单弹体配复杂弹道,比复杂弹体配简单弹道便宜十倍,好看二十倍。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 它的爪子明明挥向了你,怎么落在自己脸上?夺舍的答案邪门到家:道士的魂钻进了狼怪的身子——占据三秒,这三秒里它每…
【游戏功能】 墙又不追人,怪为什么次次撞?水墙的定位写在物理里:它立在路中央六秒,是一块"会推人的地形"——狼怪巡逻的弧线扫…
【游戏功能】 左手五刀右手五刀,怎么就数得清是双刀?双刀交叉斩的答案在弧线上:左刀的弧向右扫,右刀的弧向左扫,两把刀的弧线在…
【游戏功能】 隔着半个屏幕扎草人,狼怪为什么跟着一抽一抽?咒怨娃娃的逻辑古老而瘆人:草人与目标结咒之后,草人就是它——针扎草…
【游戏功能】 雷云的全部机制就这一行:一朵乌云升到目标头顶,慢半拍地跟着挪,每一点二秒掉一道小雷。云不追人——它认的是"头顶…
【游戏功能】 跑赢了的怪,怎么反倒挨了烧?火焰冲刺的账目反直觉就在这:冲刺是位移,火径是遗产——人冲过去了,路留在原地烧三秒…