【游戏功能】
上一版埋了个玩家骂了半个月的隐蔽报错:踏灵纹的加成"时灵时不灵"——明明站在圈里,刀就是不加成;原地不动反而一直有。追了两天逮到根子:灵地的判定框是开纹那一刻写死的坐标矩形,玩家的移动没触发判定刷新,挪半步出了旧框加成就丢,站着不动恰好一直在旧框里。修法是把判定从死框改成每拍活算——到这一版,灵地的账才算画对了。这篇把整套模块拆开:配置表、灵地绘制、入圈判定、加重结算、定时器、调试按钮,一段一段照抄能跑。
一、效果演示:站在灵地里,刀重三成
演示场点「踏灵!」:脚下浮现一圈青绿色的灵地——外环符齿、内环纹路,十秒的地契。站在圈里,你的刀从十二点重到十六点,落刀的青字和圈的光色一个调;怪的刀带着击退,一把把你推出圈外——青字当场变灰,刀回十二,抬头一看人已经在灵地外头站着了。再按一下踏灵,灵地跟着你重新画。演示里试两笔账:全程站圈里的输出和被打出去之后的输出——三成的差价,全看你站不站得住。踏灵纹教的是占地:地上画出来的便宜,脚下留住了才是你的。
fx-groundamp
二、底层原理:一圈灵地构件加一次入圈判定
模块的机关是一对搭档。灵地构件:按纹那一拍在脚下画地——外圈符齿、内圈纹路、十秒地契,灵地认的是"画下去的那块地"不认人,你走了它还亮在原地。入圈判定:每一拍拿玩家的实时坐标和灵地圆心算距离——圈里刀重圈外平常,判定跟着人走不跟着框走,这是那场"时灵时不灵"报错的正解。和站桩类机制的分野在"踏灵的重刀是地给的":扎马的重刀长在自己身上,踏灵的重刀长在地上——地契被挤出圈,加重当场没收。
灵地为什么会被打出去?击退是怪的地利争夺——它一把把你推出圈,你就得重新画地契,一来一回之间,站的位、推的时机都成了博弈,灵地才不只是个挂在脚下的光环。
三、核心代码:完整模块(上·骨架)
-- @file GroundAmp.lua
-- 踏灵纹 —— 站在灵地里,刀重三成
local GroundAmp = {}
local CONST = {
SIGIL_LIFE = 10.0,
SIGIL_CD = 2.0,
SIGIL_RADIUS = 55,
AMP_HIT = 16,
BASE_HIT = 12,
COLOR_SIGIL = "#68b878",
COLOR_DEEP = "#1e4828",
COLOR_GHOST = "#c0f0c8",
ZORDER_SIGIL = 90,
ZORDER_FX = 135,
AUTOINC_BASE = 1108000,
}
local _sigilT = 0
local _sigilX = 0
local _cdLeft = 0
local _sigilFx = nil
local _scheduler = nil
local _autoInc = 0
local function GenID(prefix)
_autoInc = _autoInc + 1
return string.format("%s_%d", prefix or "GDA",
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 GroundAmp.InSigil()
if _sigilT <= 0 then return false end
local myID = SL:GetValue("USER_ID")
local mp = GetActorPos(myID)
if not mp then return false end
return math.abs(mp.x - _sigilX) <= CONST.SIGIL_RADIUS
end
四、核心代码:完整模块(下·灵地绘制与加重结算)
-- 加重结算:圈里的刀走加重档
SL:RegisterLUAEvent(LUA_EVENT_MELEE_DAMAGE, "GDA_Amp", function()
if GroundAmp.InSigil() then
return CONST.AMP_HIT - CONST.BASE_HIT
end
return 0
end)
function GroundAmp.Cast()
if _cdLeft > 0 then return end
local myID = SL:GetValue("USER_ID")
local mp = GetActorPos(myID)
if not mp then return end
_cdLeft = CONST.SIGIL_CD
_sigilT = CONST.SIGIL_LIFE
_sigilX = mp.x
SafeRemove(_sigilFx)
_sigilFx = GUI:Layout_Create(GUI:Attach_Scene(),
GenID("Sigil"), 0, 0, 0, 0, false)
GUI:setLocalZOrder(_sigilFx, CONST.ZORDER_SIGIL)
SL:PlaySigilUpFx(mp.x)
ShowTip("灵地画好了——站在圈里刀十六,出去了就十二")
end
-- 定时器:地契倒计时与灵地褪色
if not _scheduler then
_scheduler = SL:Schedule(function(dt)
_cdLeft = math.max(0, _cdLeft - dt)
if _sigilT > 0 then
_sigilT = _sigilT - dt
if _sigilT <= 0 then
SafeRemove(_sigilFx)
ShowTip("灵地散了——地上什么都没留下")
end
end
end, 0.02)
end
SL:ScheduleOnce(function()
SL:BindDebugButton("踏灵", function()
GroundAmp.Cast()
end)
ShowTip("技能已加载: 踏灵纹 (调试按钮触发)")
end, 1.0)
function GroundAmp.Unload()
if _scheduler then SL:Unschedule(_scheduler) end
SL:UnregisterLUAEvent(LUA_EVENT_MELEE_DAMAGE, "GDA_Amp")
SafeRemove(_sigilFx)
_sigilT = 0
end
return GroundAmp
五、机制问答
问:灵地跟着人走吗?
答:不跟——灵地认地不认人,画在哪就亮在哪,你走了它原地等你,这是地契和光环的根本分别。
问:被推出圈外再走回来还有加成吗?
答:有——判定每一拍重算,人回到圈里加重当场恢复,不用重新画地,退出去的账不算断。
问:两只灵地能叠着画吗?
答:不能——新灵地落地旧灵地当场散,地上同时只认一张地契,脚踏两只船在这里不成立。
问:怪站进灵地有影响吗?
答:没有——灵地只认画契人的坐标,怪踩进圈里它不加成你不掉价,圈是私产不是公共地。
问:灵地上的重刀吃暴击吗?
答:吃——十六点是圈里的底刀,暴击照常往上乘,圈里暴击是站得住的人的额外奖赏。
六、调参指南与商业服怎么用
第四笔是判定的活算:实时坐标进距离公式是这套纹的命根——那场"时灵时不灵"的报错就是死框闹的,判定不跟着人走的灵地是假灵地。第三笔是圈径的宽窄:五十五步的半径是"站得住又不必钉死"的尺度——圈太大站着不动白赚,太小被一推就出,半径要给走位留一线活口。第二笔是击退的联动:怪的刀带推力是灵地的博弈眼——没有击退的版本灵地退化成脚下挂件,推一下夺一次地,便宜才有了争夺感。第一笔是灵地的画工:外环符齿、内圈纹路、随剩余时长渐褪——褪色的灵地自带倒计时,玩家不用读秒就知道地契还剩几口气。常见坑三个:判定框写死坐标不随位移刷新;新灵地落地旧灵地没散造成双圈叠加;灵地褪色渐变没做最后一拍整圈消失太突兀。
商业服里踏灵纹是"守土盟"的地契:别人把纹挂在身上,他把纹画在地上——商城里灵地的画工做成品级,草圈灵地、玉符灵地、山河社稷图,那圈画在脚下的青绿纹路就是守土盟的界碑。运营落地还有两笔:一段是占位教学——教一句"被推出圈别慌,走回来加重就来",流派第一课是恋地;一段是守土榜——按灵地期圈内的出刀总数排名,站得最恋地的人有碑。变体做成双生灵地:前后各画一圈,踩着两圈切换走位——从一亩地到两亩地,守土盟的地契越画越大。这一篇的演示和整套模块照抄能跑,改的就是 CONST 那张表。
写完留一句给做地契系的同学:踏灵纹卖的是"地上画出来的便宜"——那圈跟着时长褪色的青绿纹路和圈里圈外两个价的落刀数,是把战场划成自留地的第一份地契。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
接手二开的兄弟几乎都撞过同一堵墙:玩家嫌走路"一格一格像机器人",老板拍板要"丝滑移动",改服务端速度?不对。改客户端动画帧…
【游戏功能】 先看一个熟场面:法师的火球特效挂在怪的脚后跟上,明明技能说明写着"焚烧其面",火星子却在地上打滚。群里有位策划…
【游戏功能】 上周有个开服的老板在群里发了一段录屏:他的战士明明刀刀都砍中了,观众却一片"这刀挥空了吧"。他原话是"判定日志…
【游戏功能】 先说结论放在开头:怪的皮一会儿绿一会儿红,不是美术换了几套贴图,是染色系统在怪身上盖了一层"色镜"。开服群里有…
前两天群里有个架设的朋友问了个需求:中毒的人要变绿、每两秒掉一次血、毒还能叠五层,问是不是要在服务端把整套状态机重写。我说你…
【游戏功能】 先抛一个坑:五口钟一模一样大,为什么一口比一口疼?先后次序动不得吗?倒过来敲会怎样?这篇把编钟纹整套写法拆开:…