【游戏功能】
一掌把第一只狼撞飞,它飞出去正好砸在第二只狼身上——两只同时挨伤,第一只吃撞飞的二十五,第二只吃连锁的二十五。连锁撞击的机制就这一条弹道:撞飞第一只、第一只飞出去撞第二只——两只挨得越近,连锁撞得越实。今天拆连锁撞击,看"弹射系"怎么把一只怪的位移,变成另一只怪的伤害。
一、撞飞、弹射、连锁三段
连锁撞击的循环三段。撞飞段:一掌把第一只狼拍飞,它腾空飞出、头上冒"撞飞"的蓝字——撞飞段是全技能的起手:第一只是炮弹,第二只是靶子,炮弹的飞行方向就是你拍的方向。弹射段:第一只飞过半场,撞上第二只——弹射段是全技能的连锁:两只狼撞在一起各吃一记,连锁的伤害取决于两只之间的距离——距离越近连锁越疼,距离太远连锁就断。落账段:两只分别落地,头上的蓝字一起闪——落账段是全技能的结算:第一只吃三十五的撞飞、第二只吃二十五的连锁,一招两伤、一本账两头记。三段的核心是"一飞二撞":连锁撞击的妙不在第一只被打多疼,在第一只变成了打第二只的弹头——你打的第一下,变成了它替你打的第二下。
完整演示在这,默认自动循环:
fx-chainkb
二、幂尔框架实现:连锁是一次距离判定的接力
连锁撞击的账本就一行距离判定——
local ChainKB = {}
local KB_DMG = 35 -- 第一只撞飞
local CHAIN_DMG = 25 -- 第二只连锁
local CHAIN_R = 180 -- 连锁距离
local KB_SPD = 300 -- 飞行速度
local state = { flying = false, a = nil, b = nil }
function SL:KnockFirst(a, b)
state.a = a
state.b = b
state.flying = true
a.vy = -160 -- 腾空
SL:HitActor(a, KB_DMG)
SL:ShowTipAbove(a, "-35 撞飞")
end
function SL:OnTick(dt)
if not state.flying then return end
local dx = SL:GetValue("actorX", state.a)
local bx = SL:GetValue("actorX", state.b)
if bx - dx < 180 and not state.b.dead then
SL:HitActor(state.b, 25)
SL:ShowTipAbove(state.b, "-25 连撞")
state.flying = false
end
if dx < 20 then state.flying = false end -- 飞出界:断链
end
return ChainKB
距离一百八是全技能的题眼:两只间隔一百八十像素以内连锁成立——间距越窄连锁越稳,间距越宽越容易断链。
三、连锁的演出规格
撞飞是全技能的招牌:第一只狼被拍得腾空半尺、四脚朝天、头上蓝字——腾空的狼要"翻",翻着飞出去的怪才有被拍飞的实感,平移出去的像被推不是被撞。弹射的一帧要"接":第一只撞上第二只的一瞬,交点炸一粒白光、两只同时顿半帧——顿的那半帧是动量传递的物理,顿了玩家才信"力传过去了"。连锁的蓝字要"接力":第一只蓝字"撞飞"、第二只蓝字"连锁",两只头上的字先后亮起——先后亮是连锁的节拍,一先一后才叫"传",同时亮就叫做"群伤"。落地的弹尘要"匀":两只落地的时间要错开半秒——先落的是被拍的、后落的是被撞的,落地的先后就是伤害的因果。
四、定价与三条撞规
弹射系的定价一句话:撞飞三十五、连锁二十五、一百八像素内有效——三十五加二十五的合计账全押在两只狼的间距上。三条撞规:其一,连锁只传一次——撞飞的狼落地后不再弹第三只,连锁是一对一的接力不是无限传播;其二,飞行的撞不死——被撞飞的狼只吃伤害不死,连锁撞击的飞行状态不触发死亡判定,它必须落地才结算生死;其三,断链有提示——连锁距离不够时,第二只头顶会浮"断链"灰字——断链要有提示,没有提示的断链是毛病不是机制。与撞击类对照着看:同是"撞一个带一个",抗拒火环是向外推——推完就完,没有连锁;连锁撞击是往内弹——第一只变成打第二只的弹头,撞击系的两个门派在"散弹"还是"连弹"上分了家。
五、弹射系的站位学:两只怪的间距就是你的伤害表
连锁撞击真正设计的是"站位惩罚"的可见化:两只怪站得近不是巧合,是它们选择了互相照应——而连锁撞击恰好惩罚这种照应:靠得越近、连锁越疼。老玩家的打法是"先拆阵再输出":先看清两只的距离,一百八十以内就全力打第一只把它撞进第二只怀里——两只挤在一处的每一帧都在给你送连锁伤害。对观战者,第一只飞出去撞第二只的画面是最有台球感的瞬间:一杆打进、两球齐飞,物理的因果在两只狼之间画了一条清晰的弹道。工程收尾记一笔:连锁的距离判定要用两只怪的碰撞盒边缘而不是中心点——中心距一百八但碰撞盒已经贴上了也应该触发连锁,用边缘判定才符合"它们碰到了"的直觉。最后留给数值组的一句话:一百八十像素的连锁距离是这门功夫的题面宽度——题面太宽连锁白送、太窄连锁永远断,一百八刚好是"站得近就该挨罚"的合理宽度。
写完再留一句给做弹射系的同学:连锁撞击最容易做成"一个范围弹跳",而它本该是一次有物理感的动量传递——第一只要飞出抛物线、第二只要被撞得顿半帧、连锁的距离要画出弹道的弧,动量传过去了,玩家的每一掌才都是一杆好台球。
补一个演示彩蛋位:连锁命中的那一帧,两只狼之间会闪过一道白线——白线是动量传递的弹道轨迹,轨迹从第一只的胸口穿到第二只的胸口——看得懂白线的人,下一掌知道该往哪个方向拍。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【语法算法】 上一版的炮台索敌逻辑有个隐蔽报错:炮台永远打同一个怪——即使那只怪已经死了,索敌的游标也不挪窝。追到底索敌的游…
【语法算法】 先抛一个坑:打不完的火系怪怎么办?火抗怪火打不动,换冰系技能要切装备要换面板——切完黄花菜都凉了。元素转换的答…
【语法算法】 上个月的事故复盘会上有个数字被念了三遍:四成——策划写的是"同伴陪疼四成",代码落下去成了"陪疼四十点",两只…
【语法算法】 单行代码拆解:弹射初速=-420——弹射的全部动力就这一行的负初速。负号朝上、四百二十是弹射的初速大小——踩上…
【语法算法】 上一版的减速类模块全按"乘以零点五"来写,帧率无关的版本照搬了这套写法——结果高帧率机上减速效果好,低帧率机上…
【语法算法】 先抛一个坑:怎么把散在四处的怪聚到一起打?逐个拉是笨办法,一个范围技又只能打一片——引力球的答案是一个会动的吸…