【游戏功能】
巡逻道 = { 左桩, 右桩 } —— 巡逻道就是这两根桩之间的一条线:桩在哪,道就在哪;道在哪,它就一辈子走哪。挪桩把这条线的两端交到玩家手里:挪一根路标,巡逻道当场改道——改到哪,它就把自己遛进哪。这篇把整套模块拆开:配置表、路标表、巡逻改道、定时器、调试按钮,一段一段照抄能跑。
一、效果演示:挪一根路标,把它遛进你算好的道
演示场的怪在两根木桩之间来回晃,右桩在远端,它的道本来离你的刺阵八竿子远。点「挪桩!」:右桩"咚"地一声拔起,插到刺阵的正左方——它的巡逻道当场改线,横穿整片刺阵。它浑然不觉,照着新道来回晃——每过一趟刺阵"扎六"的红字就蹦一次,一趟一趟,血条自己往下走。你的刀在旁边补刀,它连自己为什么疼都不知道。演示里看两处:虚线的巡逻道跟着桩走,刺阵的红圈是它不知道的账。挪桩教的是战场的第一课:路线比刀快,改道比改命容易。
fx-waypoint
二、底层原理:一对路标锚加一次动态改线
模块的机关是一对搭档。路标锚:怪的巡逻是两个锚点之间的插值——左锚右锚定下,它的每一步都是两点之间的往返插值,锚不动它走一辈子。动态改线:挪桩改的是锚点——右锚从五百九十挪到四百三,插值的终点当场更新,巡逻道跟着锚重画。和引怪那类仇恨操控的分野在"它没有发现你":引怪靠挑衅,挪桩靠改地图——它从头到尾不知道道变了,更不知道道上有刺,无知觉的改道才是最深的算计。
改道为什么不惊动它?巡逻的习性只认锚点不认路况——锚点的合法性校验做了、路况的侦察没做,这份"只认桩不认刺"的实诚,就是挪桩全套玩法的地基。
三、核心代码:完整模块(上·骨架)
-- @file WayPoint.lua
-- 挪桩 —— 挪一根路标,把它遛进你算好的道
local WayPoint = {}
local CONST = {
STAKE_L = 380,
STAKE_R = 590,
STAKE_R_NEW = 430,
MOVE_SPEED = 30,
TRAP_L = 460,
TRAP_R = 520,
TRAP_DMG = 6,
MOVE_CD = 3.0,
COLOR_STAKE = "#8a7048",
COLOR_DEEP = "#3e3218",
COLOR_GHOST = "#e8d8b0",
ZORDER_STAKE = 128,
ZORDER_FX = 135,
AUTOINC_BASE = 1034000,
}
local _stakeR = CONST.STAKE_R
local _moved = false
local _cdLeft = 0
local _stakeFx = nil
local _scheduler = nil
local _autoInc = 0
local function GenID(prefix)
_autoInc = _autoInc + 1
return string.format("%s_%d", prefix or "WPT",
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 WayPoint.MoveStake()
if _cdLeft > 0 then
ShowTip("桩在挪——" .. string.format("%.1f", _cdLeft) .. "秒")
return
end
if _moved then
ShowTip("桩已经挪了——看它一趟趟地挨扎")
return
end
_cdLeft = CONST.MOVE_CD
_moved = true
_stakeR = CONST.STAKE_R_NEW
SL:RefreshPatrolAnchors(SL:GetValue("MARK_TARGET_ID"),
CONST.STAKE_L, _stakeR)
SL:PlayStakeMoveFx(_stakeR)
SL:TipAbove(_stakeR, "桩挪了")
ShowTip("路标挪了——它的道现在横穿刺阵")
end
四、核心代码:完整模块(下·定时器与巡逻改线)
-- 巡逻结算:踩刺的账
local function TrapTick(tid, tp)
if tp.x < CONST.TRAP_L or tp.x > CONST.TRAP_R then
return false
end
SL:ActorHurt(tid, CONST.TRAP_DMG)
SL:TipAbove(tid, "扎-6")
SL:PlaySpikeTickFx(tp.x, tp.y)
return true
end
-- 定时器:巡逻插值与刺阵结算
if not _scheduler then
_scheduler = SL:Schedule(function(dt)
_cdLeft = math.max(0, _cdLeft - dt)
local tid = SL:GetValue("MARK_TARGET_ID")
if not tid or SL:GetValue("ACTOR_DEAD", tid) then return end
local tp = GetActorPos(tid)
if not tp then return end
if tp.x >= _stakeR then
SL:SetActorDir(tid, 6)
elseif tp.x <= CONST.STAKE_L then
SL:SetActorDir(tid, 2)
end
local dir = SL:GetValue("ACTOR_DIR", tid)
local step = dir == 2 and CONST.MOVE_SPEED
or -CONST.MOVE_SPEED
local nx = math.max(CONST.STAKE_L,
math.min(_stakeR, tp.x + step * dt))
SL:SetActorPos(tid, nx, tp.y)
SL:PlayPatrolWalkFx(tid)
if TrapTick(tid, { x = nx, y = tp.y }) then
if SL:GetValue("ACTOR_DEAD", tid) then
ShowTip("它被自己的巡逻道扎死了")
end
end
end, 0.02)
end
SL:ScheduleOnce(function()
SL:BindDebugButton("挪桩", function()
WayPoint.MoveStake()
end)
ShowTip("技能已加载: 挪桩 (调试按钮触发)")
end, 1.0)
function WayPoint.Unload()
if _scheduler then SL:Unschedule(_scheduler) end
end
return WayPoint
五、机制问答
问:桩能挪几次?
答:一次——挪完钉死,一根桩挪两次的版本玩家把整个地图当橡皮泥捏,一次的份量刚好是"一局一个主意"。
问:改道后它的朝向乱吗?
答:不乱——朝向跟着插值方向走,到右锚转头朝左,到左锚转头朝右,巡逻的老规矩一条不改。
问:刺阵能挪吗?
答:不能——桩是它的,阵是你的,各管各的,两样都能挪的版本就没有站位学了。
问:巡逻中挨刀会脱巡逻吗?
答:看仇恨——小的傻怪挨了刀照走,聪明的怪会脱道扑你,扑出来的怪不归桩管,桩只遛守规矩的。
问:它自己会避开刺阵吗?
答:不会——巡逻的路况侦察是空的,这份实诚就是全套机制的落点,实诚改掉了玩法就没了。
问:两只怪共用一对桩怎么办?
答:一起改道——桩是公共的路签,认桩不认怪,两只怪同道巡逻就同道挨扎,一本账记两只怪。
问:刺阵里的怪会加速通过吗?
答:不会——巡逻的步频万年不变,扎归扎走归走,这份稳当就是机关师的福气。
六、调参指南与商业服怎么用
第四笔是刺阵的宽窄:六十步的刺带对三十步的步速是两秒一趟六点的账——刺带太宽它扎成筛子,太窄一趟都蹭不上,六十步刚好是"一趟一跳"的读秒。第三笔是桩距的落差:五百九到四百三是改道前后的落差——落差太小改道没戏剧性,太大巡逻道短成一截,落差要落在刺阵的正横线上。第二笔是踩刺的伤害:六点对九百血是"一趟一小格"的细账——踩刺太疼玩家光看不用打,太轻刺阵成了装饰。第一笔是道线的可见:虚线道、双桩标注、刺阵红圈三样齐——玩家看见的是"改道前后两条路",路线可视化是这套机制的地图。常见坑三个:改道后怪站位越界,插值把怪拽出边界;刺阵结算一帧多跳,一次路过扣成筛子;桩的坐标没做地形校验,桩插进墙里道断一半。
商业服里挪桩是"机关师流派"的手筋:不动一刀,改一根桩就是一条计——商城里路标的样式做成品级,木桩、石桩、铜星桩,拔桩再插的那一记闷响就是机关师的落子声。运营落地还有两笔:一段是巡逻怪图鉴——每种怪的两个锚点距离写进页脚,机关师按图挪桩;一段是改道榜——按改道后踩刺的总伤排名,最会画道的人有碑。变体做成连环桩:一口气挪三根,三段巡逻道连成一条穿阵长线——从挪一根到布一条道,机关师的图越画越大。这一篇的演示和整套模块照抄能跑,改的就是 CONST 那张表。
机关师的口诀也只有六个字:它认桩,你认坑。
写完留一句给做机关系的同学:挪桩卖的是"道比刀快"——那根拔起来再插下去的路标,是把它的日常一步不差地改写成你的陷阱路线的一支笔。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 它的拍子一秒六一轮,拍上出刀白给,拍子空当里递刀才是十六点。错拍把"读它的拍"变成递刀的时机学:绿窗一亮,刀递…
【游戏功能】 两刀压进它一拍里——第二刀落定的瞬间它趔趄一秒,趔趄里刀刀翻倍。抢拍把"比它快"做成了机制:它两秒一拍地出手,…
【游戏功能】 按住一点五秒再松手——沉刀的全部仪式就这一按一放:按住时劲往刀上沉,松手那一瞬二十二点的重刀见真章;按不满就松…
【游戏功能】 起手之后零点三秒里再点一下,两刀并成一记十六点的双击斩;没接上,起手就白给了。双击斩把"两击"这个概念拆进输入…
【游戏功能】 它出什么招,你就换什么式——劈克刺、刺克扫、扫克劈,三式相扣的一个圈。挪移换式把猜拳搬进了打架:怪的下一手提前…
【游戏功能】 连珠 = 连珠 + 1 —— 半秒里每按一次涨一格的连珠,五珠攒满就是一记二十五点的重轰。连珠快拳把"手快"直…