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

重力井:重力井吸怪加减速

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

【游戏功能】

重力井一开,怪往中心拉——四秒里它的每一步都被拽回井心,走三步退两步,想跑跑不掉。这篇把整套模块拆开:配置表、重力井构件、吸拉结算、定时器、调试按钮,一段一段照抄能跑。

一、效果演示:重力井吸怪,站进去走不动

演示场点「引力井!」:怪脚下亮起一圈紫色的井环——四秒里它每走一步都被拽回半步,整只怪被钉在井心附近打转。你的刀在外面补伤害,它的血条一格一格往下掉。四秒一过井散了,它重获自由——但血已经掉了一截。演示里试两笔账:井里打四秒的输出,和没有井追着打的输出——井里的输出效率是追着打的两倍。重力井教的是控制:不是让它不能动,是让它动不了。

demo
 fx-gravitywell

二、底层原理:一面重力井构件加一次吸拉结算

模块的机关是一对搭档。重力井构件:井开的那一帧在怪的位置定下井心——四秒里怪的每一帧坐标被拉向井心,拉力按距离衰减,离井心越近拉力越弱。吸拉结算:井不直接扣血,它的"伤害"是让怪动不了——走不出去就是最大的伤害,因为你的每一刀都在井心的射程内。和禁足那些硬控的分野在"井是拉力不是锁":禁足让怪原地定住一步不动,重力井让怪往中心走但走不出去——拉力和走力的对抗是看得见的,怪在井里的挣扎也是看得见的。

井心为什么不固定在施术时的怪坐标?井心定在开井那一帧的怪坐标,不跟怪走——怪的挣扎会把它拉离井心但拉力又把它拽回来,这种"差一点就逃出去"的视觉感就是重力井的张力。

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

lua
-- @file GravityWell.lua
-- 重力井 —— 重力井吸怪往中心拉,站进去走不动

local GravityWell = {}

local CONST = {
    WELL_LIFE     = 4.0,
    WELL_CD       = 5.0,
    WELL_RADIUS   = 100,
    PULL_FORCE    = 200,

    COLOR_WELL    = "#6868b8",
    COLOR_DEEP    = "#1a1a52",
    COLOR_GHOST   = "#c8c8f4",

    ZORDER_WELL   = 130,
    ZORDER_FX     = 135,
    AUTOINC_BASE  = 1070000,
}

local _wellT     = 0
local _wellX     = 0
local _wellY     = 0
local _cdLeft    = 0
local _wellFx    = nil
local _scheduler = nil
local _autoInc   = 0

local function GenID(prefix)
    _autoInc = _autoInc + 1
    return string.format("%s_%d", prefix or "GPW",
        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 GravityWell.Cast()
    if _cdLeft > 0 or _wellT > 0 then return end
    local tid = SL:GetValue("MARK_TARGET_ID")
    local tp = GetActorPos(tid)
    if not tid or not tp then return end
    _cdLeft = CONST.WELL_CD
    _wellT = CONST.WELL_LIFE
    _wellX = tp.x
    _wellY = tp.y
    SafeRemove(_wellFx)
    _wellFx = GUI:Layout_Create(GUI:Attach_SceneF(),
        GenID("Well"), _wellX, _wellY, 0, 0, false)
    GUI:setLocalZOrder(_wellFx, CONST.ZORDER_WELL)
    SL:PlayWellStartFx(_wellX, _wellY)
    ShowTip("重力井开了——四秒吸怪往中心拉")
end

四、核心代码:完整模块(下·定时器与吸拉推进)

lua
-- 定时器:吸拉推进与井环演出
if not _scheduler then
    _scheduler = SL:Schedule(function(dt)
        _cdLeft = math.max(0, _cdLeft - dt)
        if _wellT > 0 then
            _wellT = _wellT - dt
            local tid = SL:GetValue("MARK_TARGET_ID")
            local tp = tid and GetActorPos(tid)
            if not tp then
                _wellT = 0
                SafeRemove(_wellFx)
                return
            end
            local dx = _wellX - tp.x
            local dy = _wellY - tp.y
            local dist = math.sqrt(dx * dx + dy * dy)
            if dist > 3 then
                SL:SetActorPos(tid,
                    tp.x + dx * 2 * dt,
                    tp.y + dy * 2 * dt)
            end
            if _wellT <= 0 then
                SafeRemove(_wellFx)
                ShowTip("井散了——它自由了")
            end
        end
    end, 0.02)
end

SL:ScheduleOnce(function()
    SL:BindDebugButton("引力井", function()
        GravityWell.Cast()
    end)
    ShowTip("技能已加载: 重力井 (调试按钮触发)")
end, 1.0)

function GravityWell.Unload()
    if _scheduler then SL:Unschedule(_scheduler) end
    SafeRemove(_wellFx)
    _wellT = 0
end

return GravityWell

五、机制问答

问:井心为什么定在开井时的怪坐标?
答:井心定在开井时怪的位置——这样怪不管怎么挣扎都在井的拉力范围内,井心跟着怪走的版本井就变成了移动控制。

问:重力井对玩家有效吗?
答:有效——井认位置不认阵营,玩家走进井里照样被拉,重力井面前人人平等。

问:井里的怪能还手吗?
答:能——井是拉力不是控制,怪的爪子照拍箭照射,它只是走不出去,攻击链完全不受影响。

问:重力井和禁足叠加吗?
答:叠加效果古怪——拉力往中心拽禁足往原地钉,两套力抵消的结果是怪在原地剧烈抖动,视觉搞笑但功能重复。

问:井的持续时间能刷新吗?
答:不能——四秒走完井就散,刷新的版本井变成永久吸怪器,散了的四秒才是玩家的输出窗口。

问:重力井里的怪能攻击吗?

答:能——井是拉力不是沉默,怪的攻击链照转,只是走不动而已,井里挨刀还手是它的权利。

问:井里的怪血量见底了井还在吗?

答:在——井认时间不认血量,四秒走完才散,怪死了井也照常转完最后的倒计时。

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

第四笔是拉力的衰减:按距离衰减的拉力让远处的怪被吸得更急——衰减曲线的甜区是"远端拉力强、近端拉力弱",这样怪会在井心附近震荡而不是直接吸到底。第三笔是井的半径:一百步对怪的走速是"走不出去但看得见外面"的感知——半径太大井变成半场吸怪器,太小怪一迈就出去了。第二笔是井的时长:四秒对两点四秒的出手是"一波半的输出窗口"——四秒里怪的攻击拍一到两下,你的输出拍三到四下。第一笔是井环的双层:内环转得快外环转得慢——双环的转速差就是拉力的读数,转速越快拉力越强,玩家的眼睛会自动把转速和危险挂钩。常见坑三个:井的拉力没有衰减曲线,远端和近端拉力一样大;井心坐标在浮点运算后漂移,怪不往井心走而是绕着井心转圈;井散后拉力残留,怪继续被拽。

商业服里重力井是"星象师流派"的天体力学:别人控制怪的身体,他控制怪脚下的重力——商城里井环的样式做成品级,紫井、星井、虚空井,那两圈转得一圈快一圈慢的紫色井环就是星象师的天体模型。运营落地还有两笔:一段是引力教学——教一句"把它引到井中心,井心就是靶心",流派第一课是物理不是法术;一段是引力榜——按井内困住的累计时长排名,引力算得最准的星象师有碑。变体做成双井共振:两座井同时开在怪两侧,拉力对冲让怪悬在中间动弹不得——从单井到双井,星象师的天体力学升级了。这一篇的演示和整套模块照抄能跑,改的就是 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 技术组