【游戏功能】
先抛一个坑:人钻进土里,怪为什么懵?土包从它脚下拱过去的那一刻,它的爪子都不知道该往哪抡——遁地打的是"消失的威慑":你看不见我,但土告诉我你在哪。这篇把遁地袭纹整套写法拆开:沉身入土、土包赶路、拱出重击、误它两拍,一段一段照抄能跑。
一、效果演示
演示场是黄土坡。点「遁地!」:一蓬土花溅起,侠客整个人沉进土里——只剩一个土包贴着地皮往怪的方向拱,拱到它脚下轰然炸开:三十点连土带人一起掀,怪被误了两拍,爪子都抬不起来。土包炸完,侠客从原地拍拍土站起来,八秒后再钻。钻与不钻、什么时候钻,遁的时机就是打的节奏。
flowchart TD
A[点遁地] --> B[沉身入土]
B --> C[土包赶路]
C --> D{拱到它脚下了吗}
D -- 没有 --> C
D -- 到了 --> E[炸开掀三十]
E --> F[误它两拍出爪]
F --> G[原地出土]
G --> H[八秒后再钻]
fx-crest-burrow
二、底层原理
遁地系统的机关是"消失的威慑"——人沉进土里,怪的攻击逻辑瞬间没了目标:爪子抬不抬、往哪抬,全成了两可的事。误它两拍就是这份懵的具体化:拱出的一炸把它的出爪计时往后推,推出来的两拍就是玩家的免费输出窗口。遁地的怕不在伤害在失踪——目标忽隐忽现,任何以"锁定目标"为前提的反击都会哑火。
土包赶路是遁地的叙事线:沉下去的一蓬土花、地上拱起的一道脊、到脚下的轰然炸开——三段连起来是完整的"钻行"故事,哪一段缺了遁地就成了瞬移。出土的位置固定在原地,打完拍拍土回来,位置账清清楚楚。幂尔框架这边沉身、赶路、拱出三段各一个口子,土包的位置每拍推进,钻行期间玩家本身免伤——地皮就是最好的甲。
这套玩法的代码量不到八十行,难的不是钻土而是三段的完整——少了赶路的土包,遁地就成了原地消失又出现。
再看遁地为什么让玩家回到原地而不是从怪脚下钻出——从怪脚下钻出的版本,遁地变成了零成本的贴身位移,玩家钻进钻出全在最佳输出位;回原地的版本,遁地卖的只是那一记拱击加两拍误时,位置上的得失要靠玩家自己用走位补。遁地的收益封在"一击一误"里,才不会长成一个万能的无敌位移。
三、核心代码:完整模块(上·骨架)
-- @file CrestBurrow.lua
-- 遁地袭纹 —— 人从土里来 一拱掀它个跟头
local CrestBurrow = {}
local CONST = {
SINK_TIME = 0.5,
TRAVEL_TIME = 0.8,
ERUPT_DMG = 30,
DELAY_TIME = 2,
BURROW_CD = 8,
AUTOINC_BASE = 1204000,
}
local _phase = 0
local _t = 0
local _cd = 0
local _autoInc = 0
local function ShowTip(msg)
if msg and msg ~= "" then SL:ShowSystemTips(msg) end
end
local function GenID()
_autoInc = _autoInc + 1
return CONST.AUTOINC_BASE + _autoInc
end
function CrestBurrow.Phase() return _phase end
-- 遁地: 三段的第一段
function CrestBurrow.Dive()
if _cd > 0 then
ShowTip("土还没缓过来——再等" .. math.ceil(_cd) .. "秒")
return
end
_cd = CONST.BURROW_CD
_phase = 1
_t = CONST.SINK_TIME
ShowTip("遁地!土包子出发了")
end
四、核心代码:完整模块(下·推进与卸载)
-- 拱出重击: 误它两拍
function CrestBurrow.Erupt()
_phase = 0
ShowTip("拱出重击!" .. CONST.ERUPT_DMG .. "——误它两拍")
return CONST.ERUPT_DMG, CONST.DELAY_TIME
end
if not _ticker then
_ticker = SL:Schedule(function(dt)
if _cd > 0 then _cd = _cd - dt end
if _phase == 0 then return end
_t = _t - dt
if _t <= 0 then
if _phase == 1 then
_phase = 2
_t = CONST.TRAVEL_TIME
else
CrestBurrow.Erupt()
end
end
end, 0.02)
end
SL:ScheduleOnce(function()
SL:BindDebugButton("遁地!", function()
CrestBurrow.Dive()
end)
ShowTip("技能已加载: 遁地袭纹")
end, 1.0)
function CrestBurrow.Unload()
if _ticker then SL:Unschedule(_ticker) end
_phase = 0
end
return CrestBurrow
五、机制问答
问:怪为什么会对遁地的人发懵?
答:目标忽隐忽现——锁定型的反击全哑火,误它两拍就是懵的具体化。
问:三段缺一段会怎样?
答:少了赶路的土包,遁地成瞬移——沉身、赶路、拱出缺一不可。
问:出土为什么回原地?
答:遁地卖的是一击一误不是位移——回原位,位置账清清楚楚。
问:钻行期间为什么免伤?
答:地皮就是最好的甲——人在土里,爪子落在土包上,免伤名正言顺。
问:钻行期间怪会追着土包打吗?
答:打不着——目标在地皮下头,它的爪子只能对着土包干瞪眼,这就是遁地的威慑。
问:误它两拍误的是什么?
答:出爪的计时——拱出的冲击把它的节奏往后顶,两拍白送的窗口。
六、调参与实战怎么用
参数层面三个量——沉身时长、赶路时长、误时长度。半秒沉、八分赶是叙事完整的最短配置:再快故事没讲完。土包拱行的速度也有讲究:匀速拱过去最有"钻行"的实感,忽快忽慢就成了一坨会滑的土。实战里这套三段遁行的骨架能搬去地遁突袭、穿墙潜行、掘进爆破,全是沉身、赶路、拱出一条线。常见坑两个:三段缺一段成瞬移;从怪脚下钻出,遁地变万能位移。
补充一个设计层面的思考——出招的动作语言要和招的性质说一回事:绳就该有绳的弧线、壶就该有壶的抛物线、浪就该有浪的推进,玩家看动作就能猜到招怎么算。动作和数值两张皮是最伤的——看着是重锤结果是挠痒,看着是轻挑结果瞬杀,玩家对出招的信任就这么散的。
补充一个维护层面的思考——动作进行中的状态(飞行中的壶、钻地的一半、索飞的半程)要在换怪和重开时收干净:飞到一半的壶落地不落账、钻到一半的人卡在土里,都是阶段切换没扫尾。每一类飞行物配一句"到点没对象就作废"的清理,换多少次场都不留悬案。
补充一个工程层面的思考——位移类的演出要让位移的起点和终点都有交代:从哪起、到哪落、落地站哪,三问各有答案再动手。位移是所有演出里最容易穿模穿边界的,起落说不清的位移宁可拆成两段演,也别让人物在两帧之间瞬移到图外面去。
写完留一句给做潜行系的同学:玩家钻的是土也是怪的判断——三段讲完整,消失的威慑才压得住场。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
接手二开的兄弟几乎都撞过同一堵墙:玩家嫌走路"一格一格像机器人",老板拍板要"丝滑移动",改服务端速度?不对。改客户端动画帧…
【游戏功能】 先看一个熟场面:法师的火球特效挂在怪的脚后跟上,明明技能说明写着"焚烧其面",火星子却在地上打滚。群里有位策划…
【游戏功能】 上周有个开服的老板在群里发了一段录屏:他的战士明明刀刀都砍中了,观众却一片"这刀挥空了吧"。他原话是"判定日志…
【游戏功能】 先说结论放在开头:怪的皮一会儿绿一会儿红,不是美术换了几套贴图,是染色系统在怪身上盖了一层"色镜"。开服群里有…
前两天群里有个架设的朋友问了个需求:中毒的人要变绿、每两秒掉一次血、毒还能叠五层,问是不是要在服务端把整套状态机重写。我说你…
【游戏功能】 先抛一个坑:五口钟一模一样大,为什么一口比一口疼?先后次序动不得吗?倒过来敲会怎样?这篇把编钟纹整套写法拆开:…