【游戏功能】
拖距 = 松手位置 - 起手位置 —— 滑斩的算术就这一行:按住刀柄往右拖,拖出去多少步,刃就送出去多少步,怪也被推出去多少步。拖得短刃短推得近,拖得长刃长推得远——一次按拖,伤、推、距全由你的手定。这篇把整套模块拆开:配置表、拖刀构件、滑斩结算、定时器、调试按钮,一段一段照抄能跑。
一、效果演示:按住拖多远,刃就送多远
演示场点「按住拖刀」别松:一根橙线从刀柄拉出来跟着你的手长——拖二十步,松手,短刃十点轻推;拖一百四十步,松手,长刃二十点重推,怪滑出去老远。刃长随拖距变,伤随刃长变,推也随拖距变——三样账一口价。演示里试两种拖法:短拖快刀连着刮,和长拖一次送到底——前者刮得密,后者推得爽,一短一长两种手艺。滑斩玩的是量:刃的长度是拖出来的,怪的位移也是你拖出来的。
fx-slidestrike
二、底层原理:一段拖刀测量加一次比例滑斩
模块的机关是一对搭档。拖刀测量:按住那一刻记起点,拖动实时算距离——距离就是刀的长度,刃的读数画在手边,拖多长看多长。比例滑斩:松手那一刻按距离比例结账——伤害随距离涨、推距等于拖距,一笔账三份产出。和蓄力那类按时长的分野在"蓄力论时间、滑斩论距离":蓄力按住越久劲越大,滑斩按住再久不拖也是白按——动的距离才是它的资源,静止的等待一文不值。
推距为什么跟拖距一样长?推距等于拖距是"一比一的诚实"——你付出多少拖动就换多少位移,账目透明玩家才敢在悬崖边玩这一手。
三、核心代码:完整模块(上·骨架)
-- @file SlideStrike.lua
-- 滑斩 —— 按住拖多远,刃就送多远
local SlideStrike = {}
local CONST = {
MIN_DRAG = 20,
DMG_BASE = 10,
DMG_PER_STEP = 0.07,
DRAG_TO_PUSH = 1.0,
COLOR_SLIDE = "#b87848",
COLOR_DEEP = "#4e3014",
COLOR_GHOST = "#f0d8b0",
ZORDER_SLIDE = 134,
ZORDER_FX = 135,
AUTOINC_BASE = 1046000,
}
local _dragOn = false
local _startX = 0
local _curX = 0
local _dragFx = nil
local _scheduler = nil
local _autoInc = 0
local function GenID(prefix)
_autoInc = _autoInc + 1
return string.format("%s_%d", prefix or "SDS2",
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
local function StartDrag()
_dragOn = true
local myID = SL:GetValue("USER_ID")
local mp = GetActorPos(myID)
_startX = mp and (mp.x + 40) or 0
_curX = _startX
SL:PlayDragStartFx(myID)
ShowTip("拖住了——往右拖多远推多远")
end
local function SlideCut(dist)
local myID = SL:GetValue("USER_ID")
local tid = SL:GetValue("MARK_TARGET_ID")
local dmg = CONST.DMG_BASE + math.floor(dist * CONST.DMG_PER_STEP)
SL:ActorHurt(tid, dmg)
SL:KnockActor(tid, dist * CONST.DRAG_TO_PUSH)
SL:PlaySlideCutFx(tid, dist)
SL:TipAbove(tid, "-" .. dmg)
ShowTip("滑斩" .. dmg .. "——推出去" .. dist .. "步")
if SL:GetValue("ACTOR_DEAD", tid) then
ShowTip("它倒了——拖得远的刃最重")
end
end
四、核心代码:完整模块(下·定时器与松手结算)
-- 松手:读拖距落刃
function SlideStrike.Release()
if not _dragOn then return end
_dragOn = false
local dist = math.floor(_curX - _startX)
SafeRemove(_dragFx)
_dragFx = nil
if dist < CONST.MIN_DRAG then
ShowTip("拖太短——刃没送出去")
return
end
SlideCut(dist)
end
-- 定时器:拖线跟手
if not _scheduler then
_scheduler = SL:Schedule(function()
if _dragOn then
local myID = SL:GetValue("USER_ID")
local mp = GetActorPos(myID)
if _dragFx and mp then
GUI:setPosition(_dragFx, mp.x + 40, mp.y - 70)
end
end
end, 0.02)
end
SL:ScheduleOnce(function()
SL:BindDebugButtonDrag("按住拖刀",
function(x) _startX = x; _dragOn = true end,
function(x) _curX = x; SlideStrike.Release() end)
ShowTip("技能已加载: 滑斩 (调试按钮触发)")
end, 1.0)
function SlideStrike.Unload()
if _scheduler then SL:Unschedule(_scheduler) end
SafeRemove(_dragFx)
_dragOn = false
end
return SlideStrike
五、机制问答
问:往左拖也行吗?
答:行——往左拖是左刃,推的方向跟着换,两边都能送,刀没有惯用手。
问:拖着的时候怪跑了怎么办?
答:白拖——松手那一帧才结算,怪出刃程就是空挥,拖刀的全程盯着怪的脚。
问:拖距有上限吗?
答:有一百八十步——刃再长也长不过臂展,封顶的拖距是这门手艺的臂展极限。
问:推出去的怪会撞墙吗?
答:会——撞墙的账归地形管,推和撞是两笔账各结各的。
问:短拖亏吗?
答:短拖有短拖的用法——二十步内是小刮刀,胜在能连,长短两套各有各的打法。
问:拖刀的方向能朝左吗?
答:能——拖左是左刃左推,刀没有惯用手,两边各拖各的账。
问:滑斩的推能把怪推进坑吗?
答:能——推距是实打实的位移,坑在推程的终点它就自己走进去,拖刀客和坑是老搭档。
问:拖刀的刃程和滑程是同一笔账吗?
答:是同一笔账的两种支出——刃吃伤推吃位移,一次拖动两份产出,账目透明才敢放手拖。
问:拖着的时候挨打了怎么办?
答:拖不断——拖刀认手上的距离不认干扰,挨打只掉血不断线,松手那一刀照常结。
六、调参指南与商业服怎么用
第四笔是量程的落差:二十到一百八十是"轻刮到重推"的全谱——量程太大轻拖没有存在感,太小长拖显不出豪气。第三笔是加伤的斜率:每十四步加一点是"拖满多十点"的斜率——斜率太陡人人拖满,太平拖不拖一个样。第二笔是一比一的推账:推距等于拖距是"付出即所得"的透明账——推距打折扣的版本玩家拖得再远也觉得被骗。第一笔是拖线的形制:拖线要像刀刃的延长——线从刀柄拉出来而不是凭空一个箭头,拖出来的线就是还没出鞘的刃。常见坑三个:拖动距离没做朝向换算,往左拖也算右刃;松手在按钮外没监听,拖出去松不了手;推距撞墙没截断,怪被推进石头里。
商业服里滑斩是"拖刀客流派"的量具:别人论刀数,他论尺寸——商城里拖线的样式做成品级,皮线、钢线、流星线,那根随手动静拉出的橙线就是拖刀客的量尺。运营落地还有两笔:一段是量感教学——教一句"刃长自己拖",流派第一课是自己定分寸;一段是长斩榜——按最长一次滑斩的距离排名,拖得最远的人有碑。变体做成回拖:推出去再往回拖半程,怪被拉回来挨第二刀——一进一回的锯法,拖刀客的进阶课。这一篇的演示和整套模块照抄能跑,改的就是 CONST 那张表。
拖刀客的老话就一句:刃送多远,看你手上有多少耐心。
拖刀客还有半句压箱的:拖之前先看怪的身后,推出去撞墙是双倍的账。
写完留一句给做输入系的同学:滑斩卖的是"刃长自己拖"——那根跟着手长短变化的橙线,是把拖动的距离一笔一笔记成伤害和位移的量尺。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 磁点一开,它的箭全拐——四秒里它射出的每一支箭都拐向同一个聚点,到了聚点整支碎掉,一支都够不着你。磁引把"躲箭…
【游戏功能】 半场一摆两秒一趟的钟摆,砸中站线上的一切——包括被你引过去的怪。钟摆把"地形"变成了武器:它本身不认敌我,你引…
【游戏功能】 两键同按零点一五秒内——铰击:两把刃铰在一起砸它二十,外加半秒的僵。单按一键只有十点白给。这篇把整套模块拆开:…
【游戏功能】 三只怪三角连着链:死一只,另外两只各挨十五;链上再倒一只,最后那只又挨十五——三环扣把"清怪"变成了"连环",…
【游戏功能】 按住攒盾,盾值就是弹量,松手引爆贴脸的怪——蓄盾爆把"防御"改写成了"蓄弹药":盾攒得越厚炸得越疼,攒盾的两秒…
【游戏功能】 按对 劈→刺→扫 三键,一记四十;按错一环,只值八点平砍。三键诀把连招的顺序做成了考卷:三枚键摆在你面前,顺序…