【游戏功能】
测试服飘过一条离谱的 bug 报告:剑气追着狼怪跑了半圈、绕过两棵树、穿过一面墙——最后打中了旁边一棵树。玩家截图调侃"这剑气比导航还聪明"。根因是追踪系数设得太高,剑气变成了"永远打得到"的必然命中。今天讲剑气追魂的表现,看追踪弹道的灵敏度怎么调。
一、出手、弯曲、命中三段追踪
剑气追魂的三段追踪。出手段:剑气从人物指尖出发,初速度朝向狼怪的当前位置——出手的朝向是直的,弯曲是在飞行中渐进发生的。弯曲段:每帧根据狼怪的实时位置微调速度向量的角度——弯曲的灵敏度就是每帧允许的最大转向角:灵敏度高每帧转大弯、灵敏度低弯得慢。命中段:剑气与狼怪的距离小于命中半径时触发命中——弹到就是弹到,剑气消失、伤害结算。三段的核心参数是"弯曲角":弯曲角太大剑气变成永远追得上的必中弹,太小变成一条弧线直飞——灵敏度就是弯曲角的上限。
完整演示在这,调灵敏度看追踪弯曲:
fx-swordchase
二、幂尔框架实现:速度向量弯曲与命中判定
追踪弹道用速度向量朝目标渐进旋转:
local SwordChase = {}
local KEY = { SPD = 280, TURN_RATE = 5 }
local qi = nil
function SC.Cast(self_, target)
qi = {
x = SL:GetValue("actorX", self_) + 24,
y = SL:GetValue("actorY", self_) - 58,
vx = 280, vy = -60,
trail = {}, target = target
}
SL:PlayActorAct(self_, "cast")
SL:Schedule(function(dt)
if not qi then SL:UnSchedule("scRun") return end
-- 追踪: 速度向量朝目标渐进旋转
local dx = SL:GetValue("actorX", qi.target) - qi.x
local dy = SL:GetValue("actorY", qi.target) - 58 - qi.y
local wantA = math.atan2(dy, dx)
local curA = math.atan2(qi.vy, qi.vx)
local diff = wantA - curA
-- 归一化到 -PI 到 PI
while diff > math.pi do diff = diff - 2 * math.pi end
while diff < -math.pi do diff = diff + 2 * math.pi end
local maxTurn = KEY.TURN_RATE * dt
local turn = math.max(-maxTurn, math.min(maxTurn, diff))
local newA = curA + turn
qi.vx = math.cos(newA) * KEY.SPD
qi.vy = math.sin(newA) * KEY.SPD
qi.x = qi.x + qi.vx * dt
qi.y = qi.y + qi.vy * dt
-- 拖尾
qi.trail[#qi.trail + 1] = { x = qi.x, y = qi.y }
if #qi.trail > 8 then table.remove(qi.trail, 1) end
-- 命中判定
local tx = SL:GetValue("actorX", qi.target)
local ty = SL:GetValue("actorY", qi.target) - 58
local d = math.sqrt((qi.x - tx) ^ 2 + (qi.y - ty) ^ 2)
if d < 26 then
SL:UnSchedule("scRun")
SL:PlayFxAt("qi_hit", tx, ty)
SL:DeductHp(qi.target, 34)
SL:ShowHitNum(qi.target, 34, "chase_hit")
SL:PlayActorAct(qi.target, "stuck")
qi = nil
end
end, 0.016, "scRun")
end
return SC
追踪的核心是"渐进旋转"而不是"直接指向"——直接指向就是必中弹,渐进旋转才有"追"的感觉。
三、灵敏度与不可预测的狼怪
灵敏度的甜点区在五弧度每秒:低于三永远追不上在跑的狼怪,高于八连蛇形走位都锁得住——五到七是"追得上但需要两秒"的甜点区。狼怪的躲避走位也可以有策略:蛇形跑位让剑气的弯曲跟不上、直线冲刺让剑气一追到底——躲避走位的丰富度决定追踪弹道的观赏性。最后,剑气的拖尾尾巴用渐变透明度画——尾巴的长度跟转速成正比:转得快尾巴长,转得慢尾巴短——尾巴的长度就是灵敏度的视觉量化。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 if _shadowT 0 then spd = noShadow and 12 or 24 end ——一行…
【游戏功能】 魂卫的全机制就一句:杀掉小怪化一盏魂火跟着你走,每盏魂火两秒自动劈最近的大怪一口八点,至多三盏——「引魂!」按…
【游戏功能】 一道咒飞过来,硬吃是四秒里一秒十的钝疼——有没有第三条路?纸人替灾给的就是第三条路:贴一个纸人在身后,八秒里头…
【游戏功能】 挨打还能赚钱?水镜式的答案是:挨的刀七成存进镜里不扣血、三成照常疼,六秒后点「还镜」,存量乘一点五放成水炮——…
【游戏功能】 if _mirrorT 0 then SL:TipAboveMe("免疫") return end ——一道写…
【游戏功能】 远近战的矛盾怎么解?远战的答案是把怪挡在射程外,近战的答案是把人拖进射程内——缩地阵给的第三个答案最蛮横:圈只…