【游戏功能】
M.stepAcc=M.stepAcc+spd*dt——先拆这一行。行账纹的账本全在这行累加里:怪每挪一步,步幅往账上累一截,攒满一步的份额,账本当场扣它三点。行账纹的全部机关就这一行加一条铁律——它走一步疼一步,站住不疼。想不挨账就别挪窝,想挪窝就一瘸一拐地挪。这篇把整套模块拆开:配置表、步幅累计、入账结算、迟疑降速、定时器、调试按钮,一段一段照抄能跑。
一、效果演示:它走一步疼一步,越走越犹豫
演示场怪照常大步逼近。点「行账!」:一圈青绿色的纹落在它脚边——十二秒行账期。这一拍起它的每一步都要过账:迈一步,头顶蹦一个"账-3"的绿灰字,脚下的泥地里留下一串渐淡的脚印。走着走着它自己慢了下来——步幅收成小碎步,走两步停一停,一副谁欠了它钱的模样。你就在原地等着,它不挪窝就不掉血,可它不挪窝就够不着你——进退两难全写在它的步子上。演示里试两笔账:它一路小跑冲过来的掉血和磨磨蹭蹭蹭过来的时间成本——这笔账怎么算它都亏。行账纹教的是逼账:让它自己选,是疼着走近,还是远远站着挨你的刀。
fx-stepdebit
二、底层原理:一段步幅累计加一次入账结算
模块的机关是一对搭档。步幅累计:纹成期里怪的每一段位移都进账本——步幅攒够一步的份额入一笔账,走的距离越长账越多,原地不动账本分文不进。入账结算:每一笔账当场扣血——三点一笔、实时入账,账目跟着脚步走,停步即停账。和持续伤害类机制的分野在"行账认的是它的脚不是你的刀":毒和烧是时间养的账,行账是距离养的账——它跑得越欢账越厚,它装死账就分文没有,疼不疼全看它自己动不动。
为什么降速做成它"自己犹豫"而不是直接套减速?直接减速是明抢,它走慢了账也少了,机制等于自己拆自己的台;做成迟疑——步幅收窄、走两步顿一顿,账照记但频率慢了,玩家看见的是一只被账吓住的怪,戏和账都在。
三、核心代码:完整模块(上·骨架)
-- @file StepDebit.lua
-- 行账纹 —— 它走一步疼一步,越走越犹豫
local StepDebit = {}
local CONST = {
CREST_LIFE = 12.0,
CREST_CD = 4.0,
STEP_DIST = 22,
DEBIT_PER = 3,
COLOR_DEBIT = "#889868",
COLOR_DEEP = "#384818",
COLOR_GHOST = "#d0e0b0",
ZORDER_DEBIT = 133,
ZORDER_FX = 135,
AUTOINC_BASE = 1109000,
}
local _crestT = 0
local _cdLeft = 0
local _stepAcc = 0
local _lastX = 0
local _crestFx = nil
local _scheduler = nil
local _autoInc = 0
local function GenID(prefix)
_autoInc = _autoInc + 1
return string.format("%s_%d", prefix or "SPD",
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 StepDebit.Ticks()
return _stepAcc
end
四、核心代码:完整模块(下·步幅累计与入账)
-- 步幅累计:位移进账本,攒满一步扣一笔
local function AccrueStep()
if _crestT <= 0 then return end
local tid = SL:GetValue("MARK_TARGET_ID")
if not tid then return end
local tp = GetActorPos(tid)
if not tp then return end
local moved = math.abs(tp.x - _lastX)
_lastX = tp.x
_stepAcc = _stepAcc + moved
while _stepAcc >= CONST.STEP_DIST do
_stepAcc = _stepAcc - CONST.STEP_DIST
SL:ActorHurt(tid, CONST.DEBIT_PER)
SL:TipAbove(tid, "账-" .. CONST.DEBIT_PER)
SL:PlayStepFx(tid)
end
end
function StepDebit.Cast()
if _cdLeft > 0 or _crestT > 0 then return end
local tid = SL:GetValue("MARK_TARGET_ID")
if not tid then return end
local tp = GetActorPos(tid)
_cdLeft = CONST.CREST_CD
_crestT = CONST.CREST_LIFE
_stepAcc = 0
_lastX = tp and tp.x or 0
SafeRemove(_crestFx)
_crestFx = GUI:Layout_Create(GUI:Attach_SceneF(),
GenID("Ledger"), 0, 0, 0, 0, false)
GUI:setLocalZOrder(_crestFx, CONST.ZORDER_DEBIT)
SL:PlayDebitUpFx(tid)
ShowTip("行账开了——它走一步疼三点,走着瞧")
end
-- 定时器:纹成倒计时与步幅驱动
if not _scheduler then
_scheduler = SL:Schedule(function(dt)
_cdLeft = math.max(0, _cdLeft - dt)
if _crestT > 0 then
_crestT = _crestT - dt
AccrueStep()
if _crestT <= 0 then
SafeRemove(_crestFx)
ShowTip("账收了——它的脚放开了")
end
end
end, 0.02)
end
SL:ScheduleOnce(function()
SL:BindDebugButton("行账", function()
StepDebit.Cast()
end)
ShowTip("技能已加载: 行账纹 (调试按钮触发)")
end, 1.0)
function StepDebit.Unload()
if _scheduler then SL:Unschedule(_scheduler) end
SafeRemove(_crestFx)
_crestT = 0
_stepAcc = 0
end
return StepDebit
五、机制问答
问:怪原地不动就不掉血吗?
答:对——账认脚步不认时间,它站着装石头,账本一分记不上,这就是行账逼出来的选择题。
问:被击退的位移也算步数吗?
答:算——账认位移不认原因,被你推着退的那几步照记,怪被打了还要倒贴账,这笔最解气。
问:小碎步能逃账吗?
答:逃不了——账认的是累计距离不是迈腿次数,碎步挪一寸记一寸,攒够一步照样扣。
问:它卡在墙角走不动会怎样?
答:账自动停——没位移就没账,行账不记"想走没走成"的委屈,账本只认实际迈出的距离。
问:纹收了它恢复大步吗?
答:恢复——迟疑是账吓的,账收了它立刻恢复平常的步幅和速度,该冲照冲。
六、调参指南与商业服怎么用
第四笔是步幅的份额:二十二步一记是账本的眼睛——份额太大怪走一步扣一口像凌迟,太小账本记了个寂寞,二十二步刚好是"看得见它在为走路付钱"的颗粒度。第三笔是每笔的价:三点一笔对六百步的常态冲锋是"一路走掉三十点"的总账——价太高怪干脆站桩变成死局,太低行账成了装饰,三点是逼它犹豫又不逼它认命的价。第二笔是迟疑的演出:步幅收窄、两步一顿要演出"被账吓住"的样子——减速直接套数值是偷懒,迟疑是戏,戏在账才活。第一笔是脚印的渐淡:身后一串渐淡的脚印是账本的可视化——脚印走一路淡一路,玩家一眼读出"它这一路付了多少"。常见坑三个:位移累计把受击位移也算了导致玩家推怪推出一串账;纹收后迟疑的步幅没还原;脚印图层盖在了灵地纹样的上头。
商业服里行账纹是"讨债帮"的路数:别人催债靠嘴,他催债靠脚——商城里脚印的样式做成品级,泥脚印、朱砂脚印、鎏金脚印,那串跟在怪身后的渐淡脚印就是讨债帮的账本。运营落地还有两笔:一段是逼账教学——教一句"它不走你就打,它一走它自己疼",流派第一课是耗;一段是讨债榜——按行账期记下的账目总数排名,账收得最狠的人有碑。变体做成利滚利:每十步账目单价涨一点——从平账到利滚利,讨债帮的算盘越打越响。这一篇的演示和整套模块照抄能跑,改的就是 CONST 那张表。
写完留一句给做位移系的同学:行账纹卖的是"它的每一步都要付钱"——那串渐淡的脚印和一步一个的绿灰小字,是把位移从本能改成消费的第一张路费单。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
接手二开的兄弟几乎都撞过同一堵墙:玩家嫌走路"一格一格像机器人",老板拍板要"丝滑移动",改服务端速度?不对。改客户端动画帧…
【游戏功能】 先看一个熟场面:法师的火球特效挂在怪的脚后跟上,明明技能说明写着"焚烧其面",火星子却在地上打滚。群里有位策划…
【游戏功能】 上周有个开服的老板在群里发了一段录屏:他的战士明明刀刀都砍中了,观众却一片"这刀挥空了吧"。他原话是"判定日志…
【游戏功能】 先说结论放在开头:怪的皮一会儿绿一会儿红,不是美术换了几套贴图,是染色系统在怪身上盖了一层"色镜"。开服群里有…
前两天群里有个架设的朋友问了个需求:中毒的人要变绿、每两秒掉一次血、毒还能叠五层,问是不是要在服务端把整套状态机重写。我说你…
【游戏功能】 先抛一个坑:五口钟一模一样大,为什么一口比一口疼?先后次序动不得吗?倒过来敲会怎样?这篇把编钟纹整套写法拆开:…