【游戏功能】
一、一行代码拆解
caster.hp = math.min(caster.maxHp, caster.hp + dmg * rate)——噬血术的数值侧就这一行:造成的伤害乘个比例加回自己。但玩家看到的噬血术不是这一行,是一条红色的河:血珠从狼怪身上被抽出来,逆着一条上拱的弧线飞进法师掌心,怪的血条往下走、人的血条往上走,两条血条在同一秒反向移动。数值是瞬时的,表现给了它三秒钟的仪式——噬血术的全部高级感,就是把一次减法演成了一场献祭。
二、机制原理:双条反向与血珠回流
噬血的表现由两条线构成。血条线:施法持续的每一帧,怪掉血、人回血,两条血条严格按同一帧率反向滑动——回血量对应吸血比例,玩家看着自己的血条涨多快就能估出比例是多少,表现反向帮助玩家读数值。粒子线:血珠从怪身上的随机点出生,沿着一条上拱的贝塞尔弧线飞向法师掌心,弧线的拱顶给"抽"这个动作画出了轨迹的呼吸感;血珠到掌心处有一个接收光点在搏动,吞最后一颗血珠的瞬间回血数字弹出。持续结束,法师收手法术动作,狼怪踉跄——一场完整的抽取叙事。
fx-drain
三、正确写法:血珠回流(引擎侧)
-- 贝塞尔: 怪 -> 拱顶 -> 掌心
local function DrainBezier(p, from, to)
local cx, cy = (from.x + to.x) / 2, math.min(from.y, to.y) - 86
local u = 1 - p
return {
x = u * u * from.x + 2 * u * p * cx + p * p * to.x,
y = u * u * from.y + 2 * u * p * cy + p * p * to.y
}
end
function lifeDrain:Update(dt)
if self._left <= 0 then return end
self._left = self._left - dt
local tickDmg = 6 * dt
self._target.hp = math.max(0, self._target.hp - tickDmg)
self._caster.hp = math.min(self._caster.maxHp,
self._caster.hp + tickDmg * self._rate * 2) -- 数值一行
if math.random() < dt * 26 then -- 生成血珠
local from = { x = self._target:GetX() + (math.random() - 0.5) * 36,
y = self._target:GetY() - 46 - math.random() * 20 }
SpawnDrop(from, self._caster:GetPalmPos(), 0.55 + math.random() * 0.4)
end
end
function lifeDrain:DrawDrop(drop, dt)
drop.p = drop.p + drop.spd * dt
local pos = DrainBezier(math.min(1, drop.p), drop.from, drop.to)
DrawGlowOrb(pos.x, pos.y, 4, COLOR_BLOOD) -- 渐变红球
end
四、四个必须钉死的细节
五、心法:把数值的变化画成物质的流动
噬血术的范式可以套一整族技能:吸蓝画蓝珠、偷取金币画铜板、转移仇恨画锁链——凡是从 A 扣到 B 加的数值,都值得画成从 A 飞向 B 的粒子流。玩家对"数字变化"的感知是弱的,对"东西飞过去"的感知是强的,粒子流就是数值变化的可视化翻译。写这类技能先写那行减加法,再问自己:这笔账,用什么运?
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 无极真气的全部开关就这一行:给角色挂一层六秒的金气光环。但光环底下压着三条规矩——窗口期、三刀递增、过期作废。…
【游戏功能】 气功波为什么不掉血?战士一掌把狼怪推出去三步开外,狼怪头顶连个伤害数字都没有——新手第一反应是"技能没生效",…
【游戏功能】 法术共振报错刷了半屏: bolt target moved: anchor stale ——第一道雷落下到第二…
【游戏功能】 上周团里法师连放七个玄冰刺,怪的血没掉多少,指挥却在喊"完美控场"——直到有人回放录像才发现,狼怪绕着冰圈外圈…
【游戏功能】 彻地钉整套表现的钥匙就这一行:钉子不是打在狼怪身上,是从 地里的固定点 窜出来。今天顺着这行拆彻地钉——为什么…
【游戏功能】 道士的符为什么追着人咬?你明明看着它出手时冲左,狼怪往右一挪,符在半空拐了个弯还是贴上它的胸口——这不是弹道,…