CHUAN2 DEV ENGINE
996 正版授权研发中心 · 360 授权合作教学中心 · 抖音传奇直播合作授权 · 快手推广运营商授权
OFFICIAL LICENSED ACADEMY 查验官方授权证书 →
// 威海旷世互娱教学基地 · 技术文章
进阶实战游戏功能996引擎

蛙跳痕纹:蛙印三秒一跳,跳到谁头上谁挨重刀

2026-10-02 00:24 作者:996 技术组 996引擎Lua教程传奇脚本进阶实战游戏功能996引擎

【游戏功能】

上一版留了个哭笑不得的隐蔽报错:蛙印跳到了一具尸体上——蛙印的跳迁判定没查存活,第一只怪倒下的那一拍,蛙印照跳,落在了尸体的头顶上,从此悬在半空再没挪过窝。修完把存活校验补进跳迁的第一行,顺手把这套机制写成篇。蛙跳纹的账是一只不安分的印:它落在一只怪头上,三秒一跳,跳到谁头上谁挨你的重刀——你的刀跟着印走,印跟着秒表走,两边都对上了才有重刀。这篇把整改后的整套模块拆开:配置表、蛙印构件、跳迁判定、加重通道、定时器、调试按钮,一段一段照抄能跑。

一、效果演示:蛙印三秒一跳,跳到谁头上谁挨重刀

演示场两只怪一左一右。点「蛙印!」:一枚青绿色的印落在左边那只脚边——十二秒蛙印期。你的刀砍向印着的它:十五点的重刀;砍向没印的另一只:十二点的平常刀。三秒一到,蛙印"呱"地一声跳走——青光从左边荡到右边,印换了主。你的刀也得跟着换目标:印在哪头,刀往哪头落,慢半拍砍的就是平常价。演示里试两笔账:追着印砍的总账和盯着一只死磕的总账——蛙印三秒一跳,死磕的人大半时间在砍平常价。蛙跳纹教的是追印:不是你的刀快不快,是你的眼跟不跟得上。

demo
 fx-frogleap

二、底层原理:一枚蛙印构件加一次跳迁判定

模块的机关是一对搭档。蛙印构件:开纹那一拍一枚印落在第一只怪脚边——印认的是"这一窝"里的脚,三秒一班,到点就跳。跳迁判定:跳迁的那一拍先查在册怪物的存活——活着才接印,死了跳过,这是那场"印落尸体"报错的正解;跳迁落定,加重通道跟着印换主。和标记类机制的分野在"蛙印是活的不认主":普通标记烙死在一只怪身上,蛙印三秒换一户——你的刀要吃重价,就得跟上一只不停挪窝的印。

跳迁为什么定时而不看死活?看死活的版本印赖在活怪头上不动,玩家盯着一只往死里打就行;定时跳的版本印自己做主换户,玩家的目标选择被印牵着走——重刀的价要用眼力去领。

三、核心代码:完整模块(上·骨架)

lua
-- @file FrogLeap.lua
-- 蛙跳痕纹 —— 蛙印三秒一跳,跳到谁头上谁挨重刀

local FrogLeap = {}

local CONST = {
    CREST_LIFE    = 12.0,
    CREST_CD      = 4.0,
    HOP_LIFE      = 3.0,
    MARK_HIT      = 15,
    BASE_HIT      = 12,

    COLOR_LEAP    = "#88b858",
    COLOR_DEEP    = "#384818",
    COLOR_GHOST   = "#d0f0b0",

    ZORDER_LEAP   = 133,
    ZORDER_FX     = 135,
    AUTOINC_BASE  = 1126000,
}

local _crestT    = 0
local _cdLeft    = 0
local _hopT      = 0
local _onFirst   = true
local _ledger    = {}
local _crestFx   = nil
local _scheduler = nil
local _autoInc   = 0

local function GenID(prefix)
    _autoInc = _autoInc + 1
    return string.format("%s_%d", prefix or "FGL",
        CONST.AUTOINC_BASE + _autoInc)
end

