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

霜镜:架起霜镜,弹道冻着原路画回

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

【游戏功能】

镜墙为什么只能反弹不能冰冻?霜镜偏要双管齐下:弹道撞上霜镜原路画回去——回程的弹道还带着冰冻效果,扎中怪怪也冻一秒。这篇的核心代码照引擎技能脚本的全规格写:配置表、霜镜构件、弹道冰冻反转、定时器、调试按钮。

一、效果演示:弹道撞镜,冻着画回去

演示场点「霜镜!」:一面青白色的霜镜在两座之间拔地而起——大怪的弹道射过来,撞上霜镜的瞬间白光一闪、弹道原路折返——回程的弹道带着冰冻效果扎中大怪,大怪冻一秒。三秒镜墙到期化掉——弹道恢复实价。演示里看两处:弹道撞镜的那一帧白光一闪;回程的弹道颜色从红变蓝——颜色的变就是冰冻的信号。

demo
 fx-frostmirror

二、底层原理:一道纵向拦截带加一次冰冻弹道反转

模块的机关是一对搭档。拦截带:霜镜是一条纵向的区间带,弹道的横坐标穿过带的横坐标时触发反转——反转的弹道额外挂冰冻标记。冰冻标记:回程弹扎中怪时怪冻一秒——冻的弹比不冻的弹多一层控制。和弹反镜的分野:弹反镜是半秒的人工掐时机镜面,霜镜是三秒的全自动镜墙——人工掐时机和全自动立墙是两种完全不同的操作感。

镜墙的位置为什么架在双方中间?架在怪脚下的版本,怪的近战挥击也能被"反弹"——可近战不是弹道,撞不上拦截带,镜墙就白架了;架在玩家脚下的版本,怪贴脸的时候弹道出膛就撞墙——反回去的弹道飞行距离太短,冰冻还没贴上怪就化了。正中间的距离让回程弹有足够的飞行时间把冰冻送到位,也让"架镜"这个动作有了站位学的味道:镜架在哪,比镜什么时候架更要紧。

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

lua
-- @file FrostMirror.lua
-- 霜镜 —— 架起霜镜,弹道冻住原路画回

local FrostMirror = {}

local CONST = {
    MIRROR_LIFE   = 3.0,
    MIRROR_CD     = 6.0,
    FREEZE_DUR    = 1.0,
    REFLECT_DMG   = 22,
    BOLT_SPEED    = 250,

    COLOR_MIRROR  = "#8ec8e8",
    COLOR_DEEP    = "#1a4a6e",
    COLOR_GHOST   = "#d8f0fa",

    ZORDER_MIRROR = 127,
    ZORDER_FX     = 135,
    AUTOINC_BASE  = 982000,
}

local _mirrorT   = 0
local _mirrorX   = 0
local _cdLeft    = 0
local _bolts     = {}
local _scheduler = nil
local _autoInc   = 0

