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

照形镜纹:踩进镜子里的它,现形挨重刀

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

【游戏功能】

inZone=poolT>0&&Math.abs(M.x-poolX)<40——先拆这一行。照形纹的判定全在这一行:镜子铺在地上的那六秒里,怪的脚踩进镜心四十步之内,"现形"两个字当场亮起——它的护体散三分,你的刀重四分之一。照形纹的逻辑是照妖:镜子照出它的真身,真身挨刀才疼。这篇把整套模块拆开:配置表、铺镜结算、现形判定、加重通道、定时器、调试按钮,一段一段照抄能跑。

一、效果演示:踩进镜子里的它,现形挨重刀

演示场怪照常逼近。点「照形!」:一面青色的镜铺在它脚下——六秒镜期。怪往前走,脚一踏进镜心,镜面光色一变,"现形!"两个字从镜里浮起来——这一拍你的刀砍下去,十六点的青字,比平常的重了四分之一。它继续走,脚出了镜面,镜光暗下去,你的刀跟着回十二。镜子散了再铺一面,又是六秒的照形期。演示里试两笔账:它踩镜的时段你的刀账和镜外的刀账——同一把刀,重不重全看它的脚站在哪。照形纹教的是照妖:怪护体再厚,镜子里现了形,照打。

demo
 fx-shadowcast

二、底层原理:一面铺镜构件加一次现形判定

模块的机关是一对搭档。铺镜构件:按纹那一拍一面镜铺在它脚下——镜认地不认人,铺在哪儿亮在哪儿,六秒的镜期里它走到镜上是它的选择。现形判定:每一拍量它的脚和镜心的距离——镜心四十步之内算现形,现形的怪吃你的加重刀,出了镜圈护体当场回来。和减防类机制的分野在"照形散的是它脚下的护体":破甲拆的是它的装备数值,照形照的是它的真身位置——它站进镜子才散,站出镜子就聚,护体的散聚跟着它的脚走,时机成了唯一的变量。

镜子为什么只铺六秒?镜期太长它总有一半时间泡在镜里,照形变成常态增伤;太短一面镜还没等它踩上就散了——六秒刚好是"它走过一遍、你能挑一次时机"的长度。

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

lua
-- @file ShadowCast.lua
-- 照形镜纹 —— 踩进镜子里的它,现形挨重刀

local ShadowCast = {}

local CONST = {
    POOL_LIFE     = 6.0,
    POOL_CD       = 2.0,
    POOL_RADIUS   = 40,
    AMP_HIT       = 16,
    BASE_HIT      = 12,

    COLOR_POOL    = "#70a8a0",
    COLOR_DEEP    = "#244840",
    COLOR_GHOST   = "#b8e8e0",

    ZORDER_POOL   = 89,
    ZORDER_FX     = 135,
    AUTOINC_BASE  = 1116000,
}

local _poolT     = 0
local _cdLeft    = 0
local _poolX     = 0
local _poolFx    = nil
local _scheduler = nil
local _autoInc   = 0

