【游戏功能】
拆一行代码:
SL:SetActorDir(self_, SL:ReverseDir(SL:GetValue("actorDir", self_)))
把朝向原地翻转一百八十度——回马枪的全部机关就这一行。佯装败退的人在追兵眼皮底下突然回头,枪尖从追得最急的那位下巴穿进去。今天讲这套"诈败反打"的表现,怎么让假撤退看起来真撤退。
一、败退要败得像
回马枪的成败在撤退段。撤退的步频、姿态必须和真逃跑一致:步伐声、尘土、身位一点点拉开——观众和狼怪都要被说服"他怂了"。唯一的破绽藏在细节里:撤退时枪尖一直朝后(其实已经对准追兵),镜头语言上这是给观众的暗号。回身线的位置是这套戏的舞台机关:人物退过地上一条淡蓝虚线,回身的瞬间线闪一下——这条线既是玩家学会看时机的教具,也是可调参数(回身越晚,狼怪贴得越近,贯刺的收益判定越刺激)。贯刺命中点固定在狼怪下巴到胸口的高度,追击姿态下狼怪前倾,这个高度正好是它自己的头撞上来的位置。
完整演示在这,默认自动循环,可调回身线位置:
fx-turnthrust
二、幂尔框架实现:三段状态机
诈败、回身、贯刺三段各自独立,幂尔框架里按状态切换:
local TurnThrust = {}
local KEY = { TURN_LINE = 180, LUNGE = 0.16 }
local st = { phase = "idle", t = 0 }
local function SetPhase(name)
st.phase = name
st.t = 0
end
function TurnThrust.Feint(self_)
SetPhase("retreat")
SL:PlayActorAct(self_, "run")
-- 撤退方向: 背对目标
local tx = SL:GetValue("actorX", SL:GetValue("curTarget"))
SL:SetActorDir(self_, tx > SL:GetValue("actorX", self_) and 6 or 2)
SL:Schedule(function(dt)
st.t = st.t + dt
SL:SetActorVelocity(self_, SL:GetValue("actorDir", self_) == 2 and 95 or -95, 0)
if math.random() < dt * 8 then
SL:PlayFxAt("dust", SL:GetValue("actorX", self_),
SL:GetValue("actorY", self_))
end
-- 退过回身线: 翻转朝向并进入贯刺
if (SL:GetValue("actorDir", self_) == 2 and SL:GetValue("actorX", self_) <= KEY.TURN_LINE)
or (SL:GetValue("actorDir", self_) == 6 and SL:GetValue("actorX", self_) >= KEY.TURN_LINE) then
SL:UnSchedule("feintRun")
SL:SetActorVelocity(self_, 0, 0)
SL:SetActorDir(self_, SL:ReverseDir(SL:GetValue("actorDir", self_)))
SetPhase("thrust")
TurnThrust.Thrust(self_)
end
end, 0.016, "feintRun")
end
function TurnThrust.Thrust(self_)
SL:ScheduleOnce(function()
SL:PlayActorAct(self_, "attack")
SL:PlayFlyFx("spear_line", SL:GetValue("actorX", self_),
SL:GetValue("actorY", self_) - 78, nil, nil, 0, nil)
local target = SL:GetValue("curTarget")
SL:DeductHp(target, 35)
SL:ShowHitNum(target, 35, "thrust")
SL:ScreenShake(0.22, 4)
SL:PlayActorAct(target, "stuck")
SL:KnockBack(target, 26)
SetPhase("reset")
end, KEY.LUNGE)
end
return TurnThrust
ReverseDir 那一下翻转之前,人物的速度要先清零——带着速度翻朝向会滑出一个滑稽的倒退步。
三、收益与追击距离的耦合
回马枪的伤害应该和追兵的投入成正比:狼怪追得越近、冲得越急,挨这一枪越疼。实现上把命中伤害绑定命中瞬间两者的距离——贴脸贯刺满伤,隔两步贯刺半伤。这个耦合让"回身线放哪"变成了真决策:线放得远,安全但收益低;贴脸才回身,刀刀暴击但容错归零。表现层把回身线做成可调滑块,玩家自己试出最优距离,这就是技能的成长空间。
最后是 reset 段的体面:得手之后人物不恋战,借贯刺的后坐力顺势拉开距离,狼怪从硬直里爬起来时,对手已经回到对峙位——一套完整的"打了就跑"叙事闭环,观众看三遍才咂摸出味来。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 法师的困扰千篇一律:蓝条见底符纸哑火,站在怪堆里干瞪眼——直到有人给他看了一行账:符落三十五蓝,杖挥一刀回十二…
【游戏功能】 地刺从脚底下炸出来的那半秒,大多数人的选择是躲——只有极少数人按下了偷师。偷师的机制是一场限时的一秒课:它抬手…
【游戏功能】 两只狼配合得像一个人:一只咬前蹄、一只扑后背,多少人栽在这对搭档手里——直到有人往白狼背上钉了一张嫁祸符。离间…
【游戏功能】 弓狼在远处放冷箭,刀狼在近处追着你——两头受气的死局,怎么破?有老手给出的答案匪夷所思:往刀狼身后一站,让它替…
【游戏功能】 buffs[name] = nil ——一行删表项的代码,写尽了驱散全部的狠辣:狼怪顶着三层好处——狂暴加攻、…
【游戏功能】 弓箭手的伤害明明不低,为什么同样的怪别人十秒放倒、他要磨半分钟?看完他的操作就明白了:箭是乱射的,囊空了站在原…