local function GetActorPos(id)
    if not id then return nil end
    local x = SL:GetValue("ACTOR_POSITION_X", id)
    local y = SL:GetValue("ACTOR_POSITION_Y", id)
    if not x or not y then return nil end
    return { x = x, y = y }
end

local function SafeRemove(node)
    if node and not GUI:Widget_IsNull(node) then
        GUI:removeFromParent(node)
    end
end

local function ShowTip(msg)
    if msg and msg ~= "" then SL:ShowSystemTips(msg) end
end

-- 跳迁判定:先查存活,死了跳过
function FrogLeap.HopTarget()
    for _, tid in ipairs(FrogLeap.InFlock()) do
        if SL:GetValue("ACTOR_ALIVE", tid) then
            return tid
        end
    end
    return nil
end

四、核心代码:完整模块(下·跳迁与加重通道)

lua
-- 跳迁:三秒一班,青光荡过去印换主
local function DoHop()
    local next = FrogLeap.HopTarget()
    if not next then
        ShowTip("印没处跳——全趴下了")
        return
    end
    _onFirst = not _onFirst
    SL:PlayHopOutFx(next)
    SL:TipAbove(next, "蛙印")
    ShowTip("蛙印跳了——挪到另一只头上")
end

-- 加重通道:印在谁头上,谁的刀走重档
SL:RegisterLUAEvent(LUA_EVENT_MELEE_DAMAGE, "FGL_Amp", function(tid)
    if _crestT <= 0 or not tid then return 0 end
    local marked = (_onFirst and tid == _ledger.first)
        or (not _onFirst and tid == _ledger.second)
    if marked then
        return CONST.MARK_HIT - CONST.BASE_HIT
    end
    return 0
end)

function FrogLeap.Cast()
    if _cdLeft > 0 or _crestT > 0 then return end
    local tid = SL:GetValue("MARK_TARGET_ID")
    if not tid then return end
    local other = SL:FindNearMonster(tid, 300)
    if not other then
        ShowTip("就一只怪——印跳不起来")
        return
    end
    _cdLeft = CONST.CREST_CD
    _crestT = CONST.CREST_LIFE
    _hopT = CONST.HOP_LIFE
    _onFirst = true
    _ledger = { first = tid, second = other }
    SafeRemove(_crestFx)
    _crestFx = GUI:Layout_Create(GUI:Attach_Scene(),
        GenID("Mark"), 0, 0, 0, 0, false)
    GUI:setLocalZOrder(_crestFx, CONST.ZORDER_LEAP)
    SL:PlayMarkUpFx(tid)
    ShowTip("蛙印落在左边头上了——三秒一跳,跳谁谁挨重刀")
end

-- 定时器:纹成倒计时与跳迁钟驱动
if not _scheduler then
    _scheduler = SL:Schedule(function(dt)
        _cdLeft = math.max(0, _cdLeft - dt)
        if _crestT > 0 then
            _crestT = _crestT - dt
            _hopT = _hopT - dt
            if _hopT <= 0 then
                _hopT = CONST.HOP_LIFE
                DoHop()
            end
            if _crestT <= 0 then
                SafeRemove(_crestFx)
                ShowTip("蛙印散了——谁也不挨了")
            end
        end
    end, 0.02)
end

SL:ScheduleOnce(function()
    SL:BindDebugButton("蛙印", function()
        FrogLeap.Cast()
    end)
    ShowTip("技能已加载: 蛙跳纹 (调试按钮触发)")
end, 1.0)

function FrogLeap.Unload()
    if _scheduler then SL:Unschedule(_scheduler) end
    SL:UnregisterLUAEvent(LUA_EVENT_MELEE_DAMAGE, "FGL_Amp")
    SafeRemove(_crestFx)
    _crestT = 0
    _ledger = {}
end

return FrogLeap

五、机制问答

问:印着的怪死了蛙印跳谁?
答:跳另一只——跳迁先查存活,死的那只自动出册,活着的接印接着挨,账不停摆。

问:两只都活着但一只出了很远呢?
答:照跳——蛙印认册不认距离,跳到天边的怪头上它也接,就是你的刀够不着,白印。

