【游戏功能】
出招的顺序算不算伤害?大多数战斗里不算——三招乱按和按谱出,账面一个样。连招谱把顺序变成了伤害本身:「劈→撩→刺」收破军尾刀四十翻倍,「撩→劈→刺」收回风气回三十,出脱了谱三招白出。这篇的核心代码照引擎技能脚本的全规格写:配置表、谱面构件、招式链状态机、定时器、调试按钮。
一、效果演示:三颗按钮,两套谱
演示场有三颗招式按钮——劈、撩、刺。任意乱按,每招十二点灰字,三秒不出下一招谱就断。可按谱走就是另一个世界:劈→撩→刺三连,第三招收"破军"——四十大字、宽弧、震屏全套伺候;撩→劈→刺三连,收"回风"——头顶绿字回三十血。谱面进度条在玩家脚下三秒倒走,出招一个字亮一格,三格亮满算成谱。演示里先乱按一轮看脱谱的灰字,再按谱走一轮看尾刀——同一套按钮,两种账面。演示里先乱按一轮看脱谱的灰字,再按谱走一轮看尾刀——同一套按钮,两种账面。三格进度条在脚下倒走的时候最紧张:亮两格停半秒,第三招就得到位。
fx-comboroute
二、底层原理:一条招式链加一张谱表
模块的账本是一条链配一张谱。招式链是三格的滑动记录:每次出招把招式名压进链尾、超三格挤掉链头——链里存的是顺序,不是计数。谱表是两张三行的核对单:每行是一个招序和它的奖励——链满三格的那一刻,拿链和谱表逐行比对,对上哪行发哪份奖励,都对不上发"脱谱"。三秒的续招窗口是链的寿命:窗口每帧递减、出招即重置,归零链清空——窗口的紧迫感就是这套机制的拍子。奖励发放全部在链满的那一帧结算,尾刀伤害和回血量各自走各自的出口,两份奖励永不串账。
三、核心代码:完整模块(上·骨架)
--------------------------------------------------------------------------------
-- @file ComboRoute.lua
-- @brief 连招谱 —— 三招按谱出,谱尾一击翻倍
-- 客户端表现模块:配置表 / 谱表 / 招式链状态机 / 定时器
--------------------------------------------------------------------------------
local ComboRoute = {}
--------------------------------------------------------------------------------
-- 配置与常量
--------------------------------------------------------------------------------
local CONST = {
CHAIN_WINDOW = 3.0, -- 续招窗口三秒
CHAIN_LEN = 3, -- 三招成谱
MOVE_DMG = 12, -- 单招十二
ROUTE_CRUSH = "劈撩刺", -- 破军谱
ROUTE_CRUSH_X = 40, -- 破军尾刀四十
ROUTE_WIND = "撩劈刺", -- 回风谱
ROUTE_WIND_HP = 30, -- 回风回三十
-- 颜色
COLOR_PAGE = "#d97742", -- 谱朱
COLOR_DEEP = "#7a3212", -- 深朱
COLOR_GHOST = "#ffc9a8", -- 谱白
ZORDER_GROUND = 118,
ZORDER_PAGE = 132,
ZORDER_EFFECT = 135,
AUTOINC_BASE = 944000,
}
--------------------------------------------------------------------------------
-- 谱表:招序与奖励的核对单
--------------------------------------------------------------------------------
local ROUTES = {
[CONST.ROUTE_CRUSH] = { kind = "dmg", v = CONST.ROUTE_CRUSH_X, name = "破军" },
[CONST.ROUTE_WIND] = { kind = "heal", v = CONST.ROUTE_WIND_HP, name = "回风" },
}
--------------------------------------------------------------------------------
-- 模块内部状态
--------------------------------------------------------------------------------
local _chain = {} -- 招式链
local _chainT = 0 -- 续招窗口
local _scheduler = nil
local _autoInc = 0
local m_cos = math.cos
local m_sin = math.sin
--------------------------------------------------------------------------------
-- 辅助函数
--------------------------------------------------------------------------------
local function GenID(prefix)
_autoInc = _autoInc + 1
return string.format("%s_%d", prefix or "CBR", CONST.AUTOINC_BASE + _autoInc)
end
local function GetActorPos(actorID)
if not actorID then return nil end
local x = SL:GetValue("ACTOR_POSITION_X", actorID)
local y = SL:GetValue("ACTOR_POSITION_Y", actorID)
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 CreatePageNode()
local mp = GetActorPos(SL:GetValue("USER_ID"))
if not mp then return end
local node = GUI:Layout_Create(GUI:Attach_SceneF(), GenID("Page"),
mp.x - 46, mp.y + 4, 0, 0, false)
GUI:setLocalZOrder(node, CONST.ZORDER_PAGE)
for g = 0, 2 do
GUI:DrawLine_Create(node, "slot_" .. g, 0, 0, 14, g * 32, 0, g * 32 + 24, 0,
CONST.COLOR_DEEP, 200)
end
return node
end
骨架的三处立规。谱表用招序字符串当键——ROUTES["劈撩刺"] 一行查表,比对不需要逐位循环,字符串相等就是成谱。招式链存汉字名不存按钮编号——链转成字符串就是谱键,两层结构之间零换算。谱面构件三格横排——格子的亮灭就是链的长度,玩家低头一眼数格。
四、核心代码:完整模块(下·定时器与谱面结算)
--------------------------------------------------------------------------------
-- 出招入链与成谱
--------------------------------------------------------------------------------
local function Chain_Push(move)
if #_chain >= CONST.CHAIN_LEN then
table.remove(_chain, 1)
end
table.insert(_chain, move)
_chainT = CONST.CHAIN_WINDOW
if #_chain == CONST.CHAIN_LEN then
local seq = table.concat(_chain)
local route = ROUTES[seq]
if route then
if route.kind == "dmg" then
SL:ActorHurt(SL:GetValue("MARK_TARGET_ID"), route.v)
SL:TipAbove(SL:GetValue("MARK_TARGET_ID"), "-" .. route.v)
SL:ScreenShake(5, 0.30)
else
SL:HealMe(route.v)
SL:TipAboveMe("+" .. route.v)
end
ShowTip(route.name .. "收尾")
else
ShowTip("出脱谱了——三招白出,重数")
end
_chain = {}
_chainT = 0
end
end
--------------------------------------------------------------------------------
-- 三颗招式按钮
--------------------------------------------------------------------------------
function ComboRoute.Move(name)
Chain_Push(name)
end
--------------------------------------------------------------------------------
-- 定时器:窗口递减
--------------------------------------------------------------------------------
if not _scheduler then
_scheduler = SL:Schedule(function(dt)
if _chainT > 0 then
_chainT = _chainT - dt
if _chainT <= 0 and #_chain > 0 then
_chain = {}
ShowTip("谱断了——三秒没续上,重数")
end
end
end, 0.02)
end
SL:RegisterLUAEvent(LUA_EVENT_SCENE_CLEAR, "CBR_Clear", function()
_chain, _chainT = {}, 0
end)
SL:ScheduleOnce(function()
ShowTip("技能已加载: 连招谱 (调试按钮触发)")
end, 1.0)
return ComboRoute
下半场的成谱结算是全模块的门面:链满三格的那一帧,table.concat 把链拼成招序串、查表、发奖、清链——四步一口气做完,中间不留任何可插队的空帧。窗口的清空写在定时器的独立分支里——窗口归零的断谱和成谱的清链是两条路,互不覆盖;断谱的提示也要响——无声的清链会让玩家以为下一招还在续。窗口归零的断谱和成谱的清链是两条路,互不覆盖;断谱的提示也要响——无声的清链会让玩家以为下一招还在续。出招的结算也要即时——每一招落手就跳十二,谱的奖励是额外的一笔,不是把三招的账攒到尾刀一起算。奖励的两种出口分开走:破军走怪的血、回风走自己的血,各自调各自的接口,奖励表里类别字段一改就是一个新谱。
五、调参指南与商业服怎么用
调参三笔账。窗口三秒对单招零点八秒的出手是四招的容量——三招成谱留一招余量,手慢的玩家掉一格还能救;窗口压到两秒就是连招纯度考试。尾刀四十对单招十二是三点三的谱尾杠杆——杠杆过五倍玩家只为了尾刀出招,前两招沦为按键;杠杆过两倍谱尾不够甜,没人背谱。两套谱的奖励要错位——一个给伤害一个给回血,背一张谱保命、背两张谱杀人,谱表越厚玩法越厚。两套谱的奖励要错位——一个给伤害一个给回血,背一张谱保命、背两张谱杀人,谱表越厚玩法越厚。招与招之间也要有性格:劈是重、撩是快、刺是准,三招的手感立住了,背谱才不是背口诀。常见坑三个:链满后不回收,第四招挤掉第一招变成滚动窗口的乱谱;窗口在成谱瞬间没清零,残窗口接着算下一张谱;脱谱没有提示,玩家乱按三轮不知错在哪。
商业服里连招谱是"武学流派"的载体:每张谱是一门武学——破军谱刚猛、回风谱绵柔,谱的书页做成商城的武学残卷,收集残卷解锁新谱,武学的深度直接长在谱表上。比武场里它是操作的身份证:会背谱的玩家和乱按的玩家,同样的装备打出入两种战绩,操作的价值写进胜负里。变体做成双人合谱:甲出前两招、乙补第三招收尾——连招谱从个人手速变成团队暗号。这一篇的演示和整套模块照抄能跑,改的就是 CONST 和谱表那两处。
写完留一句给做连招系的同学:连招谱卖的是"顺序的尊重"——同一套按钮,尊重顺序的人打出的就是另一门武学。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 怪的仇恨为什么永远追着你?因为它看得见你。迷魂香把"看得见"这三个字没收了:一炉香落在它脚下,烟圈六秒——圈里…
【游戏功能】 连击值攒着有什么用?多数战斗的答案是攒个伤害加成——气势给了第二个答案:攒的是一支军队的士气。每一刀涨十二点、…
【游戏功能】 一道割裂挂上去,一秒一跳——它站着跳四,追你的时候崩成八:伤口一动就崩,跑得越快掉得越凶。崩血把"放风筝"从走…
【游戏功能】 突进出去了,回不回得来?多数突进的答案是"不回"——人留在怪堆里听天由命。燕回式给突进装了归途:穿身而过去时一…
【游戏功能】 读条变红的那一秒,全世界都在等一个决定。破招式把这一秒做成整场战斗的心跳:怪交替出红劈和蓝刺,红劈读条时按下破…
【游戏功能】 出招的顺序算不算伤害?大多数战斗里不算——三招乱按和按谱出,账面一个样。连招谱把顺序变成了伤害本身:「劈→撩→…