【游戏功能】
隐蔽报错引入:一个很隐蔽的错——金鱼跃得挺好看,落点却总在怪身后一截,回回砸空。查了半天,抛物线是拿起点到终点直线插值匀速算的,顶点该有的减速一概没算,鱼是匀速飘过去的,落点自然差出一截。这篇把跃龙纹整套写法重写成篇:破土、跃起、翻身、尾砸,一段一段照抄能跑。
一、效果演示
演武场是一处跃龙潭边,地上几汪水洼映着光,怪走进来站定。点「跃龙!」——一条金鳞鱼从侠客脚前的水洼里破土腾起,拖着一道金光划出抛物线,半空里一个翻身穿到怪头顶,尾杆砸下二十四点,水花四溅。破土、腾跃、翻身、尾砸四拍看得分明,十秒一跃。
flowchart TD
A[跃龙!] --> B[金鱼破土]
B --> C[抛物线腾跃]
C --> D[半空翻身]
D --> E{到怪头顶了吗}
E -- 没有 --> C
E -- 到了 --> F[尾砸 二十四点]
F --> G[水花四溅 十秒再跃]
fx-crest-fishleap
二、底层原理
跃龙纹的机关是「抛物线是真抛」——金鱼从水洼到怪头这段路,走的是一条顶点在半空的弧线:前半程越跃越慢、后半程越坠越快,翻身就卡在慢下来的顶点。早年那单「回回砸在怪身后」的错案,就是把弧线当直线匀速插值——鱼是匀速飘过去的,节奏全错。这条机关的要害在「弧线的两头都要对」:起点钉在水洼上,终点钉在怪的当刻头顶,中间的弧高决定翻身的那一拍。落点是活的,鱼就要追着活位子飞。幂尔框架这边,鱼只放一个归一化的行程量,横纵坐标都从这一个量上派生,翻身角也从它上面转。
这套玩法的代码量不到八十行,难的不是腾跃那一下,难的是弧线是真弧——顶点的慢、坠落的快,差一截落点就差一截。
金鱼的翻身给了「跃」字一个顶点:腾跃渐慢、翻身穿到头顶、尾砸轰落,弧线的快慢全写在鱼的转角上——看得见的弧,才信得过的落点。
再补一句关于水花的话——破土那一下溅的是泥,落定那一下溅的是光:起跳时泥点子往下掉,砸中时金色的水花往上炸,两头的溅法不一样,鱼这一趟「从水里来、回光里去」的路数就齐了。要是两头一个样,跃龙就成了抛石头的。
金鱼这一路还有一段值得说——腾跃的半途它会贴着怪的头侧游一小段:不直接砸,先在头顶绕小半圈,把尾杆蓄到朝下,再砸。这一段绕圈给了玩家半拍预判:绕圈的半径多大、蓄了多久,尾巴就有多重。看得见的蓄势,接得住的尾砸,两头都对得上,这一跃才算完整。
落定之后的水洼还有一层余韵:被砸中的那汪水会亮上两秒,光从鱼落点往四边漾开两圈才平——水里留下的这一圈光,替这一跃记了个名。
三、核心代码:完整模块(上·骨架)
-- @file crest-fishleap.lua
-- 跃龙纹:金鳞破土跃龙门,翻身一记尾砸
local M = {}
local CONST = { AUTOINC_BASE = 1214400 }
local _autoInc = 0
local function ShowTip(msg) if msg and msg ~= "" then SL:ShowSystemTips(msg) end end
local function GenID() _autoInc = _autoInc + 1 return CONST.AUTOINC_BASE + _autoInc end
function M.Ready() return true end
四、核心代码:完整模块(下·推进与卸载)
-- 每拍推进: 弧线腾跃
if not _ticker then
_ticker = SL:Schedule(function(dt)
if not _on then return end
_k = math.min(1, _k + dt / 0.95)
_x = _sx + (_tx - _sx) * _k
_y = _gy - math.sin(_k * 3.1416) * 150
_rot = -0.9 + _k * 2.4
if _k >= 1 then
_on = false
ShowTip("尾砸——二十四点!")
end
end, 0.02)
end
SL:ScheduleOnce(function()
SL:BindDebugButton("跃龙!", function()
if _on then ShowTip("鱼还在跃") return end
_on = true _k = 0
_sx = _px + 40 _tx = _mx - 8 _gy = _my
ShowTip("跃龙——金鳞破土!")
end)
end, 1.0)
function M.Unload() _on = false _k = 0 end
return M
五、机制问答
问:鱼为什么回回砸偏?
答:那是旧账——弧线当直线匀速插值,顶点的减速没算,落点差一截。
问:翻身卡在哪一拍?
答:卡在弧线顶点——腾跃渐慢到头的那一下,翻身穿向怪头。
问:落点是死的吗?
答:是活的——终点钉在怪的当刻头顶,怪挪鱼追。
问:尾砸多重?
答:二十四点——整轮唯一一笔记账,前面全是戏。
问:十秒一跃管什么?
答:跃龙的回气。
六、调参与实战怎么用
参数三个量——弧高、单跳伤害、回气。半场高、二十四点、十秒是一组甜点位:顶点翻身看得从容,尾砸的分量对得起十秒的等。想调花些把弧高抬到近顶——鱼跃出画面上沿再砸下来,戏更足,落点的判断也更刁。
补一句设计层面的话——这六手有改天时的、有改地利的、有改人和的:食月改天时、跃龙借地利、鬼打墙乱它的人和、吞剑攒自己的势、神速提自己的拍、掷卦赌自己的运——天时地利人和势拍运,七样里占六样,玩家配纹配的就是这几样的组合。
补一句维护层面的话——这轮借的东西都要还:月亮要还、朝向要还、间隔要还、倍率要清,卸载口里一样一样归位。暗表撤了还留半截黑、催速停了间隔是负的、卦清了倍率还挂着,都是没还干净的账。
补一句工程层面的话——凡是要「人人来读」的场氛和倍率,都走查询口:暗走浓度口、晕走圈角口、卦走倍率口,读的人认口不认变量——哪天黑换了月亮来管,读的人一行不用动。
这一手在实战里的分量在「等」字:食月等它挥空、跃龙等它站定、鬼打墙等它入圈、吞剑等三拍走满、掷卦等正面向上——会等的人,纹纹都在点子上;不会等的人,月亮吞了也白吞。
反馈要成对:暗场配倒计时、鱼影配弧线、圈影配秒数、白光配三拍、残影配秒表、铜板配倍字——演出给一半,明账给一半,玩家两头都看得见。
最后说实战:这轮的拍点全在天上和风里——月亮缺几分明、鱼翻到几层高、铜板转到第几枚,都是掐得出的点;掐得住的赌不叫赌,叫算账。
写完留一句给做抛射系的同学:弧线是真弧——顶点的慢和坠落的快都在线上,匀速插值的鱼永远砸不中活物。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
接手二开的兄弟几乎都撞过同一堵墙:玩家嫌走路"一格一格像机器人",老板拍板要"丝滑移动",改服务端速度?不对。改客户端动画帧…
【游戏功能】 先看一个熟场面:法师的火球特效挂在怪的脚后跟上,明明技能说明写着"焚烧其面",火星子却在地上打滚。群里有位策划…
【游戏功能】 上周有个开服的老板在群里发了一段录屏:他的战士明明刀刀都砍中了,观众却一片"这刀挥空了吧"。他原话是"判定日志…
【游戏功能】 先说结论放在开头:怪的皮一会儿绿一会儿红,不是美术换了几套贴图,是染色系统在怪身上盖了一层"色镜"。开服群里有…
前两天群里有个架设的朋友问了个需求:中毒的人要变绿、每两秒掉一次血、毒还能叠五层,问是不是要在服务端把整套状态机重写。我说你…
【游戏功能】 先抛一个坑:五口钟一模一样大,为什么一口比一口疼?先后次序动不得吗?倒过来敲会怎样?这篇把编钟纹整套写法拆开:…