【游戏功能】
鼓点不停加成不停——影鼓的全部机关就这一条:擂鼓后每一刀往鼓面上加一个鼓点,鼓点越多伤害越高,挨一刀鼓声全碎。这篇把整套模块拆开:配置表、影鼓表、鼓点结算、定时器、调试按钮,一段一段照抄能跑。
一、效果演示:鼓点不停加成不停,挨刀就断
演示场点「擂鼓!」:一面暗红色的鼓环绕在玩家身侧——十五秒的鼓期,每三秒自动涨一个鼓点。鼓点涨一层你的伤害加二点——鼓点八层时刀刀十八点。关键的考验在挨打:怪的刀一碰你,鼓声当场碎裂——鼓点全清,伤害回到十点的平常价。演示里试两种打法:躲着打保鼓点越打越重,和顶着打让鼓碎——前者输出节节高,后者一夜回到解放前。影鼓教的是保鼓:不是打得快就赢,是不挨打才赢。
fx-shadowdrum
二、底层原理:一面影鼓表加一次清零判定
模块的机关是一对搭档。影鼓表:擂鼓的十五秒里每三秒自动涨一层鼓点——鼓点认时间不认攻击,站着不动鼓点照样涨,这是影鼓和叠劲最大的分别。清零判定:被命中的那一帧鼓声碎裂、鼓点全清——清零认命中不认伤害值,被弹一下也碎。和越战那类挨打清零的分野在"越战涨伤害、影鼓涨频率":越战让你打得更重,影鼓让你打得更密——一个堆伤害一个堆射速,两条成长路线互不覆盖。鼓珠的排布也有一讲——八颗珠从左到右一格格点亮,亮到第几颗就是第几层,玩家的余光扫一眼就知道现在加了几成,不用低头读数字。
鼓点为什么按时间涨而不是按攻击涨?按攻击涨的版本影鼓和连珠变成同一个机制的两种皮肤;按时间涨让玩家可以边走位边攒鼓点,鼓点的节奏和走位的节奏合在一起才是这套机制的完成态。
三、核心代码:完整模块(上·骨架)
-- @file ShadowDrum.lua
-- 影鼓 —— 鼓点不停加成不停,挨刀就断
local ShadowDrum = {}
local CONST = {
DRUM_LIFE = 15.0,
DRUM_CD = 5.0,
DRUM_GAP = 3.0,
DRUM_CAP = 8,
DMG_PER_DRUM = 2,
COLOR_DRUM = "#c89040",
COLOR_DEEP = "#503810",
COLOR_GHOST = "#f4d8a0",
ZORDER_DRUM = 133,
ZORDER_FX = 135,
AUTOINC_BASE = 1077000,
}
local _drumT = 0
local _drumN = 0
local _drumGap = 0
local _cdLeft = 0
local _drumFx = nil
local _scheduler = nil
local _autoInc = 0
local function GenID(prefix)
_autoInc = _autoInc + 1
return string.format("%s_%d", prefix or "SDM",
CONST.AUTOINC_BASE + _autoInc)
end
local function GetActorPos(id)
if not id then return nil end
local x = SL:GetValue("ACTOR_POSITION_X", id)
local y = SL:GetValue("ACTOR_POSITION_Y", id)
if not x or not y then return nil end
return { x = x, y = y }
end
local function SafeRemove(node)
if node and not GUI:Widget_IsNull(node) then
GUI:removeFromParent(node)
end
end
local function ShowTip(msg)
if msg and msg ~= "" then SL:ShowSystemTips(msg) end
end
local function BreakDrum()
_drumT = 0
_drumN = 0
SafeRemove(_drumFx)
_drumFx = nil
ShowTip("挨打震断了鼓声——鼓点全清,从头再擂")
end
function ShadowDrum.Drum()
if _cdLeft > 0 or _drumT > 0 then return end
_cdLeft = CONST.DRUM_CD
_drumT = CONST.DRUM_LIFE
_drumN = 0
_drumGap = 0
SafeRemove(_drumFx)
_drumFx = GUI:Layout_Create(GUI:Attach_SceneF(),
GenID("Drum"), 0, 0, 0, 0, false)
GUI:setLocalZOrder(_drumFx, CONST.ZORDER_DRUM)
SL:PlayDrumStartFx(SL:GetValue("USER_ID"))
SL:TipAboveMe("擂鼓!")
ShowTip("鼓擂响了——十五秒里每三秒涨一成")
end
四、核心代码:完整模块(下·定时器与鼓点结算)
-- 定时器:鼓点涨层与鼓环跟脚
if not _scheduler then
_scheduler = SL:Schedule(function(dt)
_cdLeft = math.max(0, _cdLeft - dt)
if _drumT > 0 then
_drumT = _drumT - dt
_drumGap = _drumGap + dt
if _drumGap >= CONST.DRUM_GAP and _drumN < CONST.DRUM_CAP then
_drumGap = 0
_drumN = _drumN + 1
SL:PlayDrumBeatFx(SL:GetValue("USER_ID"), _drumN)
if _drumN >= CONST.DRUM_CAP then
ShowTip("鼓点封顶——八层满鼓,别挨刀")
end
end
local myID = SL:GetValue("USER_ID")
local mp = GetActorPos(myID)
if _drumFx and mp then
GUI:setPosition(_drumFx, mp.x, mp.y - 40)
end
if _drumT <= 0 then
_drumN = 0
SafeRemove(_drumFx)
ShowTip("鼓声散了——十五秒极限过了")
end
end
end, 0.02)
end
SL:ScheduleOnce(function()
SL:BindDebugButton("擂鼓", function()
ShadowDrum.Drum()
end)
ShowTip("技能已加载: 影鼓 (调试按钮触发)")
end, 1.0)
function ShadowDrum.Unload()
if _scheduler then SL:Unschedule(_scheduler) end
SL:UnregisterLUAEvent(LUA_EVENT_BEFORE_HURT, "SDM_Break")
SafeRemove(_drumFx)
_drumT = 0
_drumN = 0
end
return ShadowDrum
五、机制问答
问:鼓点封顶后还会涨吗?
答:不会——八层封顶后多余的鼓点直接消散,封顶是天花板不是蓄水池。
问:鼓点的加成对技能也生效吗?
答:生效——鼓点是全局增伤乘区,普攻和技能通吃,鼓点的账本不分刀法。
问:挨半刀也算被命中吗?
答:算——清零认命中事件不认伤害值,哪怕只蹭了一下鼓也全碎,这条铁律是影鼓的魂。
问:鼓点能手动清零吗?
答:不能——影鼓没有主动散鼓的按钮,鼓声要么走完十五秒要么被敌人打断,没有第三种结束方式。这条设计是故意的——能手动散鼓的版本影鼓变成了可开关的增益,碎鼓的代价感就没了。
问:鼓点的加成和破势叠加吗?
答:叠——鼓点是全局增伤乘区,破势标记照常生效,满鼓加破势的刀是双倍增伤的重击。
六、调参指南与商业服怎么用
第四笔是涨层的频率:三秒一层对八层封顶是二十四秒的满鼓线——涨太快鼓变成常驻增伤,太慢一局打不满八层。第三笔是封顶的层数:八层是"肉眼数得清但不用掰手"的深度——层数太多鼓点的视觉太密,太少鼓点的成长感不够。第二笔是持续的总长:十五秒对一场四十秒的架是三分之一的时间有鼓——影鼓太长变成常驻加持,太短变成开场技。第一笔是鼓点的视觉分层:八颗鼓珠从左到右排开——鼓珠的排列就是成长的进度条,玩家数珠就知道现在加了几成。珠与珠之间也要有涨层的音效——鼓点涨一层,鼓声就重一分,耳朵也在替眼睛数层。常见坑三个:鼓点的涨层和持续时间用了同一计时器导致互相干扰;挨打清零的判定没排除持续跳伤,毒跳一下鼓碎一次;鼓环的跟脚在切换场景后飘到了原坐标。
商业服里影鼓是"鼓手流派"的心跳:别人拼输出他拼定力——商城里鼓点的样式做成品级,木鼓点、铜鼓点、龙心鼓点,八颗鼓珠全亮的那一帧就是鼓手的满编信号。运营落地还有两笔:一段是保鼓教学——教一句"躲过一刀就是多赚两点",流派第一课是闪避不是输出;一段是保鼓榜——按鼓点全清前的最长存活时间排名,定力最深的鼓手有碑。变体做成鼓点共鸣:八层满鼓时自动释放一次范围冲击波——满鼓的奖励从被动增伤变成主动爆发,鼓手的终点从站桩变成一声巨响。这一篇的演示和整套模块照抄能跑,改的就是 CONST 那张表。
写完留一句给做节奏系的同学:影鼓卖的是"不挨打就是输出"——那八颗一格格亮起的鼓珠和被打碎时的一声闷响,是把闪避能力直接标价为伤害加成的第一次尝试。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
接手二开的兄弟几乎都撞过同一堵墙:玩家嫌走路"一格一格像机器人",老板拍板要"丝滑移动",改服务端速度?不对。改客户端动画帧…
【游戏功能】 先看一个熟场面:法师的火球特效挂在怪的脚后跟上,明明技能说明写着"焚烧其面",火星子却在地上打滚。群里有位策划…
【游戏功能】 上周有个开服的老板在群里发了一段录屏:他的战士明明刀刀都砍中了,观众却一片"这刀挥空了吧"。他原话是"判定日志…
【游戏功能】 先说结论放在开头:怪的皮一会儿绿一会儿红,不是美术换了几套贴图,是染色系统在怪身上盖了一层"色镜"。开服群里有…
前两天群里有个架设的朋友问了个需求:中毒的人要变绿、每两秒掉一次血、毒还能叠五层,问是不是要在服务端把整套状态机重写。我说你…
【游戏功能】 先抛一个坑:五口钟一模一样大,为什么一口比一口疼?先后次序动不得吗?倒过来敲会怎样?这篇把编钟纹整套写法拆开:…