问:追印的半路上印跳了怎么办?
答:自认倒霉——落刀那拍印不在,就是平常价,追印的手艺练的就是这一拍的预判。

问:蛙印能手动指定落点吗?
答:不能——印是活的自己挑户,玩家只能挑刀,这也是它叫蛙不叫靶的原因。

问:纹收了印还在跳吗?
答:不跳了——印随纹散,最后一跳跳到哪算哪,下一窗重新从第一户落。

六、调参指南与商业服怎么用

第四笔是跳迁的存活校验:先查存活再落印是那场尸体报错的正解——校验漏一行,印就成了悬在半空的摆设,跳迁的第一行永远是活口检查。第三笔是班次的长短:三秒一班对追刀的节奏是"追得上但追不闲"的班表——班次太短印成走马灯,太长另一只怪白站,三秒刚好是收刀换目标的一次喘息。第二笔是加重的份量:十五对十二是两成半的追印价——价太低没人追印,太高变成必须追的死任务,两成半刚好是"勤快人有糖"的位置。第一笔是印的可读:印着的怪脚下青环常亮、跳迁时青光荡过去——印在哪一目了然,追印的人才有的放矢。常见坑三个:跳迁判定没查存活印落尸体;印环跟画在怪被击退后飘到了半空;两怪死亡后跳迁钟空转刷屏。

商业服里蛙跳纹是"跳涧派"的活计:别人的印记守株待兔,他的印记自己会跑——商城里蛙印的样式做成品级,泥印、青玉印、金蟾印,那枚三秒一挪窝的青绿印就是跳涧派的活招牌。运营落地还有两笔:一段是追印教学——教一句"印跳你别慌,青光荡到哪刀就到哪",流派第一课是眼力;一段是追印榜——按追印期重刀的命中总数排名,印追得最紧的人有碑。变体做成三户蛙印:三只怪轮流接印——从两户到三户,跳涧派的印越跳越远。这一篇的演示和整套模块照抄能跑,改的就是 CONST 那张表。

写完留一句给做游走系的同学:蛙跳纹卖的是"印会自己挪窝"——那枚三秒一跳的青绿印和跟着它跑的重刀,是把目标选择变成追逐游戏的一枚活印。

作者履历与出处

本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。

← 返回文章地图返回研学路径

幂尔框架 · 实战干货 · 接口调用

LATEST ARTICLES

全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →

进阶实战游戏功能

Lua自动炮台:架一个自动索敌开火

【语法算法】 上一版的炮台索敌逻辑有个隐蔽报错:炮台永远打同一个怪——即使那只怪已经死了,索敌的游标也不挪窝。追到底索敌的游…

2026-10-02 04:50 996 技术组
进阶实战游戏功能

Lua元素转换:火伤转冰伤附带减速

【语法算法】 先抛一个坑:打不完的火系怪怎么办?火抗怪火打不动,换冰系技能要切装备要换面板——切完黄花菜都凉了。元素转换的答…

2026-10-02 04:50 996 技术组
进阶实战游戏功能

Lua连锁引燃:一个着火引燃下一个

【语法算法】 上个月的事故复盘会上有个数字被念了三遍:四成——策划写的是"同伴陪疼四成",代码落下去成了"陪疼四十点",两只…

2026-10-02 04:50 996 技术组
进阶实战游戏功能

Lua弹射地垫:踩上去弹飞到空中

【语法算法】 单行代码拆解:弹射初速=-420——弹射的全部动力就这一行的负初速。负号朝上、四百二十是弹射的初速大小——踩上…

2026-10-02 04:50 996 技术组
进阶实战游戏功能

Lua时间减缓:流速减半的局部时差

【语法算法】 上一版的减速类模块全按"乘以零点五"来写,帧率无关的版本照搬了这套写法——结果高帧率机上减速效果好,低帧率机上…

2026-10-02 04:50 996 技术组
进阶实战游戏功能

Lua引力球:丢出去把怪吸过来

【语法算法】 先抛一个坑:怎么把散在四处的怪聚到一起打?逐个拉是笨办法,一个范围技又只能打一片——引力球的答案是一个会动的吸…

2026-10-02 04:50 996 技术组