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

钟摆:半场一摆,谁站线上谁挨砸

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

【游戏功能】

半场一摆两秒一趟的钟摆,砸中站线上的一切——包括被你引过去的怪。钟摆把"地形"变成了武器:它本身不认敌我,你引它站上摆线,摆锤替你砸。这篇把整套模块拆开:配置表、钟摆构件、扫线判定、定时器、调试按钮,一段一段照抄能跑。

一、效果演示:半场一摆,谁站线上谁挨砸

演示场半场横着一道摆线,摆锤两秒扫一趟。怪要打你就得跨过摆线——它扑过来的那一下正好撞上摆锤:"砸-十五"外带懵一秒。你的刀在圈外补伤害,摆锤在线上收过路费。点「引怪!」:一声哨响它扑得更急——扑得急撞得准,摆锤的账结得更快。演示里看门道:摆线的虚线画在地上,摆锤的轨迹扫过半场——你的走位课只有一句:别站线上,把它按在线上。钟摆玩的是借势:锤子不是你的,账是它替你收的。

demo
 fx-pendulumsw

二、底层原理:一座钟摆构件加一次扫线判定

模块的机关是一对搭档。钟摆构件:摆锤挂在半场上空沿弧线扫——扫过的横带就是摆线,两秒一趟,趟趟同线。扫线判定:摆锤经过的那零点四秒里,横带上的目标各挨十五加懵一秒——砸认位置不认阵营,玩家站线上一样挨砸,钟摆面前人人平等。和火墙那些常驻区域的分野在"钟摆是扫的不是烧的":火墙站进去持续掉血,钟摆只在扫过的一瞬结账——错开那零点四秒,摆线就是安全区,掐准那零点四秒,摆线就是刑场。

摆锤为什么不认敌我?认敌我的摆锤是玩家的仆从,不认敌我的摆锤才是地形——地形的威严就在于它连帮你都顺带着威胁你。

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

lua
-- @file PendulumSw.lua
-- 钟摆 —— 半场一摆,谁站线上谁挨砸

local PendulumSw = {}

local CONST = {
    SWING_L       = 300,
    SWING_R       = 420,
    SWING_GAP     = 2.4,
    SWING_WINDOW  = 0.4,
    SWING_DMG     = 15,
    SWING_STUN    = 1.0,

    COLOR_PEND    = "#c89098",
    COLOR_DEEP    = "#54282e",
    COLOR_GHOST   = "#f4d8dc",

    ZORDER_SWING  = 136,
    ZORDER_FX     = 135,
    AUTOINC_BASE  = 1057000,
}

local _stunT     = 0
local _stunID    = 0
local _cdLeft    = 0
local _scheduler = nil
local _autoInc   = 0

