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

炮仗:给它别一枚炮仗,三秒后听响

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

【游戏功能】

fuse = fuse - dt —— 计时器里一秒一秒烧掉的这一截引信,就是炮仗的全部脾气:别上去,捂耳朵,三秒后它自己响——二十五点,一分不多,一秒不少。这篇把整套模块拆开:配置表、炮仗构件、引信结算、定时器、调试按钮,一段一段照抄能跑。

一、效果演示:给它别一枚炮仗,三秒后听响

演示场点「别炮仗!」:玩家欺身一步把一枚红彤彤的炮仗别在怪身上——捻子滋滋地烧,头顶"引信 三秒"的倒计时一秒秒往下掉。这三秒里它该打你打你、该走路走路,炮仗不管闲事——它只管到点。捻子烧到头的刹那:"砰!"的一声,二十五点的红字砸它脸上,一圈红色的爆纹震得屏幕直晃。响完还能再别——四秒的冷却追着三秒的引信,炮仗可以一直挂在它身上。演示里试两种接法:别完就撤看它被自己的响吓一跳,和贴着脸别完接着砍——炮仗的二十五点是白送的加菜,怎么配菜随你。

demo
 fx-firecracker

二、底层原理:一枚挂身的炮仗加一段公开的引信

模块的机关是一对搭档。挂身炮仗:别上去的炮仗跟着怪的坐标走——它跑炮仗跟着跑,它跳炮仗跟着跳,附身的账认人不认位置。公开引信:三秒的倒计时写在它头顶——引信是明账不是暗雷,它有几秒好看,玩家有几秒好等。和血债簿那类积攒爆发的分野在"炮仗认时不认刀":血债簿的五笔要一刀刀喂,炮仗别上去就烧——挂引信的瞬间账已经定了,中间发生什么都是白送的演出。

引信为什么公开倒计时而不是暗记?暗记的版本玩家别完就忘,响不响全凭天意;公开的三秒让玩家把输出节奏往引信上对——捻子烧完的那一拍正好接一刀重击,爆和刀叠在一帧里,才是炮仗的正确打开方式。

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

lua
-- @file Firecracker.lua
-- 炮仗 —— 给它别一枚炮仗,三秒后听响

local Firecracker = {}

local CONST = {
    FUSE_TIME     = 3.0,
    POP_DMG       = 25,
    CRACKER_CD    = 4.0,

    COLOR_CRACK   = "#d84040",
    COLOR_DEEP    = "#5e1010",
    COLOR_GHOST   = "#f8b0a8",

    ZORDER_FUSE   = 134,
    ZORDER_FX     = 135,
    AUTOINC_BASE  = 1021000,
}

local _fuseT     = 0
local _fuseID    = 0
local _cdLeft    = 0
local _crackerFx = nil
local _scheduler = nil
local _autoInc   = 0

