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

烟花大会:一飞冲天满天星

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

【游戏功能】

年三十的直播名场面:主播点了三十多发烟花,屏幕上炸成一片,弹幕齐刷"这特效值三 Legion 币"。烟花是所有特效里性价比最高的演出——一颗弹、一次炸、满天星,三个元素撑起整个节日的气氛。今天拆烟花大会的表现,看一朵烟花怎么从升空开到谢幕。

一、升空、炸裂、坠落三段生命

烟花的生命三段。升空段:弹体拖着渐隐的尾焰冲天,速度在重力下递减——升空的末端速度降到临界值是爆炸的扳机,炸点永远在"冲不动了"的地方,物理上站得住,观感上也合理。炸裂段:弹体消失的瞬间,几十颗星屑沿圆周均匀炸开,每颗星屑带一条渐隐拖尾——圆周的均匀是"花开"的形状感,随机的抖动是"活"的气息。坠落段:星屑在重力和空气阻力下缓缓下沉,亮度衰减到熄灭——坠落比上升长一倍,烟花的余韵全在这段慢半拍的下坠里。三段的时间配比是一比二比四:炸得越快,灭得越慢,节奏自然成诗。

完整演示在这,点一下升空:

demo
fx-fireworks

二、幂尔框架实现:弹道切换与粒子爆炸

升空弹道和星屑粒子是两套系统,爆炸回调做切换:

lua
local Fireworks = {}
local KEY = { GRAVITY = 300, LIFE = 1.8 }

local stars = {}

function FW.Launch(x)
    local c = SL:PickColor({"red", "gold", "blue", "green", "purple"})
    local rocket = {
        x = x, y = SL:GetValue("height"),
        vy = -(360 + math.random() * 80),
        top = 50 + math.random() * 60,
        color = c, count = SL:GetValue("burstCount") or 36
    }
    SL:Schedule(function(dt)
        rocket.vy = rocket.vy + KEY.GRAVITY * dt
        rocket.y = rocket.y + rocket.vy * dt
        SL:SetFxPos("rocket", rocket.x, rocket.y)
        SL:PlayTrail("rocket_trail", rocket.x, rocket.y)
        -- 速度衰减到临界: 半空起爆
        if rocket.vy > -60 or rocket.y <= rocket.top then
            SL:UnSchedule("rocketFly")
            SL:RemoveFx("rocket")
            FW.Burst(rocket)
        end
    end, 0.016, "rocketFly")
end

function FW.Burst(r)
    SL:PlayFxAt("burst_flash", r.x, r.y)
    SL:PlaySfx("boom")
    for i = 1, r.count do
        local a = i / r.count * 6.28
        stars[#stars + 1] = {
            x = r.x, y = r.y,
            vx = math.cos(a) * (90 + math.random() * 90),
            vy = math.sin(a) * (90 + math.random() * 90),
            t = 0, c = r.color
        }
    end
    -- 星屑统一衰减
    SL:Schedule(function(dt)
        local alive = false
        for _, s in ipairs(stars) do
            if s.t < KEY.LIFE then
                alive = true
                s.t = s.t + dt
                s.vy = s.vy + 60 * dt              -- 星屑重力减半
                s.vx = s.vx * (1 - dt * 0.8)       -- 空气阻力
                s.x = s.x + s.vx * dt
                s.y = s.y + s.vy * dt
            end
        end
        if not alive then
            SL:UnSchedule("starFall")
            stars = {}
        end
    end, 0.016, "starFall")
end

return FW

星屑的重力只有弹体的一半、空气阻力翻倍——半重半阻才有"缓缓飘落"的余韵,全重力就成流星雨了。

三、连放的编排与颜色节奏

一发烟花是独奏,连放才是大会。连放的编排三原则:位置错开(左右交替、不留死区)、颜色轮换(同色连发像复读机)、间隔递减(越到高潮放得越密)。演示里的滑块控制单发的星屑数,正式玩法里这个数随连放次数递增——第一发三十六点,第十发六十点,气氛自然爬坡。颜色节奏上,星屑拖尾的颜色要比爆点淡两档,白色的中心点只给爆开后零点三秒——白点的存在是"刚炸开"的新鲜感,拖久了就是灯泡。最后,夜空的底噪要克制:四十颗静态小星是天空的底色,它们不闪不灭,烟花的亮才显得珍贵。

作者履历与出处

本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。

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

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

LATEST ARTICLES

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

进阶实战游戏功能

围三阙一:围三面赶一口,出口就是网口

【游戏功能】 围住一只怪的贪心人人都有:三面堵死一只不漏——可围三阙一的规矩偏偏唱反调:围三面留一口,怪只会往那口里钻——口…

2026-09-30 21:31 996 技术组
进阶实战游戏功能

引水:先泼水,再借一道雷

【游戏功能】 元素搭配的老话是水火不容,可战场上的说法得倒过来念:水是雷的引信。引水的机制是一场两步的合谋:先泼一瓢水把地泼…

2026-09-30 21:31 996 技术组
进阶实战游戏功能

血珠:踩碎血珠,断它口粮

【游戏功能】 低血大怪的回血机制人人见过,可血珠的回血藏着一手"要你去抢"的心机:它每掉两成血就吐一颗血珠在地上,两秒内不踩…

2026-09-30 21:31 996 技术组
进阶实战游戏功能

现身:它钻进影子,从你背后出来

【游戏功能】 隐形怪人人都遇到过,可现身的机制比隐形狠:它钻进影子里消失,一秒后从你脚下画的影圈里钻出来,背刺三十四点——影…

2026-09-30 21:31 996 技术组
进阶实战游戏功能

召唤阵:踩阵搅了它的援兵

【游戏功能】 有人纳闷:大怪危机预警里最气人的一档是什么?不是它放大招,是它开阵——法阵一转,转满三秒蹦出两只小狼,好好的单…

2026-09-30 21:31 996 技术组
进阶实战游戏功能

蓄力炮:红线锁死就横挪

【游戏功能】 if chg <= 0.8 then lock = true ——一行把"锁定"写进蓄力里的判定,道破了蓄力炮…

2026-09-30 21:31 996 技术组