local function GenID(prefix)
    _autoInc = _autoInc + 1
    return string.format("%s_%d", prefix or "SHC",
        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 ShadowCast.Exposed()
    if _poolT <= 0 then return false end
    local tp = GetActorPos(SL:GetValue("MARK_TARGET_ID"))
    if not tp then return false end
    return math.abs(tp.x - _poolX) <= CONST.POOL_RADIUS
end

四、核心代码:完整模块(下·现形加重与铺镜)

lua
-- 加重通道:现形的怪挨的刀走重档
SL:RegisterLUAEvent(LUA_EVENT_MELEE_DAMAGE, "SHC_Amp", function()
    if ShadowCast.Exposed() then
        return CONST.AMP_HIT - CONST.BASE_HIT
    end
    return 0
end)

function ShadowCast.Cast()
    if _cdLeft > 0 then return end
    local tid = SL:GetValue("MARK_TARGET_ID")
    local tp = tid and GetActorPos(tid)
    if not tp then return end
    _cdLeft = CONST.POOL_CD
    _poolT = CONST.POOL_LIFE
    _poolX = tp.x
    SafeRemove(_poolFx)
    _poolFx = GUI:Layout_Create(GUI:Attach_Scene(),
        GenID("Pool"), _poolX, tp.y, 0, 0, false)
    GUI:setLocalZOrder(_poolFx, CONST.ZORDER_POOL)
    SL:PlayPoolUpFx(_poolX)
    ShowTip("镜子铺在它脚下了——它踩着现形,刀就重")
end

-- 定时器:镜期倒计时与镜光流转
if not _scheduler then
    _scheduler = SL:Schedule(function(dt)
        _cdLeft = math.max(0, _cdLeft - dt)
        if _poolT > 0 then
            _poolT = _poolT - dt
            if _poolT <= 0 then
                SafeRemove(_poolFx)
                ShowTip("镜散了——地上只剩水汽")
            end
        end
    end, 0.02)
end

SL:ScheduleOnce(function()
    SL:BindDebugButton("照形", function()
        ShadowCast.Cast()
    end)
    ShowTip("技能已加载: 照形纹 (调试按钮触发)")
end, 1.0)

function ShadowCast.Unload()
    if _scheduler then SL:Unschedule(_scheduler) end
    SL:UnregisterLUAEvent(LUA_EVENT_MELEE_DAMAGE, "SHC_Amp")
    SafeRemove(_poolFx)
    _poolT = 0
end

return ShadowCast

五、机制问答

问:它站在镜边线上算现形吗?
答:算——四十步的判定圈从镜心起算,脚在线内就算照着,压线也算照它三分。

问:你的位置影响现形吗?
答:不影响——镜认它的脚不认你的刀,你隔着半场砍进镜里的它照样是重刀,照形照的是它不是你。

问:镜子能跟着它挪吗?
答:不挪——镜铺下去就钉在地上,它走出镜圈护体就回来,想照得久就得引它在镜上打转。

问:现形的加重和破甲叠加吗?
答:叠——两本账各走各的乘区,镜里再被破甲的怪挨的刀是双重加重,叠着打的时机要掐镜期。

问:它死了镜子还铺着吗?
答:铺——镜是地契,怪死了镜照旧亮完六秒,引下一只踩上来接着照,这是老玩家的续镜手法。

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

第四笔是现形的圈径:四十步的镜心圈是"踩得进也出得去"的口径——圈太大它一脚踩进来就赖着不走,太小它的步幅一步跨出去,四十步刚好是它一个踱步的余量。第三笔是镜期的长短:六秒对它的步速是"走一遍镜面"的时长——镜期太长照形变常驻,太短它还没踩到镜就散,六秒是等得起也耗得起的折中。第二笔是加重的份量:十六对十二是三成的照形重——太重照形成了唯一正确打法,太轻不值得掐时机,三成刚好让"引它踩镜"成为一门手艺。第一笔是镜的质感:镜面要有水光流转、现形时光色要变——镜子照没照着,玩家扫一眼光色就知道,光色不变的镜是块地砖。常见坑三个:现形判定漏了它被击退的瞬间导致光色闪断;镜面渐变在低配机器上拖帧;镜散时的水汽演出盖住了玩家的飘字。

商业服里照形纹是"照妖阁"的宝鉴:别人加伤害靠堆属性,他加伤害靠一面镜子——商城里镜面的材质做成品级,水镜、铜镜、照妖金镜,那面铺在地上流转水光的青镜就是照妖阁的招牌。运营落地还有两笔:一段是引路教学——教一句"把它往镜上引,踩上就现形",流派第一课是下饵;一段是照形榜——按现形期打出的总伤排名,镜铺得最准的人有碑。变体做成双镜夹道:前后各铺一面镜,它进退都在镜里——从单镜到夹道,照妖阁的镜子越铺越阔。这一篇的演示和整套模块照抄能跑,改的就是 CONST 那张表。

写完留一句给做现形系的同学:照形纹卖的是"镜子里现的真身挨刀最疼"——那面流转水光的青镜和现形时变色的光纹,是把敌方的走位变成自己刀重的第一面宝鉴。

作者履历与出处

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

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

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

LATEST ARTICLES

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

进阶实战游戏功能

走一格为什么是半秒?拆开996引擎走路状态机

接手二开的兄弟几乎都撞过同一堵墙:玩家嫌走路"一格一格像机器人",老板拍板要"丝滑移动",改服务端速度?不对。改客户端动画帧…

2026-10-03 05:31 996 技术组
进阶实战游戏功能

特效总挂在脚后跟上?挂点表选对一行顶十行

【游戏功能】 先看一个熟场面:法师的火球特效挂在怪的脚后跟上,明明技能说明写着"焚烧其面",火星子却在地上打滚。群里有位策划…

2026-10-03 05:30 996 技术组
进阶实战游戏功能

刀刀都判命中,玩家为什么喊挥空?命中表现差的那一拍

【游戏功能】 上周有个开服的老板在群里发了一段录屏:他的战士明明刀刀都砍中了,观众却一片"这刀挥空了吧"。他原话是"判定日志…

2026-10-03 05:30 996 技术组
进阶实战游戏功能

怪的皮一会儿绿一会儿红?状态染色的色号表就三列

【游戏功能】 先说结论放在开头:怪的皮一会儿绿一会儿红,不是美术换了几套贴图,是染色系统在怪身上盖了一层"色镜"。开服群里有…

2026-10-03 05:30 996 技术组
进阶实战游戏功能

996引擎Buff系统解剖:中毒变绿、冰冻发白是怎么挂上去的

前两天群里有个架设的朋友问了个需求:中毒的人要变绿、每两秒掉一次血、毒还能叠五层,问是不是要在服务端把整套状态机重写。我说你…

2026-10-03 05:25 996 技术组
进阶实战游戏功能

编钟纹:五口钟排着敲,一口更比一口疼

【游戏功能】 先抛一个坑:五口钟一模一样大,为什么一口比一口疼?先后次序动不得吗?倒过来敲会怎样?这篇把编钟纹整套写法拆开:…

2026-10-03 05:01 996 技术组