local function GenID(prefix)
    _autoInc = _autoInc + 1
    return string.format("%s_%d", prefix or "FCR",
        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 AttachCracker(tid)
    local tp = GetActorPos(tid)
    if not tp then return end
    SafeRemove(_crackerFx)
    _crackerFx = GUI:Layout_Create(GUI:Attach_SceneF(),
        GenID("Cracker"), tp.x - 14, tp.y - 100, 0, 0, false)
    GUI:setLocalZOrder(_crackerFx, CONST.ZORDER_FUSE)
    SL:PlayFuseSparkFx(tid)
    SL:TipAbove(tid, "别上!")
    ShowTip("炮仗别上了——三秒引信,捂耳朵")
end

local function PopCracker()
    local tp = GetActorPos(_fuseID)
    if tp then
        SL:ActorHurt(_fuseID, CONST.POP_DMG)
        SL:TipAbove(_fuseID, "砰!-25")
        SL:PlayPopFx(_fuseID)
        SL:ScreenShake(3.6, 0.24)
        ShowTip("响了——二十五点,一截炮仗的账")
        if SL:GetValue("ACTOR_DEAD", _fuseID) then
            ShowTip("它倒了——被炮仗送走的")
        end
    end
    SafeRemove(_crackerFx)
    _crackerFx = nil
end

四、核心代码:完整模块(下·定时器与引信燃烧)

lua
-- 别炮仗入口
function Firecracker.Stick()
    if _cdLeft > 0 then
        ShowTip("炮仗在手——" .. string.format("%.1f", _cdLeft) .. "秒")
        return
    end
    if _fuseT > 0 then
        ShowTip("捻子烧着呢——" .. string.format("%.1f", _fuseT) .. "秒")
        return
    end
    local tid = SL:GetValue("MARK_TARGET_ID")
    if not tid or SL:GetValue("ACTOR_DEAD", tid) then return end
    _cdLeft = CONST.CRACKER_CD
    _fuseT = CONST.FUSE_TIME
    _fuseID = tid
    AttachCracker(tid)
end

-- 定时器:引信燃烧与爆响结算
if not _scheduler then
    _scheduler = SL:Schedule(function(dt)
        _cdLeft = math.max(0, _cdLeft - dt)
        if _fuseT <= 0 then return end
        if SL:GetValue("ACTOR_DEAD", _fuseID) then
            _fuseT = 0
            SafeRemove(_crackerFx)
            _crackerFx = nil
            return
        end
        _fuseT = _fuseT - dt
        local tp = GetActorPos(_fuseID)
        if _crackerFx and tp then
            GUI:setPosition(_crackerFx, tp.x - 14, tp.y - 100)
        end
        if _fuseT <= 0 then PopCracker() end
    end, 0.02)
end

SL:ScheduleOnce(function()
    SL:BindDebugButton("别炮仗", function()
        Firecracker.Stick()
    end)
    ShowTip("技能已加载: 炮仗 (调试按钮触发)")
end, 1.0)

function Firecracker.Unload()
    if _scheduler then SL:Unschedule(_scheduler) end
    SafeRemove(_crackerFx)
    _fuseT = 0
end

return Firecracker

五、机制问答

问:炮仗响之前怪死了算谁的?
答:账清人清——尸体上挂不住引信,炮仗随死销账,想听响就别把人提前打死。

问:引信能被扑灭吗?
答:不能——捻子进了水都烧,三秒的账认时不认命,这也是炮仗比投掷物省心的地方:别上去就不用管。

问:能同时别两枚吗?
答:不能——一身的炮仗眼只够一枚,响完再别,两枚连爆的版本怪直接变成烟花架。

问:引信期怪被控住了响吗?
答:响——引信烧它的表不走它的账,冻着的、晕着的、埋着的,到点一样炸,控制配合炮仗是标准连招。

问:爆响的范围波及邻居吗?
答:只炸持仗的——炮仗是贴身的小响不是范围炮,想波及邻居那是尸爆的生意。

六、调参指南与商业服怎么用

第四笔是引信的长度:三秒对四秒的冷却是"响完不久又能别"的循环——引信五秒的版本节奏拖沓,两秒的版本等于点完就炸,三秒刚好留出"对节奏"的空当。第三笔是响伤的斤两:二十五点对十点平砍是两刀半的一声炮——响伤太薄炮仗成了逗猫棒,太厚附身系变成主力输出,两刀半是配菜的身价。第二笔是挂身的跟随精度:炮仗的坐标一帧不落地跟着怪走——挂身的账差半步,别炮仗就成了扔炮仗。第一笔是引信的声画:捻子的滋滋声和火星要随倒计时变急——引信烧得越急火星越密,听觉上的倒计时比头顶数字更催人。常见坑三个:怪死亡炮仗没销账,尸体上挂着一枚不响的炮仗;引信期怪被推下悬崖,炮仗跟着掉进虚空照响;爆响的击杀归属挂成环境伤害,战绩页少一块。

商业服里炮仗是"爆竹铺流派"的年货:别上去的每一枚都是过年的动静——商城里炮仗的样式做成品级,红炮、金炮、千响炮,别炮仗那一欺身的步子和捻子的滋滋声就是爆竹铺的名场面。运营落地还有两笔:一段是贴身教学——教一句"别完退半步,响的时候站远点",流派的安全须知写在第一课;一段是响榜——按引信结算的总伤排名,最爱听响的人有碑。变体做成千响连珠:一次别三枚小炮仗错峰响——从一声到一挂,过年的气氛直接拉满。这一篇的演示和整套模块照抄能跑,改的就是 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 技术组