【游戏功能】
拆一行代码:
SL:DrawLightning(x1, y1, x2, y2, { jitter = 10, layer = 2 })
起点终点之间抖出一条锯齿闪电——疾光电影的表现核心就这一行:刀尖到屏幕尽头,一条近乎笔直的紫电贯串而过,线上所有目标同帧结算。今天讲这条"线"的表现,重点在怎么让它直得霸道又抖得真实。
一、直线预警、贯串、沿途结算
疾光电影的时间轴三拍。第一拍预警:一条淡紫虚线从刀尖延伸到画面边缘,虚线静静躺在那里半秒——直线的规则先讲清楚:线上的人都是目标。第二拍贯串:虚线位置瞬间炸出实体电光,主干笔直、边缘锯齿抖动、双层描边外紫内白,半秒内从亮到灭。第三拍结算:线上的狼怪同时后仰、同时跳数字、同时炸火花——注意是"同时",疾光电影的爽点就在一个"串"字,数字一前一后地跳就成了三段普攻。结算那一帧要配全屏轻闪和短震屏,一条线的伤害要有贯穿画面的分量。
完整演示在这,默认自动循环,可调电光宽度:
fx-linebolt
二、幂尔框架实现:锯齿生成与双层描边
闪电主干是直线,锯齿只做垂直扰动,扰动沿两点插值生成:
local LineBolt = {}
local KEY = { CHARGE = 0.55, LIFE = 0.3 }
local function BuildBolt(x1, y1, x2, y2, seg)
local pts = { { x = x1, y = y1 } }
for i = 1, seg do
local t = i / (seg + 1)
local mx = x1 + (x2 - x1) * t
local my = y1 + (y2 - y1) * t
-- 垂直方向随机偏移, 主干仍然笔直
local nx, ny = (y2 - y1), -(x2 - x1)
local len = math.sqrt(nx * nx + ny * ny)
local amp = math.random(-5, 5)
pts[#pts + 1] = { x = mx + nx / len * amp, y = my + ny / len * amp }
end
pts[#pts + 1] = { x = x2, y = y2 }
return pts
end
function LineBolt.Cast(self_, targets)
SL:PlayActorAct(self_, "cast")
-- 预警虚线
SL:PlayGroundFx("aim_line", SL:GetValue("aimY"), KEY.CHARGE)
SL:ScheduleOnce(function()
local x1 = SL:GetValue("actorX", self_) + 22
local y1 = SL:GetValue("actorY", self_) - 56
local pts = BuildBolt(x1, y1, 660, y1, 16)
SL:DrawLightningPts(pts, { layer = 2, width = SL:GetValue("boltWidth") })
SL:ScreenShake(0.26, 5)
-- 沿线同帧结算
for _, t in ipairs(targets) do
SL:DeductHp(t, 31)
SL:ShowHitNum(t, 31, "bolt")
SL:PlayBurst(SL:GetValue("actorX", t),
SL:GetValue("actorY", t) - 58, "violet", 16)
SL:PlayActorAct(t, "stuck")
end
SL:ScheduleOnce(function()
SL:ClearLightning()
end, KEY.LIFE)
end, KEY.CHARGE)
end
return LineBolt
锯齿只许垂直偏移、不许沿走向错位——主干一旦被锯齿拉歪,"笔直贯串"的气势就散了。
三、宽度层级与多条线并存
电光宽度是唯一的强度旋钮,但宽度变化要同步改三层:主干线宽、外晕宽度和闪白时长,三层联动才像"更粗的电",只改线宽就是一根变胖的毛线。锯齿频率比振幅重要:高频小幅的抖动是电,低频大幅的抖动是心电图。多条疾光电影同屏时,各自的锯齿相位要错开,两根完全同步跳动的闪电并列,像复制粘贴的贴图。
结算的"同时性"最后再强调一遍:同帧结算在实现上是循环里连发,在表现上就是一帧内全部数字上屏。如果引擎的跳字队列有节流,宁可把这条线的数字合并成一颗大数字落在最重的目标头上,也别让三颗数字排队三帧跳——贯串的魂是整齐划一,队列一排队,魂就散了。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 法师的困扰千篇一律:蓝条见底符纸哑火,站在怪堆里干瞪眼——直到有人给他看了一行账:符落三十五蓝,杖挥一刀回十二…
【游戏功能】 地刺从脚底下炸出来的那半秒,大多数人的选择是躲——只有极少数人按下了偷师。偷师的机制是一场限时的一秒课:它抬手…
【游戏功能】 两只狼配合得像一个人:一只咬前蹄、一只扑后背,多少人栽在这对搭档手里——直到有人往白狼背上钉了一张嫁祸符。离间…
【游戏功能】 弓狼在远处放冷箭,刀狼在近处追着你——两头受气的死局,怎么破?有老手给出的答案匪夷所思:往刀狼身后一站,让它替…
【游戏功能】 buffs[name] = nil ——一行删表项的代码,写尽了驱散全部的狠辣:狼怪顶着三层好处——狂暴加攻、…
【游戏功能】 弓箭手的伤害明明不低,为什么同样的怪别人十秒放倒、他要磨半分钟?看完他的操作就明白了:箭是乱射的,囊空了站在原…