【游戏功能】
它出什么招,你就换什么式——劈克刺、刺克扫、扫克劈,三式相扣的一个圈。挪移换式把猜拳搬进了打架:怪的下一手提前亮给你看,你的式换对了,下一刀双倍;换错了,平砍白给。这篇把整套模块拆开:配置表、式表、 亮招判定、定时器、调试按钮,一段一段照抄能跑。
一、效果演示:看它的招换你的式,对上了双倍
演示场的怪头顶悬着一枚转圈的字——"刺",那是它的下一手。你身前三格式的格子:劈、刺、扫,点「换式!」一格格轮转。换到"劈"——克它的那一格亮起,你的下一刀"劈"字金字二十点砸下去。它换招了——头顶的字转成"扫",你的式没跟上——灰色的十点白给。演示里练的就是这个眼疾手快:读它的字,转你的格,三式相克一个圈。挪移换式玩的是读题:招写在它头上,答案写在你的格子里,对不对得上全看你转得快不快。
fx-stancecycle
二、底层原理:一张式表加一次相克判定
模块的机关是一对搭档。式表:劈刺扫三式成一个圈——劈克刺、刺克扫、扫克劈,圈上每一式都克下一式、被上一式克,没有最强的式只有对的式。相克判定:怪的下一手提前亮出,玩家的式与亮出的手成相克关系时出刀翻倍——判定的双方都写在明处,题面和答案全公开。和猜拳那类暗对暗的分野在"亮招是明牌":暗猜拳是运气,明牌换式是反应——怪把答案举在头顶,玩家拼的是转格的手速。
它为什么提前亮招?提前亮招是把随机性从机制里剔除——剔掉运气剩下的全是操作,操作派机制的公平就建立在这份"明牌"上。
三、核心代码:完整模块(上·骨架)
-- @file StanceCycle.lua
-- 挪移换式 —— 看它的招换你的式,对上了双倍
local StanceCycle = {}
local CONST = {
STYLE_COUNT = 3,
COUNTER_AMP = 2.0,
TELL_GAP = 2.4,
COLOR_STANCE = "#6a8a58",
COLOR_DEEP = "#2a3a18",
COLOR_GHOST = "#d0e8b0",
ZORDER_TELL = 134,
ZORDER_FX = 135,
AUTOINC_BASE = 1041000,
}
local STYLES = { "劈", "刺", "扫" }
local COUNTER = { 劈 = "扫", 扫 = "刺", 刺 = "劈" }
local _stance = 1
local _tell = 2
local _tellT = 0
local _tellFx = nil
local _scheduler = nil
local _autoInc = 0
local function GenID(prefix)
_autoInc = _autoInc + 1
return string.format("%s_%d", prefix or "STC",
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 StanceCycle.Cycle()
_stance = _stance % CONST.STYLE_COUNT + 1
SL:PlayCycleFx(SL:GetValue("USER_ID"), _stance)
SL:TipAboveMe("换式·" .. STYLES[_stance])
ShowTip("换到「" .. STYLES[_stance] .. "」式——它的下一手是「"
.. STYLES[_tell] .. "」")
end
四、核心代码:完整模块(下·定时器与相克结算)
-- 相克判定:出刀前对式
SL:RegisterLUAEvent(LUA_EVENT_MELEE_HIT, "STC_Amp", function(tid)
if COUNTER[STYLES[_tell]] == STYLES[_stance] then
return math.floor(10 * CONST.COUNTER_AMP)
- (SL:GetValue("HIT_DAMAGE", tid) or 10)
end
return 0
end)
-- 定时器:它的下一手轮转
if not _scheduler then
_scheduler = SL:Schedule(function(dt)
_tellT = _tellT + dt
if _tellT >= CONST.TELL_GAP then
_tellT = 0
_tell = _tell % CONST.STYLE_COUNT + 1
SL:PlayTellSwapFx(_tell)
ShowTip("它换了招——现在是「" .. STYLES[_tell]
.. "」,看准再换式")
end
end, 0.02)
end
SL:ScheduleOnce(function()
SL:BindDebugButton("换式", function()
StanceCycle.Cycle()
end)
ShowTip("技能已加载: 挪移换式 (调试按钮触发)")
end, 1.0)
function StanceCycle.Unload()
if _scheduler then SL:Unschedule(_scheduler) end
SafeRemove(_tellFx)
_stance = 1
end
return StanceCycle
五、机制问答
问:式能跳着换吗?
答:不能——式是轮转的,劈到刺到扫再回劈,跳式的版本三格白设,轮转才有"转几格"的算计。
问:它的下一手多久换一次?
答:二点四秒——换手的节奏比换式的手速略慢,追得上就刀刀双倍,追不上就回回平砍。
问:相克的刀能暴击吗?
答:能——双倍乘完暴击再乘,对上式的暴击刀是这套机制的天花板。
问:亮招会被打断吗?
答:不会——亮招是它的预告不是它的动作,预告挂在那儿雷打不动,变化的全是玩家的格子。
问:式对错有惩罚吗?
答:没有——对错只是双倍与平砍的差别,不扣血不清资源,读错题的代价永远是少拿不是倒扣。
问:换式有冷却吗?
答:没有冷却只有手速——格子随便转,转得越快读题越从容,冷却的版本换式就成了卡点。
问:换式那一拍挨打了怎么办?
答:式不丢——换式认格不认帧,挨打只掉血不换格,读完题再挨打也来得及对。
六、调参指南与商业服怎么用
第四笔是相克的圈长:三式是"一眼能背"的圈长——五式的圈要背口诀,两式的圈变成开关,三式刚好是"一秒能转完一圈"的容量。第三笔是亮招的时长:二点四秒对换式的手速是"读得完、来得及"的窗口——预告太短变成抢答,太长变成默写。第二笔是相克的档位:双倍是"对题有奖、错题不罚"的档——错式倒扣的版本玩家不敢换式,明牌机制的乐趣在敢转不在怕错。第一笔是字的醒目:它头顶的字要大、要转色——字是题面,题面越清楚,转格的手越果断。常见坑三个:预告换手不同步字色,字换了色没换玩家读旧题;相克表写反,劈克劈自己克自己;换式的格子顺序和说明页不一致,玩家照着说明转反了。
商业服里挪移换式是"游学剑客流派"的功课:走到哪儿学到哪儿的相克圈——商城里式格的样式做成品级,竹简格、碑帖格、锦书格,头顶三格轮转的式字就是游学剑客的书箱。运营落地还有两笔:一段是相克表教学——第一课发一张三式相克图,背下来的和看小抄的打法立刻分出两派;一段是对式榜——按相克命中的总次数排名,题读得最熟的人有碑。变体做成四象式:三式加一式变四象循环——圈越长题越难,读题家的乐园。这一篇的演示和整套模块照抄能跑,改的就是 CONST 那张表。
游学剑客的功课再补一句:字换了,格就换——犹豫的那半拍,就是平砍的那一刀。
游学剑客还有一句压箱的:题在明处,错在手上,不在题上。
游学的最后一句:式转三圈不如题读一遍。
写完留一句给做读题系的同学:挪移换式卖的是"答案写在它头上"——那枚一转一转的预告字和三格轮转的式格,是把打架变成一场明牌抢答的比赛。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 拽出去,绷到头,双双回弹——牵线的账目就三步:金线拴住两只怪,你把一只拖远,线绷直的那一瞬两只一起回弹,各挨十…
【游戏功能】 拴住两只打一只,另一只陪三成——连痛把"打击"变成了"打击们":紫线一拴,两只怪共担疼痛,你打左边的每一刀,右…
【游戏功能】 均值 = (你 + 它) ÷ 2 —— 称平的那一下,两管血按比例拉到同一个数:谁的比例高谁掉,谁的比例低谁回…
【游戏功能】 风向 = 负 风向 —— 一面转风旗,翻开是顺风翻回是逆风:旗转向它,两边射出的箭都顺风加重;旗转向你,两边箭…
【游戏功能】 上挑之后一点二秒里按下压——两键按对了顺序,就是一记三十点的合击:挑上天,压进地。顺序反了、间隔超了,都只是两…
【游戏功能】 拖距 = 松手位置 - 起手位置 —— 滑斩的算术就这一行:按住刀柄往右拖,拖出去多少步,刃就送出去多少步,怪…