local function GenID(prefix)
    _autoInc = _autoInc + 1
    return string.format("%s_%d", prefix or "FRM",
        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

local function CreateMirrorNode(x)
    local node = GUI:Layout_Create(GUI:Attach_SceneF(),
        GenID("Mirror"), x, 0, 0, 0, false)
    GUI:setLocalZOrder(node, CONST.ZORDER_MIRROR)
    for row = 0, 18 do
        GUI:DrawLine_Create(node, "col_" .. row, 0, 0, 16,
            -8, -row * 4.2, 8, -row * 4.2,
            row % 2 == 0 and CONST.COLOR_MIRROR
                or CONST.COLOR_DEEP, 210)
    end
    return node
end

四、核心代码:完整模块(下·定时器与冰冻弹道反转)

lua
-- 立镜
function FrostMirror.Cast()
    if _cdLeft > 0 or _mirrorT > 0 then return end
    _cdLeft = CONST.MIRROR_CD
    _mirrorT = CONST.MIRROR_LIFE
    local mp = GetActorPos(SL:GetValue("USER_ID"))
    local tp = GetActorPos(SL:GetValue("MARK_TARGET_ID"))
    if mp and tp then
        _mirrorX = (mp.x + tp.x) / 2
        CreateMirrorNode(_mirrorX)
        ShowTip("霜镜立了——三秒,弹道撞上就冻着画回去")
    end
end

-- 弹道推进与冰冻反转
local function Bolt_Update(b, dt)
    b.x = b.x + b.vx * dt
    if not b.back and _mirrorT > 0
        and math.abs(b.x - _mirrorX) <= 14 then
        b.vx = -b.vx
        b.back = true
        b.frozen = true
        SL:PlayReflectFx(b.x, b.y)
        ShowTip("弹道冻住画回去了——还带着冰冻效果")
        return true
    end
    if b.back then
        local tp = GetActorPos(SL:GetValue("MARK_TARGET_ID"))
        if tp and math.abs(b.x - tp.x) < 20 then
            SL:ActorHurt(SL:GetValue("MARK_TARGET_ID"),
                CONST.REFLECT_DMG)
            SL:FreezeActor(SL:GetValue("MARK_TARGET_ID"),
                CONST.FREEZE_DUR)
            SL:TipAbove(SL:GetValue("MARK_TARGET_ID"),
                "-" .. CONST.REFLECT_DMG .. " 冻")
            return false
        end
    end
    return b.x > -20 and b.x < 700
end

if not _scheduler then
    _scheduler = SL:Schedule(function(dt)
        _cdLeft = math.max(0, _cdLeft - dt)
        if _mirrorT > 0 then
            _mirrorT = _mirrorT - dt
            if _mirrorT <= 0 then
                ShowTip("镜墙化了——三秒的弹道反制结束了")
            end
        end
        for i = #_bolts, 1, -1 do
            if not Bolt_Update(_bolts[i], dt) then
                table.remove(_bolts, i)
            end
        end
    end, 0.02)
end

return FrostMirror

五、机制问答:三个高频追问

问:两道弹道先后撞镜怎么算?

答:各回各的——拦截带对每道弹道独立判定,先撞的先回,撞了三道就回三道,镜墙不数数量只管位置。

问:回程弹能被第二面镜子再反吗?

答:能,但没必要——镜墙冷却六秒,立起第二面的时候第一面早化了,双镜联立是演出不是战术。

问:怪的弹道是追踪的怎么办?

答:追踪弹撞镜后追踪目标换成怪自己——原路画回去的是弹道,追踪的锁定也一并奉还,这是冰法流派最得意的一帧。

问:镜墙能挡自己的弹道吗?

答:能——自己的弹道撞自己的镜子照样画回来,扎中怪照冻,冰法流派管这叫借力打力,设计上叫一视同仁。

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

调参三笔账。镜墙三秒对怪两秒一射是"一到两发被反"的窗口——窗口太长怪的输出全变自伤,太短来不及反一发。回弹二十二对原弹二十二是一比一的诚实——回弹加倍的版本镜墙成了无敌盾,回弹减半它就不疼了。冰冻一秒是回程弹的附加值——冰冻的弹比不冻的弹多一层控制,控制的附加值就是霜镜比弹反镜多出来的那一层。常见坑三个:弹道的反转没有把方向标记置真,同一发弹来回穿镜无限反弹;镜墙化掉的瞬间还有回程弹在飞,回程弹被提前清表;墙的纵高不够弹道从头顶飞过,拦了个寂寞。

第四笔是镜墙的渐隐:到期前最后一秒透明度线性衰减——镜子一下子消失会吓玩家一跳,渐隐半秒就是给玩家的读条提示,特效的礼貌也是手感的一部分。

商业服里霜镜是"冰法流派"的颜值顶配:镜墙的材质做成品级——水镜、冰镜、琉璃镜,弹道画回去的那一道白光就是流派的名片。比武场里它是弹道职业的照妖镜:远程的每一发都在教对手"打有霜镜的人要先想清楚"。变体做成镜面蓄能:反射的弹道不消失而是存进镜面,三秒后全部一次性射回——攒弹的镜墙是防御转进攻的终极形态。这一篇的演示和整套模块照抄能跑,改的就是 CONST 那张表。

运营落地还有两笔:一段是比武场的禁选公告——霜镜在弹道职业对局里的出场率过高时,赛事公告栏要提前一周写明禁选规则,公平性靠透明维持;一段是镜墙的耐久展示——镜子被弹道打会有裂纹特效,裂纹的层数就是还能反几发的暗示,会看裂纹的玩家和不会看的,胜率差着一截。

写完留一句给做反射系的同学:霜镜卖的是"原样奉还还要加料"——不加不减不变形,它的弹道就是它的罪证,霜镜只是替天把弹道冻了回去。

作者履历与出处

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

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

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

LATEST ARTICLES

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

进阶实战游戏功能

逆时步:三秒前站在哪,一步回到哪

【游戏功能】 排查一个报错走到深夜:玩家申诉"人物瞬移",录像里人也确实是凭空跳了半张地图——坐标链上多出来一次没有来由的写…

2026-10-01 11:23 996 技术组
进阶实战游戏功能

蛮牛劲:一勾锁它拖下马,硬生生拽到跟前

【游戏功能】 后山出过一单笑话:一个远程怪卡在断桥那头射了全队十分钟,走不过去、勾不着、弹道够不到——最后是位玩钩子的老哥一…

2026-10-01 11:23 996 技术组
进阶实战游戏功能

迟滞咒:咒它出手慢一倍,节奏全乱招招落空

【游戏功能】 M.at = M.at 2 —— 就这一行,让一只盯了三天的速攻怪从"碰不得"变成"随便打"。怪的可怕从来不在…

2026-10-01 11:22 996 技术组
进阶实战游戏功能

叠劲:连打同门一刀重一刀,断了就得从头数

【游戏功能】 为什么连着打同一个怪,一刀会比一刀疼?叠劲的答案是:劲是攒出来的——起手八点,每接一刀加四点,叠到六层刀刀二十…

2026-10-01 11:22 996 技术组
进阶实战游戏功能

破势令:一处破绽挂六秒,谁打它都更疼

【游戏功能】 群里报过一个怪现象:同一位玩家打同一个怪,有时一刀十三有时一刀十,面板攻击力没变过——排查了半天才发现,十三的…

2026-10-01 11:22 996 技术组
进阶实战游戏功能

血债簿:五笔血账一次清算,欠下的刀刀要还

【游戏功能】 线上出过一单事故:同战力两个人对砍,先手的那位反而输了——事后翻账才发现,赢家的每一刀都比面板数值高出一截,高…

2026-10-01 11:22 996 技术组