【游戏功能】
上一版藏了个打满全场才会露头的隐蔽报错:碎地砖的裂痕跨窗不清零——第一窗三块砖裂完塌过一回,第二窗新铺的砖被它一爪就砸塌,账面上裂痕从旧窗结转了过来。追到底发现塌陷结算只铺了新砖没撕旧账,碎裂计数器带着旧账进了下一窗。修完把清账写进塌陷的收尾,顺手把这套机制整理成篇。碎地纹的账很损:铺在你和它之间的地砖是酥的——它每一爪砸下来都先砸裂自己脚下的砖,三块裂满,连砖带它一起陷下去。这篇把整改后的整套模块拆开:配置表、铺砖结算、裂痕累计、塌陷结算、清账时机、定时器、调试按钮,一段一段照抄能跑。
一、效果演示:它的爪子砸塌自己脚下的地
演示场怪照常抡爪。点「铺砖!」:它脚下铺开三块灰紫色的砖——十二秒砖期。它的每一爪砸向你,落点都在自己脚下——爪风过处,一块砖当场裂出白纹,"裂!"的字蹦出来。三爪三裂,第三块砖裂满的那一拍——整片砖塌下去,它跟着陷了半截身子,"塌-20"的紫字砸出,碎石四溅。两秒后新砖铺好,账本重开,它的爪又开始砸自己的地。演示里试两笔账:不铺砖硬挨它的爪和铺砖让它自己拆自己的台——它的输出一点没少,可每一爪都在给自己的坟墓添砖。碎地纹教的是借力:让它自己的力气砸自己。
fx-brittlefloor
二、底层原理:一次铺砖结算加一次裂痕累计
模块的机关是一对搭档。铺砖结算:开纹那一拍在怪的脚下铺三块酥砖——砖认的是它脚下的地,铺好即生效,它的爪子落下来就要过砖。裂痕累计:它的每一次出手都砸裂一块——三块裂满当场塌陷,它陷下去吃塌陷账,两秒后新砖重铺、裂痕清零,下一轮接着拆。和反伤类机制的分野在"碎地收的是它的力气不是它的血":反伤是它打你多少它掉多少血,碎地是它的每一爪都在拆自己脚下的地基——血分文不掉,塌的是它站的地方,罚的是它出手这个动作本身。
塌陷为什么钉在三块?一爪就塌的版本它出手即陷,出手权被整段没收成了软控制;五块又太慢一窗塌不了一回;三块刚好是"一窗一塌"的节奏——塌得看得见,又不会塌成常态。
三、核心代码:完整模块(上·骨架)
-- @file BrittleFloor.lua
-- 碎地砖纹 —— 它的爪子砸塌自己脚下的地
local BrittleFloor = {}
local CONST = {
CREST_LIFE = 12.0,
CREST_CD = 4.0,
TILE_CAP = 3,
SINK_LIFE = 1.2,
SINK_DMG = 20,
REGROW_LIFE = 2.0,
COLOR_TILE = "#9088a0",
COLOR_DEEP = "#383048",
COLOR_GHOST = "#d0c8e0",
ZORDER_TILE = 88,
ZORDER_FX = 135,
AUTOINC_BASE = 1112000,
}
local _crestT = 0
local _cdLeft = 0
local _crackN = 0
local _sinkT = 0
local _regrowT = 0
local _tid = 0
local _tileFx = nil
local _scheduler = nil
local _autoInc = 0
local function GenID(prefix)
_autoInc = _autoInc + 1
return string.format("%s_%d", prefix or "BFL",
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
function BrittleFloor.Cracks()
return _crackN
end
四、核心代码:完整模块(下·裂痕累计与塌陷结算)
-- 裂痕累计:它每一次出手都砸裂一块
SL:RegisterLUAEvent(LUA_EVENT_AFTER_ACTION, "BFL_Crack", function(tid)
if _crestT <= 0 or tid ~= _tid or _sinkT > 0 then
return
end
_crackN = math.min(CONST.TILE_CAP, _crackN + 1)
SL:TipAbove(tid, "裂!")
SL:PlayCrackFx(tid)
end)
-- 塌陷结算:三块裂满连砖带怪一起陷
local function Collapse()
_sinkT = CONST.SINK_LIFE
SL:ActorHurt(_tid, CONST.SINK_DMG)
SL:TipAbove(_tid, "塌-" .. CONST.SINK_DMG)
SL:AddBuff(_tid, "SUNK", CONST.SINK_LIFE)
SL:PlayCollapseFx(_tid)
_crackN = 0
ShowTip("塌了——它自己的爪子砸塌的")
end
function BrittleFloor.Cast()
if _cdLeft > 0 or _crestT > 0 then return end
local tid = SL:GetValue("MARK_TARGET_ID")
if not tid then return end
_cdLeft = CONST.CREST_CD
_crestT = CONST.CREST_LIFE
_crackN = 0
_sinkT = 0
_regrowT = 0
_tid = tid
SafeRemove(_tileFx)
_tileFx = GUI:Layout_Create(GUI:Attach_Scene(),
GenID("Tile"), 0, 0, 0, 0, false)
GUI:setLocalZOrder(_tileFx, CONST.ZORDER_TILE)
SL:PlayTileUpFx(tid)
ShowTip("砖铺上了——它每一爪砸裂一块,三块一塌")
end
-- 定时器:砖期倒计时、塌陷消化与清账
if not _scheduler then
_scheduler = SL:Schedule(function(dt)
_cdLeft = math.max(0, _cdLeft - dt)
if _sinkT > 0 then
_sinkT = _sinkT - dt
if _sinkT <= 0 then
SL:RemoveBuff(_tid, "SUNK")
_regrowT = CONST.REGROW_LIFE
ShowTip("它爬出来了——砖重新铺好")
end
end
if _regrowT > 0 then
_regrowT = _regrowT - dt
end
if _crestT > 0 then
_crestT = _crestT - dt
if _crestT <= 0 then
SafeRemove(_tileFx)
ShowTip("砖收了——地面还原")
end
end
end, 0.02)
end
SL:ScheduleOnce(function()
SL:BindDebugButton("铺砖", function()
BrittleFloor.Cast()
end)
ShowTip("技能已加载: 碎地纹 (调试按钮触发)")
end, 1.0)
function BrittleFloor.Unload()
if _scheduler then SL:Unschedule(_scheduler) end
SL:UnregisterLUAEvent(LUA_EVENT_AFTER_ACTION, "BFL_Crack")
if _tid ~= 0 then SL:RemoveBuff(_tid, "SUNK") end
SafeRemove(_tileFx)
_crestT = 0
_crackN = 0
_sinkT = 0
end
return BrittleFloor
五、机制问答
问:它不出手砖就不裂吗?
答:对——裂痕认它的出手不认时间,站着装乖砖就完好,可不出手的怪还叫怪吗。
问:塌陷的一秒半里它还能挨你的刀吗?
答:能——陷下去只是它动不了,你的刀照砍照落,陷落的半截身子正好是靶心。
问:新砖重铺要它配合吗?
答:不要——塌后两秒自动重铺,裂痕当场清零,账本一窗一清,旧账不结转。
问:它的爪落空了也裂砖吗?
答:裂——砖认出手不认命中,劈空的那一爪照样砸裂脚下的砖,砖在它的落点上不在你身上。
问:塌陷能被它的霸体挡吗?
答:挡不住陷但挡得住伤——霸体怪照陷不误,塌陷账减半,说明栏写明"霸体减伤不减陷"。
六、调参指南与商业服怎么用
第四笔是裂痕的清账:塌陷收尾当场清零是那场跨窗报错的正解——旧裂痕结转到新砖上,第二窗一爪就塌,账本一塌糊涂,撕账的时机就是塌陷收尾那一拍。第三笔是塌陷的门槛:三块一塌是"一窗一塌"的节奏——门槛太低它出手就陷变成软控制,太高一窗塌不了一回砖白铺,三块刚好卡在"塌得看得见"的位置。第二笔是塌陷的深度:陷身一秒半加二十点是砖的收账——陷太深变成定身技,太浅它抖抖土就出来了,一秒半刚好够你白捡两刀。第一笔是裂痕的画工:裂纹要从砖心向四角爬、爬满才塌——裂纹的进度就是塌陷的倒计时,玩家数裂纹就知道它还能砸几爪。常见坑三个:裂痕计数跨窗结转的旧账报错;塌陷期间它出手的爪照常结算裂痕爆表;砖块图层没压在怪的影子底下穿帮。
商业服里碎地纹是"豆腐坊"的恶趣味:别人加固地面,他专铺酥的——商城里地砖的花色做成品级,陶砖、釉面砖、鎏金砖,那三块铺在怪脚下的灰紫方砖就是豆腐坊的样品砖。运营落地还有两笔:一段是引拳教学——教一句"站好别动,它的爪子比你有劲",流派第一课是站桩看戏;一段是拆台榜——按塌陷次数排名,砖铺得最酥的人有碑。变体做成连塌:塌陷的碎石再崩出两块碎砖砸向同伴——从塌自己到连累邻居,豆腐坊的砖越铺越损。这一篇的演示和整套模块照抄能跑,改的就是 CONST 那张表。
写完留一句给做地形系的同学:碎地纹卖的是"它的力气砸它自己的地基"——那三块爬满裂纹的方砖和陷下去的半截身子,是把敌方出手改成自拆工程的第一张酥砖合同。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
接手二开的兄弟几乎都撞过同一堵墙:玩家嫌走路"一格一格像机器人",老板拍板要"丝滑移动",改服务端速度?不对。改客户端动画帧…
【游戏功能】 先看一个熟场面:法师的火球特效挂在怪的脚后跟上,明明技能说明写着"焚烧其面",火星子却在地上打滚。群里有位策划…
【游戏功能】 上周有个开服的老板在群里发了一段录屏:他的战士明明刀刀都砍中了,观众却一片"这刀挥空了吧"。他原话是"判定日志…
【游戏功能】 先说结论放在开头:怪的皮一会儿绿一会儿红,不是美术换了几套贴图,是染色系统在怪身上盖了一层"色镜"。开服群里有…
前两天群里有个架设的朋友问了个需求:中毒的人要变绿、每两秒掉一次血、毒还能叠五层,问是不是要在服务端把整套状态机重写。我说你…
【游戏功能】 先抛一个坑:五口钟一模一样大,为什么一口比一口疼?先后次序动不得吗?倒过来敲会怎样?这篇把编钟纹整套写法拆开:…