【游戏功能】
inZone=poolT>0&&Math.abs(M.x-poolX)<40——先拆这一行。照形纹的判定全在这一行:镜子铺在地上的那六秒里,怪的脚踩进镜心四十步之内,"现形"两个字当场亮起——它的护体散三分,你的刀重四分之一。照形纹的逻辑是照妖:镜子照出它的真身,真身挨刀才疼。这篇把整套模块拆开:配置表、铺镜结算、现形判定、加重通道、定时器、调试按钮,一段一段照抄能跑。
一、效果演示:踩进镜子里的它,现形挨重刀
演示场怪照常逼近。点「照形!」:一面青色的镜铺在它脚下——六秒镜期。怪往前走,脚一踏进镜心,镜面光色一变,"现形!"两个字从镜里浮起来——这一拍你的刀砍下去,十六点的青字,比平常的重了四分之一。它继续走,脚出了镜面,镜光暗下去,你的刀跟着回十二。镜子散了再铺一面,又是六秒的照形期。演示里试两笔账:它踩镜的时段你的刀账和镜外的刀账——同一把刀,重不重全看它的脚站在哪。照形纹教的是照妖:怪护体再厚,镜子里现了形,照打。
fx-shadowcast
二、底层原理:一面铺镜构件加一次现形判定
模块的机关是一对搭档。铺镜构件:按纹那一拍一面镜铺在它脚下——镜认地不认人,铺在哪儿亮在哪儿,六秒的镜期里它走到镜上是它的选择。现形判定:每一拍量它的脚和镜心的距离——镜心四十步之内算现形,现形的怪吃你的加重刀,出了镜圈护体当场回来。和减防类机制的分野在"照形散的是它脚下的护体":破甲拆的是它的装备数值,照形照的是它的真身位置——它站进镜子才散,站出镜子就聚,护体的散聚跟着它的脚走,时机成了唯一的变量。
镜子为什么只铺六秒?镜期太长它总有一半时间泡在镜里,照形变成常态增伤;太短一面镜还没等它踩上就散了——六秒刚好是"它走过一遍、你能挑一次时机"的长度。
三、核心代码:完整模块(上·骨架)
-- @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
四、核心代码:完整模块(下·现形加重与铺镜)
-- 加重通道:现形的怪挨的刀走重档
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 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
接手二开的兄弟几乎都撞过同一堵墙:玩家嫌走路"一格一格像机器人",老板拍板要"丝滑移动",改服务端速度?不对。改客户端动画帧…
【游戏功能】 先看一个熟场面:法师的火球特效挂在怪的脚后跟上,明明技能说明写着"焚烧其面",火星子却在地上打滚。群里有位策划…
【游戏功能】 上周有个开服的老板在群里发了一段录屏:他的战士明明刀刀都砍中了,观众却一片"这刀挥空了吧"。他原话是"判定日志…
【游戏功能】 先说结论放在开头:怪的皮一会儿绿一会儿红,不是美术换了几套贴图,是染色系统在怪身上盖了一层"色镜"。开服群里有…
前两天群里有个架设的朋友问了个需求:中毒的人要变绿、每两秒掉一次血、毒还能叠五层,问是不是要在服务端把整套状态机重写。我说你…
【游戏功能】 先抛一个坑:五口钟一模一样大,为什么一口比一口疼?先后次序动不得吗?倒过来敲会怎样?这篇把编钟纹整套写法拆开:…