CHUAN2 DEV ENGINE
996 正版授权研发中心 · 360 授权合作教学中心 · 抖音传奇直播合作授权 · 快手推广运营商授权
OFFICIAL LICENSED ACADEMY 查验官方授权证书 →
// 威海旷世互娱教学基地 · 技术文章
进阶实战游戏功能996引擎

碎地砖纹:它的爪子砸塌自己脚下的地

2026-10-01 22:55 作者:996 技术组 996引擎Lua教程传奇脚本进阶实战游戏功能996引擎

【游戏功能】

上一版藏了个打满全场才会露头的隐蔽报错:碎地砖的裂痕跨窗不清零——第一窗三块砖裂完塌过一回,第二窗新铺的砖被它一爪就砸塌,账面上裂痕从旧窗结转了过来。追到底发现塌陷结算只铺了新砖没撕旧账,碎裂计数器带着旧账进了下一窗。修完把清账写进塌陷的收尾,顺手把这套机制整理成篇。碎地纹的账很损:铺在你和它之间的地砖是酥的——它每一爪砸下来都先砸裂自己脚下的砖,三块裂满,连砖带它一起陷下去。这篇把整改后的整套模块拆开:配置表、铺砖结算、裂痕累计、塌陷结算、清账时机、定时器、调试按钮,一段一段照抄能跑。

一、效果演示:它的爪子砸塌自己脚下的地

演示场怪照常抡爪。点「铺砖!」:它脚下铺开三块灰紫色的砖——十二秒砖期。它的每一爪砸向你,落点都在自己脚下——爪风过处,一块砖当场裂出白纹,"裂!"的字蹦出来。三爪三裂,第三块砖裂满的那一拍——整片砖塌下去,它跟着陷了半截身子,"塌-20"的紫字砸出,碎石四溅。两秒后新砖铺好,账本重开,它的爪又开始砸自己的地。演示里试两笔账:不铺砖硬挨它的爪和铺砖让它自己拆自己的台——它的输出一点没少,可每一爪都在给自己的坟墓添砖。碎地纹教的是借力:让它自己的力气砸自己。

demo
 fx-brittlefloor

二、底层原理:一次铺砖结算加一次裂痕累计

模块的机关是一对搭档。铺砖结算:开纹那一拍在怪的脚下铺三块酥砖——砖认的是它脚下的地,铺好即生效,它的爪子落下来就要过砖。裂痕累计:它的每一次出手都砸裂一块——三块裂满当场塌陷,它陷下去吃塌陷账,两秒后新砖重铺、裂痕清零,下一轮接着拆。和反伤类机制的分野在"碎地收的是它的力气不是它的血":反伤是它打你多少它掉多少血,碎地是它的每一爪都在拆自己脚下的地基——血分文不掉,塌的是它站的地方,罚的是它出手这个动作本身。

塌陷为什么钉在三块?一爪就塌的版本它出手即陷,出手权被整段没收成了软控制;五块又太慢一窗塌不了一回;三块刚好是"一窗一塌"的节奏——塌得看得见,又不会塌成常态。

三、核心代码:完整模块(上·骨架)

lua
-- @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

四、核心代码:完整模块(下·裂痕累计与塌陷结算)

lua
-- 裂痕累计:它每一次出手都砸裂一块
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 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。

← 返回文章地图返回研学路径

幂尔框架 · 实战干货 · 接口调用

LATEST ARTICLES

全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →

进阶实战游戏功能

走一格为什么是半秒?拆开996引擎走路状态机

接手二开的兄弟几乎都撞过同一堵墙:玩家嫌走路"一格一格像机器人",老板拍板要"丝滑移动",改服务端速度?不对。改客户端动画帧…

2026-10-03 05:31 996 技术组
进阶实战游戏功能

特效总挂在脚后跟上?挂点表选对一行顶十行

【游戏功能】 先看一个熟场面:法师的火球特效挂在怪的脚后跟上,明明技能说明写着"焚烧其面",火星子却在地上打滚。群里有位策划…

2026-10-03 05:30 996 技术组
进阶实战游戏功能

刀刀都判命中,玩家为什么喊挥空?命中表现差的那一拍

【游戏功能】 上周有个开服的老板在群里发了一段录屏:他的战士明明刀刀都砍中了,观众却一片"这刀挥空了吧"。他原话是"判定日志…

2026-10-03 05:30 996 技术组
进阶实战游戏功能

怪的皮一会儿绿一会儿红?状态染色的色号表就三列

【游戏功能】 先说结论放在开头:怪的皮一会儿绿一会儿红,不是美术换了几套贴图,是染色系统在怪身上盖了一层"色镜"。开服群里有…

2026-10-03 05:30 996 技术组
进阶实战游戏功能

996引擎Buff系统解剖:中毒变绿、冰冻发白是怎么挂上去的

前两天群里有个架设的朋友问了个需求:中毒的人要变绿、每两秒掉一次血、毒还能叠五层,问是不是要在服务端把整套状态机重写。我说你…

2026-10-03 05:25 996 技术组
进阶实战游戏功能

编钟纹:五口钟排着敲,一口更比一口疼

【游戏功能】 先抛一个坑:五口钟一模一样大,为什么一口比一口疼?先后次序动不得吗?倒过来敲会怎样?这篇把编钟纹整套写法拆开:…

2026-10-03 05:01 996 技术组