【游戏功能】
刀速有没有上限?过载锋的答案是:上限是崩刃——每一刀涨十五热,热越高刀速越快,一点二秒一刀骑到零点七秒一刀;热满一百当场崩刃,停三秒眼睁睁看怪拍你。泄热按钮一口散四十,把刀骑在九十的线上最快、也最险。这篇的核心代码照引擎技能脚本的全规格写:配置表、热量表、崩刃状态机、定时器、调试按钮。
一、效果演示:热骑到九十,崩在三秒里
演示场点不点按钮刀都会自己打:每一刀头顶的热条涨一格——热零到三十是安全区,一刀一点二秒;三十到七十刀速肉眼可见地提起来;七十往上刀身发红,零点七秒一刀。热到九十头顶蹦"临崩!"——这是最后的泄热窗口;不泄,热满一百当场"崩刃!":灰罩罩身三秒,刀停了,怪的白刃一套一套地拍。点「泄热!」一口散四十热——热回到安全线,刀速回档。演示里试两条路:骑到九十就泄——永远最快但手要勤;泄到热散光——刀回到一点二秒一刀的慢板,稳但亏。骑与泄的配比就是这门机制的玩法。骑与泄的配比就是这门机制的玩法——骑得好的刀从不停,泄得勤的刀从不崩,两种玩家两种活法。
fx-overheat
二、底层原理:一条速度曲线加一次硬惩罚
模块的账本是一条曲线配一堵墙。曲线侧:攻击间隔是热的线性函数——热零到一百,间隔从一点二秒线性缩到零点七秒,每一帧按当前热重算下一刀的间隔。墙侧:热满一百触发崩刃——攻击循环整个冻结三秒,三秒后以三十热重新起步。曲线让"贪"有回报,墙让"过贪"有代价,两者的落差就是这门机制的呼吸。泄热是第三条路:花一个冷却买四十格的散热,把刀从崩刃线拉回来——泄热的冷却三秒对崩刃惩罚三秒同长,泄热救的不是热是三秒的停机。热自然冷却没有:热只进不出(除了泄热),这个设定逼着玩家主动管理。
三、核心代码:完整模块(上·骨架)
--------------------------------------------------------------------------------
-- @file Overheat.lua
-- @brief 过载锋 —— 刀速越打越快,热满崩刃
-- 客户端表现模块:配置表 / 热量表 / 崩刃状态机 / 定时器
--------------------------------------------------------------------------------
local Overheat = {}
--------------------------------------------------------------------------------
-- 配置与常量
--------------------------------------------------------------------------------
local CONST = {
HEAT_CAP = 100, -- 热满一百
HEAT_PER_HIT = 15, -- 一刀十五热
GAP_COOL = 1.2, -- 零热间隔一点二秒
GAP_HOT = 0.7, -- 满热间隔零点七秒
JAM_TIME = 3.0, -- 崩刃停三秒
JAM_RESET = 30, -- 接刀起步三十热
VENT_CD = 3.0, -- 泄热冷却
VENT_CUT = 40, -- 一口散四十
CRACK_AT = 90, -- 九十临崩
-- 颜色
COLOR_HEAT = "#ff6a3d", -- 过热橙红
COLOR_DEEP = "#8a2a0e", -- 深红
COLOR_GHOST = "#ffe8d8", -- 锋白
ZORDER_GROUND = 118,
ZORDER_HEAT = 131,
ZORDER_EFFECT = 135,
AUTOINC_BASE = 954000,
}
--------------------------------------------------------------------------------
-- 模块内部状态
--------------------------------------------------------------------------------
local _heat = 0 -- 热读数
local _jamT = 0 -- 崩刃余时
local _cdLeft = 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 "OVH", 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 CreateHeatBar()
local node = GUI:Layout_Create(GUI:Attach_SceneF(), GenID("Heat"), 0, 0, 0, 0, false)
GUI:setLocalZOrder(node, CONST.ZORDER_HEAT)
GUI:DrawLine_Create(node, "bg", 0, 0, 6, -30, 0, 30, 0, "#30363d", 255)
GUI:DrawLine_Create(node, "mark", 0, 0, 1, 24, -4, 24, 4, CONST.COLOR_DEEP, 220)
return node
end
骨架的三处立规。间隔曲线写成两常量的线性插值——GAP_COOL 和 GAP_HOT 是曲线的两个端点,改手感只动端点。警戒线画在热条的九十格处——CRACK_AT 的值和警戒线的位置要读同一个常量,两处分开写的版本线画歪了就是误导。崩刃余时 _jamT 独立成字段——崩刃是状态不是读数的一部分,读数在崩刃期间冻结不清零。
四、核心代码:完整模块(下·定时器与崩刃状态机)
--------------------------------------------------------------------------------
-- 间隔曲线与泄热
--------------------------------------------------------------------------------
local function AtkGap()
local k = _heat / CONST.HEAT_CAP
return CONST.GAP_COOL - (CONST.GAP_COOL - CONST.GAP_HOT) * k
end
function Overheat.Vent()
if _cdLeft > 0 then return end
if _heat < 20 then
ShowTip("刀是凉的——没热可散")
return
end
_cdLeft = CONST.VENT_CD
_heat = math.max(0, _heat - CONST.VENT_CUT)
SL:TipAboveMe("泄热-40")
end
--------------------------------------------------------------------------------
-- 定时器:出招循环与崩刃状态机
--------------------------------------------------------------------------------
if not _scheduler then
_scheduler = SL:Schedule(function(dt)
_cdLeft = math.max(0, _cdLeft - dt)
if _jamT > 0 then
_jamT = _jamT - dt
if _jamT <= 0 then
_heat = CONST.JAM_RESET
ShowTip("刀接上了——三十热起步,悠着点骑")
end
return
end
if _heat >= CONST.HEAT_CAP then
_jamT = CONST.JAM_TIME
SL:PlayBladeBreak()
SL:TipAboveMe("崩刃!")
SL:ScreenShake(4, 0.24)
return
end
_atkT = (_atkT or 1.2) - dt
if _atkT <= 0 then
_atkT = AtkGap()
_heat = math.min(CONST.HEAT_CAP, _heat + CONST.HEAT_PER_HIT)
SL:NormalSlash()
end
end, 0.02)
end
SL:RegisterLUAEvent(LUA_EVENT_SCENE_CLEAR, "OVH_Clear", function()
_heat, _jamT = 0, 0
end)
SL:ScheduleOnce(function()
ShowTip("技能已加载: 过载锋 (调试按钮触发)")
end, 1.0)
return Overheat
下半场的崩刃状态机是全模块的心跳闸:_jamT 大于零的每一帧直接跳出——出招循环、热读数全部冻结,三秒里刀就是死的;解冻的第一步是把热重置到三十——满热接刀等于立刻再崩,三十热起步是给玩家的第二次机会,也是崩刃惩罚的收官。出招循环里热满的检查放在加热的下一行——刚加完热就查,崩刃永远在第一百格的当口触发,不多积一格。出招循环里热满的检查放在加热的下一行——刚加完热就查,崩刃永远在第一百格的当口触发,不多积一格。泄热的白汽特效也别省——一口热汽从刀身散出来,散热的"松"和过载的"紧"就是两种呼吸。
五、调参指南与商业服怎么用
调参三笔账。间隔从一点二缩到零点七是四成多的提速——提速四成多是"骑热"的全部甜头,甜头再大玩家会故意骑崩换输出节奏,甜头太小热系统就是摆设。热满崩刃停三秒对怪的攻击周期两秒半是一轮半的白挨——崩刃的疼要压过提速的爽,惩罚轻了没人泄热。泄热散四十对冷却三秒是"每三秒救一次"的保险丝——散得太多泄热按钮变成常驻降温,热管理就没了。常见坑三个:崩刃期间泄热还能按,三秒的惩罚被按钮抵消;热条警戒线的位置和崩刃阈值不同步;出招间隔的插值只算了热没算攻速装备,两套加速叠乘超模。
商业服里过载锋是"武器品质"的试金石:同一把刀,好铁崩刃慢热散快——武器的热学参数做成品质线,锻造的深度第一次摸到了刀速。副本里它是速通榜的门槛:会骑九十的队和泄热泄成习惯的队,输出差两成,速通榜的名次就是热管理的成绩单。变体做成双刃过载:刀与鞘轮流过载——刀崩了鞘上,无缝骑热的手法是天花板。变体做成双刃过载:刀与鞘轮流过载——刀崩了鞘上,无缝骑热的手法是天花板。过载的刀纹也要随热度换色——凉的银、温的金、临崩的红,刀身的颜色就是热度的温度计。这一篇的演示和整套模块照抄能跑,改的就是 CONST 那张表。
写完留一句给做武器热系的同学:过载卖的是"骑线的胆量"——热条上的那道警戒线,就是这门机制给玩家划的自由边界。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 控制技能的镜像问题是:锁住了怪,自己是不是也闲着?影锁把这道两难摆上台面:影锁四秒,它动不了、你也动不了——它…
【游戏功能】 打断为什么只有"清读条"一种?震魂偏要反过来——不清招、不断势,打在它读条半途的那一劲顺着招震进腑——中劲十秒…
【游戏功能】 蜂群为什么总是一只一只出?蜂王偏要让它们进化:放一只蜂王出来,杀掉小怪喂它——喂三只升一阶,三阶蜂王的毒刺一秒…
【游戏功能】 技能为什么总是不扣自己的血?血刃偏要反着来:开着血刃的每一刀先扣自己二血、命中回三血——净赚一但要打得中,空刀…
【游戏功能】 bn.t = bn.t - dt ——一行旗面倒计时的代码,撑起了破军旗全部的紧迫感:旗立三秒、圈内加攻三成,…
【游戏功能】 淬毒为什么要一毒到底?淬毒刃偏要一层一层叠:一刀淬一层毒、毒层一秒六地烂,六层封顶之后一刀下去毒伤三十六——叠…