【游戏功能】
再抛一个坑:增益为什么不长脚?攻击加成挂在你身上,你追着怪跑它跟着你跑;挂在怪的头上,它跑到天边你也够不着。增益从来都是钉死的,可战场上最值钱的从来不是钉死的东西,是流动的时机。牵星纹给增益装上了脚:一颗星悬在战场半空,六秒换一次位置——照着你,它的爪重四成;照着它,你的刀重三成。星照谁谁强,天时轮流坐。这篇把整套模块拆开:配置表、牵星构件、照位判定、换边结算、定时器、调试按钮,一段一段照抄能跑。
一、效果演示:星照着谁,谁就占三分天时
演示场开打前点「牵星!」:一颗青白色的星悬上战场半空——十二秒牵星期。开场星悬在怪头顶:它的爪带着星光,砸你十八点;你的刀是平常的十二。六秒一到,星缓缓挪过半场悬到你头顶——攻守当场易势:你的刀十六点,它的爪回十四。头顶的倒计时数着换边的钟点,掐着换边的前一秒抢输出,是这套纹的老玩家做派。演示里试两笔账:星照它时硬拼的血账和星照你时抢出的刀账——同一颗星,半个天时的差价就是一整场仗的胜负手。牵星纹教的是候时:天时不站人站,星到哪儿强势到哪儿。
fx-starpull
二、底层原理:一颗牵星构件加一次照位判定
模块的机关是一对搭档。牵星构件:开纹那一拍一颗星悬上战场——星是流动的增益坐标,六秒一换边,悬在谁头顶天时归谁。照位判定:每一拍读星的悬停位——照它,你的刀走加重档;照你,它的爪走加重档,攻守的账随星位实时翻面。和固定增伤的分野在"牵星的强势会换边":普通增伤是你的私产,牵星的强势是流动的公产——你占过它也占,抢天时的意识比堆数值的手法更要紧。
换边为什么定时而不是看谁打得凶?看输出换边的版本星跟着手快的人跑,手慢的一方永远摸不到天时;定时换边的版本天时按班次轮转,双方都有一半的强势期——差价不在星在不在你头上,在你会不会用照着你的那几秒。
三、核心代码:完整模块(上·骨架)
-- @file StarPull.lua
-- 牵星纹 —— 星照着谁,谁就占三分天时
local StarPull = {}
local CONST = {
CREST_LIFE = 12.0,
CREST_CD = 4.0,
PHASE_LIFE = 6.0,
MY_AMP = 16,
FOE_AMP = 18,
BASE_HIT = 12,
BASE_TAKE = 14,
COLOR_STAR = "#8890c8",
COLOR_DEEP = "#343858",
COLOR_GHOST = "#ccd0f0",
ZORDER_STAR = 140,
ZORDER_FX = 135,
AUTOINC_BASE = 1122000,
}
local _crestT = 0
local _cdLeft = 0
local _phaseT = 0
local _phase = "foe"
local _starFx = nil
local _scheduler = nil
local _autoInc = 0
local function GenID(prefix)
_autoInc = _autoInc + 1
return string.format("%s_%d", prefix or "STP",
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 StarPull.MyTurn()
return _phase == "self"
end
四、核心代码:完整模块(下·照位判定与换边钟)
-- 照位判定:星照谁,谁的攻击走加重档
SL:RegisterLUAEvent(LUA_EVENT_MELEE_DAMAGE, "STP_My", function()
if not StarPull.MyTurn() then return 0 end
return CONST.MY_AMP - CONST.BASE_HIT
end)
SL:RegisterLUAEvent(LUA_EVENT_BEFORE_HURT, "STP_Foe", function(dmg)
if not StarPull.MyTurn() then return dmg end
return math.floor(dmg * CONST.FOE_AMP / CONST.BASE_TAKE)
end)
-- 换边钟:六秒一响,星挪半场
local function ShiftStar()
_phase = (_phase == "foe") and "self" or "foe"
local myID = SL:GetValue("USER_ID")
local target = StarPull.MyTurn() and myID
or SL:GetValue("MARK_TARGET_ID")
local tp = target and GetActorPos(target)
if tp then
SL:PlayStarMoveFx(tp.x, tp.y)
end
ShowTip("星挪窝了——照" .. (StarPull.MyTurn() and "你" or "它"))
end
function StarPull.Cast()
if _cdLeft > 0 or _crestT > 0 then return end
local myID = SL:GetValue("USER_ID")
_cdLeft = CONST.CREST_CD
_crestT = CONST.CREST_LIFE
_phase = "foe"
_phaseT = CONST.PHASE_LIFE
SafeRemove(_starFx)
_starFx = GUI:Layout_Create(GUI:Attach_SceneF(),
GenID("Star"), 0, 0, 0, 0, false)
GUI:setLocalZOrder(_starFx, CONST.ZORDER_STAR)
SL:PlayStarUpFx(myID)
ShowTip("星悬在它头顶——六秒一换,照谁谁强")
end
-- 定时器:纹成倒计时与换边钟驱动
if not _scheduler then
_scheduler = SL:Schedule(function(dt)
_cdLeft = math.max(0, _cdLeft - dt)
if _crestT > 0 then
_crestT = _crestT - dt
_phaseT = _phaseT - dt
if _phaseT <= 0 then
_phaseT = CONST.PHASE_LIFE
ShiftStar()
end
local myID = SL:GetValue("USER_ID")
local target = StarPull.MyTurn() and myID
or SL:GetValue("MARK_TARGET_ID")
local tp = target and GetActorPos(target)
if _starFx and tp then
GUI:setPosition(_starFx, tp.x, tp.y - 196)
end
if _crestT <= 0 then
SafeRemove(_starFx)
ShowTip("星归天了——谁也不照了")
end
end
end, 0.02)
end
SL:ScheduleOnce(function()
SL:BindDebugButton("牵星", function()
StarPull.Cast()
end)
ShowTip("技能已加载: 牵星纹 (调试按钮触发)")
end, 1.0)
function StarPull.Unload()
if _scheduler then SL:Unschedule(_scheduler) end
SL:UnregisterLUAEvent(LUA_EVENT_MELEE_DAMAGE, "STP_My")
SL:UnregisterLUAEvent(LUA_EVENT_BEFORE_HURT, "STP_Foe")
SafeRemove(_starFx)
_crestT = 0
end
return StarPull
五、机制问答
问:星照着我的时候我能躲着不打吗?
答:能但亏——天时六秒一过就换边,照你的几秒是唯一的输出窗口,躲着不打等于把天时白送给它。
问:换边的瞬间在途的刀算哪边的账?
答:算落刀那拍——判定认命中时刻的星位,星挪到半路刀落了地,账按出刀前的星位结。
问:星照它时我该干什么?
答:守——它的刀重四成,这几天是走位喝药的时段,天时的另一半是知道什么时候该怂。
问:星照它时我的持续伤害沾光吗?
答:不沾——星只照出手那一刻的账,毒跳灼烧走的是地面流水,不认星位。
问:牵星期结束星去哪了?
答:归天——星是纹养出来的,纹收星散,下一窗从它头顶重新悬起。
六、调参指南与商业服怎么用
第四笔是换边的钟点:六秒一班对十二秒窗口是"一人一班"的轮值——班次太短星成了走马灯谁也别想用,太长天时变成半场专属,六秒是"轮得着也用得上"的班表。第三笔是两边的差价:你的三成对它的四成是"占星有赚但守星要命"的不对称——两边等价的天时没有紧迫感,己方略优的差价才让人愿意去抢那六秒。第二笔是判定的挂点:星位认命中那一刻是时序的锚——锚错了在途攻击的账两头扯皮,这一拍和当年"永远差一"的对账事故是一个师傅教出来的坑。第一笔是星的挪移:挪半场的飞行要有一段可见的航程——星是会走的天时,瞬移的星没有"换边"的仪式感,掐表的手也就没了指望。常见坑三个:换边瞬间在途伤害的星位归属扯皮;星位跟画在目标死亡后悬在半空;照位判定的读数和星的实际位置差了半拍。
商业服里牵星纹是"观星台"的天时:别人的增益是自己的,他的增益是天上的——商城里牵星的样式做成品级,纸星、银星、紫微星,那颗六秒一挪的青白星就是观星台的罗盘。运营落地还有两笔:一段是候时教学——教一句"星照你的时候别怂,六秒够你打一轮",流派第一课是候时;一段是牵星榜——按星照自己期间的输出总量排名,天时用得最足的人有碑。变体做成双星:一大一小两颗星错班轮转——从单星到双星,观星台的夜空越挂越满。这一篇的演示和整套模块照抄能跑,改的就是 CONST 那张表。
写完留一句给做天时系的同学:牵星纹卖的是"强势是轮班的"——那颗六秒一挪的星和攻守翻面的每一拍,是把增益从私产改成轮值公产的第一份天时表。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
接手二开的兄弟几乎都撞过同一堵墙:玩家嫌走路"一格一格像机器人",老板拍板要"丝滑移动",改服务端速度?不对。改客户端动画帧…
【游戏功能】 先看一个熟场面:法师的火球特效挂在怪的脚后跟上,明明技能说明写着"焚烧其面",火星子却在地上打滚。群里有位策划…
【游戏功能】 上周有个开服的老板在群里发了一段录屏:他的战士明明刀刀都砍中了,观众却一片"这刀挥空了吧"。他原话是"判定日志…
【游戏功能】 先说结论放在开头:怪的皮一会儿绿一会儿红,不是美术换了几套贴图,是染色系统在怪身上盖了一层"色镜"。开服群里有…
前两天群里有个架设的朋友问了个需求:中毒的人要变绿、每两秒掉一次血、毒还能叠五层,问是不是要在服务端把整套状态机重写。我说你…
【游戏功能】 先抛一个坑:五口钟一模一样大,为什么一口比一口疼?先后次序动不得吗?倒过来敲会怎样?这篇把编钟纹整套写法拆开:…