local function GenID(prefix)
    _autoInc = _autoInc + 1
    return string.format("%s_%d", prefix or "PDS",
        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 ShowTip(msg)
    if msg and msg ~= "" then SL:ShowSystemTips(msg) end
end

local function InSweep(x, k)
    local sweep = CONST.SWING_L
        + k * (CONST.SWING_R - CONST.SWING_L)
    return math.abs(x - sweep) <= 30
end

local function Smashed(tid)
    _stunT = CONST.SWING_STUN
    _stunID = tid
    SL:ActorHurt(tid, CONST.SWING_DMG)
    SL:TipAbove(tid, "砸-15")
    SL:StunActor(tid, CONST.SWING_STUN)
    SL:PlaySmashFx(tid)
    SL:ScreenShake(3, 0.2)
    ShowTip("摆锤砸中——十五点外加懵一秒")
    if SL:GetValue("ACTOR_DEAD", tid) then
        ShowTip("它倒了——被摆锤送走的")
    end
end

四、核心代码:完整模块(下·定时器与扫线判定)

lua
-- 定时器:摆锤相位与扫线结算
if not _scheduler then
    _scheduler = SL:Schedule(function(dt)
        _cdLeft = math.max(0, _cdLeft - dt)
        if _stunT > 0 then
            _stunT = _stunT - dt
            if _stunT <= 0 then
                ShowTip("它缓过来了——再引一趟")
            end
            return
        end
        local tid = SL:GetValue("MARK_TARGET_ID")
        if not tid or SL:GetValue("ACTOR_DEAD", tid) then return end
        local phase = SL:GetTime() % CONST.SWING_GAP
        if phase >= 1.0 and phase < 1.0 + CONST.SWING_WINDOW then
            local k = (phase - 1.0) / CONST.SWING_WINDOW
            local tp = GetActorPos(tid)
            if tp and InSweep(tp.x, k) then
                Smashed(tid)
            end
        end
    end, 0.02)
end

SL:ScheduleOnce(function()
    SL:BindDebugButton("引怪", function()
        SL:HurryFoeTowardUser()
    end)
    ShowTip("技能已加载: 钟摆 (调试按钮触发)")
end, 1.0)

function PendulumSw.Unload()
    if _scheduler then SL:Unschedule(_scheduler) end
    SL:UnregisterLUAEvent(LUA_EVENT_BEFORE_HURT, "PDS_Shield")
    _stunT = 0
end

return PendulumSw

五、机制问答

问:玩家站线上也挨砸吗?
答:挨——钟摆不认阵营,引怪的人自己站线上照样被砸飞,摆线的课第一句就是别站线上。

问:引怪有冷却吗?
答:三秒一吹——哨声把怪叫得扑向玩家,扑的路线穿过摆线就结账,冷却管哨不管锤。

问:摆锤能砸中两只吗?
答:能——扫线认横带不认数量,两怪并排过线一起砸,摆线的账按位置记不按人头记。

问:懵的一秒里怪还会追人吗?
答:不追——懵态定住方向和脚步,醒来的第一拍照旧追,懵是暂停不是劝退。

问:摆锤砸死怪算谁的击杀?
答:算玩家的——哨是玩家吹的位是玩家引的,因果链起点在玩家手里,账就记玩家头上。

问:摆锤能引头目吗?

答:能——头目也认摆线的账,砸头目十五外加懵一秒,引得动就砸得着。

问:摆锤砸两只能连懵吗?

答:能——懵认位置不认数量,并排站线上的一起懵,钟摆的账按位置记。

问:摆锤的路线能改吗?

答:不能——钟摆认场不认人,半场的摆线钉死,改路线的是你的走位不是它。

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

第四笔是扫线的宽度:一百二十步的横带对怪五十步的身位是"一趟必扫一次"的账——横带太窄引三次才中一次,太宽怪一进半场就被钉死。第三笔是摆的周期:两点四秒一趟对引怪的冷却三秒是"哨一响锤就到"的配合——周期太短锤成了机关枪,太长引两次碰不上一锤。第二笔是砸的斤两:十五点加一秒懵是"白得一刀加一站"的双份——砸太轻引怪是白引,太重钟摆成了主力输出。第一笔是摆线的诚实:虚线摆线与判定的横带严丝合缝——线画在哪砸在哪,视觉和判定的账必须一比一。常见坑三个:摆锤的扫过判定用了中心点,怪半身过线漏判;懵态的怪撞上二次扫线重复结算;摆锤动画的相位和判定的相位漂移,看着砸中了其实没判。

商业服里钟摆是"守钟人流派"的镇场钟:别人引怪靠仇恨,他引怪靠钟——商城里摆锤的样式做成品级,铜锤、石锤、古钟锤,摆锤扫过半场的那道弧光就是守钟人的钟声。运营落地还有两笔:一段是引位教学——教一句"哨一吹它准扑,扑的路就是摆的路",流派第一课是算它的脾气;一段是守钟榜——按摆锤砸中的总伤排名,钟引得最准的人有碑。变体做成双摆:半场两座钟摆交错扫——从躲一摆到躲两摆,守钟人的钟楼越挂越满。这一篇的演示和整套模块照抄能跑,改的就是 CONST 那张表。

守钟人的老话只有一句:别站线上,让它站。

守钟人的第二课:摆锤的相位背下来,你的哨声就是它的催命符。

守钟人的第三课:摆线上不站人,也不站怪——站怪。

写完留一句给做地形系的同学:钟摆卖的是"半场就是你的钟楼"——那道两秒扫一趟的摆线和懵在线上的怪,是把地形改写成不受雇于任何人的打手的一次借势。

作者履历与出处

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

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

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

LATEST ARTICLES

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

进阶实战游戏功能

磁引:四秒磁点,它的箭全拐进这点碎掉

【游戏功能】 磁点一开,它的箭全拐——四秒里它射出的每一支箭都拐向同一个聚点,到了聚点整支碎掉,一支都够不着你。磁引把"躲箭…

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

钟摆:半场一摆,谁站线上谁挨砸

【游戏功能】 半场一摆两秒一趟的钟摆,砸中站线上的一切——包括被你引过去的怪。钟摆把"地形"变成了武器:它本身不认敌我,你引…

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

铰击:两键同按,铰它一下二十

【游戏功能】 两键同按零点一五秒内——铰击:两把刃铰在一起砸它二十,外加半秒的僵。单按一键只有十点白给。这篇把整套模块拆开:…

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

三环扣:三角链死一伤二,连环清场

【游戏功能】 三只怪三角连着链:死一只,另外两只各挨十五;链上再倒一只,最后那只又挨十五——三环扣把"清怪"变成了"连环",…

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

蓄盾爆:按住攒盾,盾值就是弹量

【游戏功能】 按住攒盾,盾值就是弹量,松手引爆贴脸的怪——蓄盾爆把"防御"改写成了"蓄弹药":盾攒得越厚炸得越疼,攒盾的两秒…

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

三键诀:劈刺扫按对了顺序,一记四十

【游戏功能】 按对 劈→刺→扫 三键,一记四十;按错一环,只值八点平砍。三键诀把连招的顺序做成了考卷:三枚键摆在你面前,顺序…

2026-10-01 16:31 996 技术组