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

扫堂光纹:光柱贴地横扫,扫到哪烧到哪

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

【游戏功能】

单行代码拆解:先看一行代码:光压着谁,谁挨烧——扫堂光的全部判定就在这一行:一道光柱从左往右匀速横扫,光柱压在谁身上谁就掉血,扫过去就停。没有范围圈、没有落点提示,一根光的横坐标就是全部。这篇把扫堂光纹整套写法拆开:引光垂落、光柱横扫、压身即烧、扫尽即收,一段一段照抄能跑。

一、效果演示

演示场神殿穹顶下一道天光垂落。点「引光!」:一根金灿灿的光柱从战场最左端落地,匀速往右横扫——光柱压在怪身上的时候,每零点二秒烧六,扫过去立刻停。怪要是往光柱前面跑,就是自己往火上撞。十秒一引,光的横坐标就是死的宣判,站在光里越久烧得越狠。

mermaid
flowchart TD
A[点引光] --> B[光柱落在最左]
B --> C[匀速往右扫]
C --> D{光压着怪了吗}
D -- 压着 --> E[每零点二秒烧六]
D -- 没压着 --> C
E --> F{光扫尽了吗}
F -- 没有 --> C
F -- 扫尽 --> G[收光 十秒后再引]
demo
 fx-crest-beam

二、底层原理

扫堂光的机关是"一根横坐标"——光柱的位置是一个每拍加三百的数,判定、伤害、画面全读这一个数:光压着怪的坐标就烧,烧的节拍是零点二秒一跳。那行判定的干净来自于把三件事焊在同一个数上——画面画在哪、判定判在哪、账落在哪,一个坐标说了算,谁也分不了家。
匀速横扫是这道招的纪律:光不追人、不加速、不回头,玩家能掐着光的速度算自己该往哪躲、该在哪一格光里蹭输出。可预测的环境光是把双刃剑:怪和玩家都在光里,谁站得久谁吃亏——引光的时机因此有了学问:怪被定住的瞬间引光,光就在它身上多压几拍。幂尔框架这边光柱的横坐标收在每拍推进里,烧的节拍是独立的小秒表,扫尽的收光写在坐标出界的那一行。

这套玩法的代码量不到七十行,难的不是画光而是三件事焊一个数——画面、判定、账本共用一根横坐标,光才扫得理直气壮。

再看烧的节拍为什么是零点二秒一跳而不是持续掉血——持续掉血的账每帧都在变,玩家看不到自己的亏空涨到哪了;跳拍的账一跳一记,六点六点地蹦,亏空看得见数得清。可见的亏空是环境伤害的礼数:环境要烧人,就得让人知道自己烧掉了多少。

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

lua
-- @file CrestBeam.lua
-- 扫堂光纹 —— 光柱贴地横扫 扫到哪烧到哪

local CrestBeam = {}

local CONST = {
    SWEEP_SPEED   = 300,
    BEAM_HALF     = 32,
    BURN_TICK     = 0.2,
    BURN_DMG      = 6,
    BEAM_CD       = 10,

    AUTOINC_BASE  = 1204600,
}

local _x        = 60
local _on       = false
local _tick     = 0
local _cd       = 0
local _autoInc  = 0

local function ShowTip(msg)
    if msg and msg ~= "" then SL:ShowSystemTips(msg) end
end

local function GenID()
    _autoInc = _autoInc + 1
    return CONST.AUTOINC_BASE + _autoInc
end

function CrestBeam.Pos() return _x end

-- 引光: 光柱落在最左
function CrestBeam.Summon()
    if _cd > 0 then
        ShowTip("天光还没聚——再等" .. math.ceil(_cd) .. "秒")
        return
    end
    _cd = CONST.BEAM_CD
    _on = true
    _x = 60
    _tick = 0
    ShowTip("天光垂落——横扫开始")
end

四、核心代码:完整模块(下·推进与卸载)

lua
-- 每拍推进: 压身即烧 扫尽即收
if not _ticker then
    _ticker = SL:Schedule(function(dt)
        if _cd > 0 then _cd = _cd - dt end
        if not _on then return end
        _x = _x + CONST.SWEEP_SPEED * dt
        _tick = _tick - dt
        if _tick <= 0
            and math.abs((SL:GetValue("mobX") or 0) - _x)
                < CONST.BEAM_HALF then
            _tick = CONST.BURN_TICK
            ShowTip("光压着了——烧" .. CONST.BURN_DMG)
        end
        if _x > 800 then
            _on = false
            ShowTip("光扫尽——十秒后再引")
        end
    end, 0.02)
end

SL:ScheduleOnce(function()
    SL:BindDebugButton("引光!", function()
        CrestBeam.Summon()
    end)
    ShowTip("技能已加载: 扫堂光纹")
end, 1.0)

function CrestBeam.Unload()
    if _ticker then SL:Unschedule(_ticker) end
    _on = false
end

return CrestBeam

五、机制问答

问:光扫的判定为什么干净?
答:画面、判定、账本共用一根横坐标——一个数说了算,谁也分不了家。

问:光为什么不追人?
答:匀速是纪律——可预测的光才能算,怪和玩家都在光里排队领烧。

问:烧的节拍为什么跳拍不持续?
答:跳拍的亏空看得见——六点六点地蹦,烧掉多少数得清。

问:引光的时机有什么学问?
答:怪被定住时引光——光在它身上多压几拍,烧的账翻倍。

问:光柱扫尽收在哪?
答:坐标出界那一行——扫尽的收光写在推进的尽头,账面不留悬光。

六、调参与实战怎么用

参数层面三个量——扫速、光柱宽度、烧拍间隔。三百的扫速配三十二的半宽:扫完一屏两秒出头,站桩的怪必挨四拍上下。实战里这套一根横坐标的骨架能搬去搜索灯、火焰喷射、死亡行军光墙,全是垂落、横扫、压身即烧一条线。常见坑两个:光追人扫成处刑;烧拍密得看不清亏空。

补充一个设计层面的思考——招式的动作语言决定玩家怎么用招:回旋的招教人卡身位、抡圆的招教人贴距离、横扫的招教人排队列,每种动作自带一门功课。设计招式先想清楚要教玩家哪门功课,动作语言照着功课设计,招式才教得进人。

补充一个维护层面的思考——带轨道和弹道的运动体(回旋的刃、抡摆的锤、弹跳的弹)每个都要有自己的寿命终点:飞回手里、抡完收势、弹完化雾,终点一到就清账。没有终点的运动体是最难缠的幽灵——转了三十圈还在飞、弹了一百次还在弹,查起账来满屏都是它们。

补充一个工程层面的思考——判定窗口的开合要跟着动画的帧走而不是跟着表的读数走:动画播到接触帧判定开启,播过接触帧判定关闭,动画与判定共用同一口时钟。判定窗口和动画两张皮的招式,玩家看着打中了没账、账面有了没打中,全是时钟没对齐。

补充一个演出层面的思考——同一副骨架里认招,靠的是出手前三拍的预告各不相同:索有甩臂、壶有举顶、遁地有蹲身、扇骨有反手抽鞘、穿身有点地、引光有仰头,玩家读的就是这三拍。新招式设计完先自查一遍:把几只演武的预告帧摆在一处,长得一样就回炉。预告的差异比命中的差异更要紧——命中的爽只有半秒,预告的辨识度才是玩家认招的根据,也是每一出演武各有其相的根本。

写完留一句给做环境系的同学:玩家躲的是光也是那根横坐标——三事焊一数,扫堂光才扫得理直气壮。

作者履历与出处

本文由 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 技术组