【游戏功能】
重力井一开,怪往中心拉——四秒里它的每一步都被拽回井心,走三步退两步,想跑跑不掉。这篇把整套模块拆开:配置表、重力井构件、吸拉结算、定时器、调试按钮,一段一段照抄能跑。
一、效果演示:重力井吸怪,站进去走不动
演示场点「引力井!」:怪脚下亮起一圈紫色的井环——四秒里它每走一步都被拽回半步,整只怪被钉在井心附近打转。你的刀在外面补伤害,它的血条一格一格往下掉。四秒一过井散了,它重获自由——但血已经掉了一截。演示里试两笔账:井里打四秒的输出,和没有井追着打的输出——井里的输出效率是追着打的两倍。重力井教的是控制:不是让它不能动,是让它动不了。
fx-gravitywell
二、底层原理:一面重力井构件加一次吸拉结算
模块的机关是一对搭档。重力井构件:井开的那一帧在怪的位置定下井心——四秒里怪的每一帧坐标被拉向井心,拉力按距离衰减,离井心越近拉力越弱。吸拉结算:井不直接扣血,它的"伤害"是让怪动不了——走不出去就是最大的伤害,因为你的每一刀都在井心的射程内。和禁足那些硬控的分野在"井是拉力不是锁":禁足让怪原地定住一步不动,重力井让怪往中心走但走不出去——拉力和走力的对抗是看得见的,怪在井里的挣扎也是看得见的。
井心为什么不固定在施术时的怪坐标?井心定在开井那一帧的怪坐标,不跟怪走——怪的挣扎会把它拉离井心但拉力又把它拽回来,这种"差一点就逃出去"的视觉感就是重力井的张力。
三、核心代码:完整模块(上·骨架)
-- @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
四、核心代码:完整模块(下·定时器与吸拉推进)
-- 定时器:吸拉推进与井环演出
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 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
接手二开的兄弟几乎都撞过同一堵墙:玩家嫌走路"一格一格像机器人",老板拍板要"丝滑移动",改服务端速度?不对。改客户端动画帧…
【游戏功能】 先看一个熟场面:法师的火球特效挂在怪的脚后跟上,明明技能说明写着"焚烧其面",火星子却在地上打滚。群里有位策划…
【游戏功能】 上周有个开服的老板在群里发了一段录屏:他的战士明明刀刀都砍中了,观众却一片"这刀挥空了吧"。他原话是"判定日志…
【游戏功能】 先说结论放在开头:怪的皮一会儿绿一会儿红,不是美术换了几套贴图,是染色系统在怪身上盖了一层"色镜"。开服群里有…
前两天群里有个架设的朋友问了个需求:中毒的人要变绿、每两秒掉一次血、毒还能叠五层,问是不是要在服务端把整套状态机重写。我说你…
【游戏功能】 先抛一个坑:五口钟一模一样大,为什么一口比一口疼?先后次序动不得吗?倒过来敲会怎样?这篇把编钟纹整套写法拆开:…