【游戏功能】
上周群里炸了个真事故:竞技场决赛局,守方一个战士贴脸一套连招,对面法师丝血反杀——靠的是换位。赛后回放里对面明明站在刀口上,刀落下去人却在两米外。裁判组看了三遍录像才看明白:不是外挂,是斗转星移,扑脸瞬间两个人换了个位置。今天就把这个"刀到脸上人换了位"的表现层完整拆一遍。
一、换位的三帧黄金窗口
换位好不好玩,全看时机窗口给多宽。狼怪从起跑到扑到脸上大概 0.6 秒,真正的判定窗口是最后 0.12 秒——再早换,狼怪会顺势转向追击,白换;再晚换,刀已经落了,判定打架。窗口内触发要做足三件事:两个身位同时半透明闪烁(告诉大家这俩换魂了)、一条光带在两人之间拉过、落地瞬间各炸一小蓬粒子。狼怪这边的戏更关键:它扑空后要保持原方向再冲一小段,头上顶个问号,急停、转身——这一连串小动作才是"它懵了"的笑点。
完整演示在这,默认自动循环,狼怪扑到触发距离就会换:
fx-swap
二、幂尔框架下的换位实现
换位本质是两个坐标在一帧内对调,表现层要补的是渐变、光带和转向。坐标用 SL:GetValue 取,位移交给 SL:SetActorVelocity 短促施力做冲锋感:
local Swap = {}
local KEY = { DIST = 100, DASH_SPD = 300 }
local busy = false
local function PosOf(vid)
return SL:GetValue("actorX", vid), SL:GetValue("actorY", vid)
end
local function FaceTo(vid, tx, ty)
local x, y = PosOf(vid)
-- 幂尔框架按坐标差换算朝向
SL:SetActorDir(vid, SL:CalcDir(tx - x, ty - y))
end
function Swap.Try(self_, target)
if busy then return false end
local sx, sy = PosOf(self_)
local tx, ty = PosOf(target)
local dx, dy = tx - sx, ty - sy
if dx * dx + dy * dy > KEY.DIST * KEY.DIST then
return false -- 不在窗口距离内,换不得
end
busy = true
-- 双方同时淡出
SL:SetActorAlpha(self_, 60)
SL:SetActorAlpha(target, 60)
-- 一帧内对调坐标
SL:SetActorPos(self_, tx, ty)
SL:SetActorPos(target, sx, sy)
SL:ShowSystemTips("斗转星移!")
-- 0.4 秒后恢复透明度并各自转向
SL:ScheduleOnce(function()
SL:SetActorAlpha(self_, 255)
SL:SetActorAlpha(target, 255)
local nx, ny = PosOf(target)
FaceTo(target, sx, sy) -- 狼怪转身找人
FaceTo(self_, nx, ny)
busy = false
end, 0.4)
return true
end
-- 狼怪冲锋过头的表现:保持原方向再滑行一小段
function Swap.OnMonsterDash(target)
SL:SetActorVelocity(target, -KEY.DASH_SPD, 0)
SL:ScheduleOnce(function()
SL:SetActorVelocity(target, 0, 0)
end, 0.3)
end
return Swap
注意 FaceTo 里用的是 SL:CalcDir,幂尔框架封装好的朝向换算,传坐标差直接拿方向码,别自己写 atan2 硬算八向,边界角度容易和引擎的区间划分对不上。
三、换位之后的连招衔接
换位不是目的,背后那一刀才是。人出现在狼怪身后,此时狼怪的仇恨还锁在旧坐标上,有整整 0.4 秒的背击窗口——伤害加成、暴击率都可以在这里放大。表现上背击要打两个飘字:一个伤害数字,一个"背击"小标,位置错开半秒出现,先数字后标签,玩家才看得清因果。
还有个隐蔽坑:换位瞬间两个单位的渲染层级。两人坐标互换后,脚底排序没刷新的话会出现人压着怪又像怪压着人的鬼影帧。幂尔框架的排序是按 Y 坐标自动算的,但同一帧内连续 SetActorPos 要确认排序刷新时机,实测最稳的做法是换位当帧把双方 alpha 压到 60,下一帧再恢复,排序错乱被半透明完美遮住——这招在竞技场实测没有一帧穿帮。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 heat = heat + 1; if heat = 3 then rest = 1.6 ——两行管刀温的代码…
【游戏功能】 兄弟俩打一只狼,哥哥攒了三层劲自己放,一层加二十五;弟弟站在旁边干瞪眼——直到有人把劲递了过去:同样的三层,过…
【游戏功能】 有篇纠错单写得像小说:同一只狼,有人打它半小时血线稳如老狗,有人三分钟放倒——排查到最后发现,会打的那个从头到…
【游戏功能】 追着你满场跑的狼怪,为什么绕过一根石柱就懵在原地?脱影的答案藏在柱子背后:视线被石柱掐断一秒二,它脑子里"你"…
【游戏功能】 巡查群里有人喊邪门:同一套连招,昨天刀刀见血,今天刀刀被挡——查录像看到第三遍才看懂:狼怪学会了。他的出刀间隔…
【游戏功能】 if hand == last then acid = acid + 1 ——一行数手的判定,攒出了换手全部的…