【游戏功能】
打它脚边的地,它进不了身——锁地的全部机关就这一条:对怪脚下的地面施术,三秒里这块地变成它的禁区——它攻得出但走不进,站在圈外干瞪眼。这篇把整套模块拆开:配置表、锁地构件、禁区判定、定时器、调试按钮,一段一段照抄能跑。
一、效果演示:打它脚边的地,它进不了身
演示场点「锁地!」:一道绿光打在怪脚边——地上亮起一圈绿色的锁地图案,怪当场刹住脚步。三秒里它出拳照打、嘴里照吼,就是脚下一动不能动——离你六十步的距离成了它永远跨不过的鸿沟。三秒一到地解封了——它缓过来第一步就是冲你来的。演示里试两笔账:锁地期你的刀照砍不误,和地解封后它变本加厉的第一扑——锁地的三秒是白送的输出窗口,解封后的反扑要提前备好后续手段。锁地教的是战场地理:它强不是因为力气大,是因为它站的地方对。
fx-groundlock
二、底层原理:一面锁地图案加一段禁区判定
模块的机关是一对搭档。锁地图案:按钮落术的那一帧在怪脚边画圈——圈心定在怪的当前坐标不跟怪走,圈内的地面三秒变成禁区。禁区判定:圈亮的三秒里怪的一切位移指令被驳回——走、跑、冲、闪全被挡,攻击链照转不误。和定身那些全封控制的分野在"锁地只封脚不封手":定身是连手带脚全封的硬控,锁地只是把脚下的地变成禁区——它照常出招照常嘶吼,只是寸步难行,这份"能动但走不了"的微妙就是锁地的全部性格。
锁地为什么不锁攻击?锁攻击的版本锁地变成沉默加定身的复合控制,一套按钮管三件事太多了;只锁脚的锁地留了还手的口子,三秒里它打你的刀是你的走位课的学费。
三、核心代码:完整模块(上·骨架)
-- @file GroundLock.lua
-- 锁地 —— 打它脚边的地,它进不了身
local GroundLock = {}
local CONST = {
LOCK_LIFE = 3.0,
LOCK_CD = 5.0,
LOCK_RADIUS = 50,
COLOR_LOCK = "#708858",
COLOR_DEEP = "#2a3a18",
COLOR_GHOST = "#c8e0a0",
ZORDER_LOCK = 130,
ZORDER_FX = 135,
AUTOINC_BASE = 1065000,
}
local _lockT = 0
local _lockID = 0
local _lockX = 0
local _cdLeft = 0
local _lockFx = nil
local _scheduler = nil
local _autoInc = 0
local function GenID(prefix)
_autoInc = _autoInc + 1
return string.format("%s_%d", prefix or "GLC",
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 GroundLock.Cast()
if _cdLeft > 0 or _lockT > 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.LOCK_CD
_lockT = CONST.LOCK_LIFE
_lockID = tid
_lockX = tp.x
SL:FreezeActorMove(tid, CONST.LOCK_LIFE)
SafeRemove(_lockFx)
_lockFx = GUI:Layout_Create(GUI:Attach_SceneF(),
GenID("Lock"), _lockX, tp.y, 0, 0, false)
GUI:setLocalZOrder(_lockFx, CONST.ZORDER_LOCK)
SL:PlayLockFx(tid)
SL:TipAbove(tid, "锁地!")
ShowTip("地封了——三秒里它进不了身")
end
四、核心代码:完整模块(下·定时器与位移驳回)
-- 位移驳回:锁足期一切移动指令无效
SL:RegisterLUAEvent(LUA_EVENT_MOVE_REQUEST, "GLC_Stop", function(tid)
if _lockT > 0 and tid == _lockID then
return false
end
return true
end)
-- 定时器:锁地倒计时与图案跟脚
if not _scheduler then
_scheduler = SL:Schedule(function(dt)
_cdLeft = math.max(0, _cdLeft - dt)
if _lockT > 0 then
_lockT = _lockT - dt
local tp = GetActorPos(_lockID)
if _lockFx and tp then
GUI:setPosition(_lockFx, _lockX, tp.y)
end
if _lockT <= 0 or not tp
or SL:GetValue("ACTOR_DEAD", _lockID) then
_lockT = 0
SafeRemove(_lockFx)
ShowTip("地解封了——它又能动了")
end
end
end, 0.02)
end
SL:ScheduleOnce(function()
SL:BindDebugButton("锁地", function()
GroundLock.Cast()
end)
ShowTip("技能已加载: 锁地 (调试按钮触发)")
end, 1.0)
function GroundLock.Unload()
if _scheduler then SL:Unschedule(_scheduler) end
SL:UnregisterLUAEvent(LUA_EVENT_MOVE_REQUEST, "GLC_Stop")
if _lockT > 0 then SL:ThawActorMove(_lockID) end
SafeRemove(_lockFx)
_lockT = 0
end
return GroundLock
五、机制问答
问:锁地能对空中的怪用吗?
答:看落地——怪跳起来在空中时脚下没有地面可以锁,锁地要贴着地面念,空中目标写明"落地可锁"。
问:锁地圈里的玩家能走吗?
答:能——锁地只封怪的脚不封玩家的脚,圈是它的禁区不是你的,你的走位不受任何影响。
问:锁地和禁足有什么分别?
答:锁地只封脚不封手,禁足连手带脚全封——锁地的怪能打你但追不上你,禁足的怪连打都不能打。
问:锁地被驱散了怎么办?
答:驱散类清地效,锁地图案当场碎裂,三秒变成零秒——驱散怪是锁地的天敌,先清驱散再锁地是进阶课。
问:锁地圈里能放火墙吗?
答:能——锁地封走位不管地面属性,火墙照烧、毒圈照铺,两套地域效果叠加是进阶连招。
问:锁地和冰冻能一起用吗?
答:能——锁地封走位不封攻击,冰冻封攻击不封走位,两套叠上怪既走不了也打不了,但冰冻的时长比锁地短,先锁地再冰冻是进阶连招。
六、调参指南与商业服怎么用
第四笔是圈径的宽度:五十步的圈径对怪六十步的攻击距离是"出得了手走不了路"的档——圈太大怪的攻击够不着你变成了白锁,太小怪的爪子照拍你照疼没有封锁感。第三笔是锁地的时长:三秒对冷却五秒是"封完歇两秒"的节奏——锁太久地变成了永久陷阱,太短玩家刚到位就解封了。第二笔是图案的层级:锁地图案要画在地面上层但模型下层——图案压住怪的脚但不挡怪的身体,层级对了怪被"钉"在地上而不是被"盖"在地上。第一笔是解封的预告:解封前半秒锁环闪两下——闪是预告,玩家撤一步反扑落空,没有预告的解封就是坑。常见坑三个:锁地圈跟着怪走,圈变成移动禁区而不是固定陷阱;锁地期间怪的受击退效果把怪推出圈外,圈外不受锁但视觉还画着圈;多层锁地叠加不互斥,两层锁地三秒变六秒。
商业服里锁地是"封地师流派"的地契:别人的控制术封人,他的控制术封地——商城里锁地图案的样式做成品级,土契、石契、龙纹地契,那道一圈绿光钉在地上的锁印就是封地师的地契。运营落地还有两笔:一段是封地教学——教一句"封它的脚,不封它的手",流派第一课是理解控制的边界;一段是封地榜——按锁地期间打出的总伤排名,封得最准的人有碑。变体做成封地阵:锁地图案扩大成三步宽的阵——从锁一只到锁一片,封地师的地契越写越大。这一篇的演示和整套模块照抄能跑,改的就是 CONST 那张表。
封地师的老话再念一遍:先封它的地,再封它的命。
写完留一句给做封锁系的同学:锁地卖的是"你脚下的地归我管"——那道一圈绿光钉在地上的锁印和三秒寸步难行的怪,是对一切走位最直接的一句话:这地方,我封了。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
接手二开的兄弟几乎都撞过同一堵墙:玩家嫌走路"一格一格像机器人",老板拍板要"丝滑移动",改服务端速度?不对。改客户端动画帧…
【游戏功能】 先看一个熟场面:法师的火球特效挂在怪的脚后跟上,明明技能说明写着"焚烧其面",火星子却在地上打滚。群里有位策划…
【游戏功能】 上周有个开服的老板在群里发了一段录屏:他的战士明明刀刀都砍中了,观众却一片"这刀挥空了吧"。他原话是"判定日志…
【游戏功能】 先说结论放在开头:怪的皮一会儿绿一会儿红,不是美术换了几套贴图,是染色系统在怪身上盖了一层"色镜"。开服群里有…
前两天群里有个架设的朋友问了个需求:中毒的人要变绿、每两秒掉一次血、毒还能叠五层,问是不是要在服务端把整套状态机重写。我说你…
【游戏功能】 先抛一个坑:五口钟一模一样大,为什么一口比一口疼?先后次序动不得吗?倒过来敲会怎样?这篇把编钟纹整套写法拆开:…