【游戏功能】
"蓄力条满了那一刻,手指该不该松?"——这个问题在动作游戏里争论了三十年。松早了伤害打折,松晚了被怪物打断,蓄力一击的乐趣全在"何时松手"的判断里。今天拆蓄能一击的表现,看蓄力环怎么把"犹豫的价值"画在角色头上。
一、涨环、满环、挥锤三拍
蓄力一击的时间轴三拍。涨环拍:金色蓄力环绕人物周身逐圈点亮,环的填充角度就是蓄力进度——环形而不是条形,因为环长在角色身上,玩家的眼睛不用离开战斗去看 UI。满环拍:环走满一圈的瞬间整环爆亮、外圈再扩一圈金光、粒子开始向内汇聚——满环的"叮"是全套反馈里最亮的一帧,它在对玩家喊:现在松手。挥锤拍:落锤砸向狼怪,伤害数字随蓄力比例放大——满环数字带"蓄满"后缀金色大字,半环数字灰白小字。三拍之外还有第四拍:蓄力途中被狼怪挠一下,环碎、蓄力清零、一行"前功尽弃"——打断的惩罚可见,蓄力的价值才成立。
完整演示在这,默认自动循环,可调满环加成:
fx-chargeup
二、幂尔框架实现:蓄力环与打断结算
蓄力环走进度渲染,打断走受击回调:
local ChargeUp = {}
local KEY = { CHARGE_TIME = 1.4 }
local charging = nil -- { t = 0 }
function Charge.Start(self_)
if charging then return end
charging = { t = 0 }
SL:PlayActorAct(self_, "cast")
SL:Schedule(function(dt)
if not charging then SL:UnSchedule("chargeRun") return end
charging.t = charging.t + dt
local k = math.min(1, charging.t / KEY.CHARGE_TIME)
-- 蓄力环渲染: 进度即角度
SL:DrawRingFx("charge_ring", SL:GetValue("actorX", self_),
SL:GetValue("actorY", self_) - 50, k)
-- 蓄力粒子随进度加密
if math.random() < dt * 14 * (0.4 + k) then
SL:PlayBurst(SL:GetValue("actorX", self_) + (math.random() - 0.5) * 40,
SL:GetValue("actorY", self_) - 30 - math.random() * 70,
"gold_mote", 1)
end
-- 满环爆亮
if k >= 1 and not SL:GetValue("ringFull") then
SL:SetValue("ringFull", true)
SL:PlayFxAt("ring_full", SL:GetValue("actorX", self_),
SL:GetValue("actorY", self_) - 50)
SL:PlaySfx("charge_full")
end
end, 0.016, "chargeRun")
end
-- 引擎受击回调: 蓄力被打断
function Charge.OnBeHit(self_, damage)
if not charging then return end
charging = nil
SL:SetValue("ringFull", false)
SL:StopRingFx("charge_ring")
SL:PlayActorAct(self_, "stuck")
SL:ShowTipAbove(self_, "蓄力被打断!")
SL:PlaySfx("charge_break")
end
function Charge.Release(self_, target)
if not charging then return end
local k = math.min(1, charging.t / KEY.CHARGE_TIME)
local bonus = SL:GetValue("fullBonus") or 100
local dmg = math.floor(20 * (1 + bonus / 100 * k))
charging = nil
SL:SetValue("ringFull", false)
SL:StopRingFx("charge_ring")
SL:PlayActorAct(self_, "attack")
SL:ScheduleOnce(function()
SL:PlayFxAt("hammer_hit", SL:GetValue("actorX", target),
SL:GetValue("actorY", target) - 58)
SL:DeductHp(target, dmg)
SL:ShowHitNum(target, dmg, k >= 1 and "charged" or "normal")
SL:ScreenShake(0.3, k >= 1 and 6 or 3)
SL:PlayActorAct(target, "stuck")
end, 0.2)
end
return ChargeUp
k 这个蓄力比例贯穿伤害、震屏、字号三处——蓄多少,处处都大。
三、打断窗口与满环保持
打断的判定窗口要给蓄力留尊严:只有挥锤的前摇帧能打断,箭矢擦身不算——打断是重罚,重罚的触发条件必须清晰可见。满环之后的保持时间值得做"金身":满环瞬间起两秒内不可打断,两秒后环开始闪烁衰减——满环不等于永久安全,但至少给你读完那一声"叮"的尊严。蓄力环的两层设计(进度环加背景环)让"还差多少"一眼可读,背景环的存在是进度的参照系,没有参照的进度条读不出紧迫感。最后,打断惩罚的台词"前功尽弃"四个字比任何图标都直白——文字是最便宜的演出,别浪费。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 零点一秒之内,血条无端少了一截——没有刀光没有红字,人却已经站在它嘴边了。吸力的机制就是这场无声的绑架:它吸气…
【游戏功能】 有块场地被玩家们称作"阅兵场":一尊石像立在正中,眼睛扫出的一道红光从场子这头滚到那头,碰着就烧——新手进场先…
【游戏功能】 seal.x = P.x ——一行把雷的落点锁在你此刻坐标的代码,写尽了雷印全部的凶险:被点名的三秒后,雷落在…
【游戏功能】 单子上写着一场三连摔:狼怪每跺一次地,玩家就摔一个跟头,三连摔摔出了真火气——直到有人教他一个字:跳。地波的机…
【游戏功能】 火力全开轰在主母身上,伤害数字却全是"免伤"的白字——多少人跟这道白打的罩子耗到弹尽粮绝,才有人喊一句:先杀小…
【游戏功能】 伤害统计里有条诡异的曲线:同一场仗,前半段每刀挨十五,后半段每刀挨三十——配置没人动过,狼怪却像换了个人。狂暴…