【游戏功能】
坠石的落点判定曾经闹过一个笑话:白圈预告画在玩家脚下,石头却砸在白圈旁边半个身位——测试员吐槽"这游戏的石头是斜的"。追下来是落点的横向偏移没夹进圈内,随机散布写过了头。修完这个"斜石头",坠石惊雷这套"两方共用的天灾"玩法,今天拆开。
一、怒吼、白圈、落石三段
坠石的三段。怒吼:狼怪仰头一吼,吼声震得天摇——吼是落石的扳机,吼声一响,天上就有东西要下来。白圈:三个白色的落点圈先后亮在战场上——圈的位置一半随机落在玩家附近,一半落在狼怪附近,圈里的虚线闪着"要砸了"的倒计时,落石对所有人是公平的:玩家站圈里挨砸,狼怪站圈里同样挨砸。落石:倒计时走完,石头轰然砸下——土浪炸开、震屏半拍,砸中的挨砸,砸空的圈里留一块碎石残骸几秒。三段连起来:坠石不是狼怪的技能,是战场的天气——狼怪吼出来的天灾,玩家躲得过,也借得过:引狼站进白圈,借天上的石头砸它,才是这套玩法的完全体。
完整演示在这——看白圈的位置,点「闪避!」挪出圈,顺带引它进圈:
fx-fallrock
二、幂尔框架实现:落点预告与两方结算
幂尔框架里坠石是吼声触发的定时区域,结算不分阵营:
local RockFall = {}
local WARN_TIME = 1.4
local function onRoar(monster)
local spots = {}
spots[1] = SL:NearPos("player", 60)
spots[2] = SL:NearPos(monster, 60)
spots[3] = SL:MidPos("player", monster)
for _, pos in ipairs(spots) do
local zone = SL:MarkZone(pos, 34, WARN_TIME)
SL:RegZoneTick(zone, WARN_TIME, function()
SL:DropRock(pos)
SL:DamageZone(zone, function(u)
return SL:IsPlayer(u) or SL:IsMonster(u)
end)
SL:RingWave(pos, 34, "soil_ring")
SL:ShakeCamera(4, 0.2)
end)
end
end
SL:On("monster_roar", onRoar)
return RockFall
DamageZone 的回调里玩家和怪物一起收——落石的账本没有阵营页,天灾面前众生平等,这一行就是"借石砸狼"玩法的出生证明。
三、落点的配比与借石的引法
三个落点的配比是这套玩法的骨架:一个贴玩家、一个贴狼怪、一个在两者中间——贴玩家的教玩家躲,贴狼怪的教玩家借,中间那个教玩家读局。配比改了玩法就变味:全落玩家脚下是纯躲圈练习,全落狼怪脚下是白送输出。借石的引法是进阶课:狼怪的踱步是不长眼的,玩家站进白圈旁边半步,狼怪追过来顶多再走两步——掐着落石前一秒把狼怪引到圈里,石头替你砸出一段硬直。引的时机有讲究:太早引,狼怪落脚又走了;太晚引,石头砸的是引完的你——白圈的倒计时就是引狼的节拍器。最后一条给表现组:落点圈的白要亮、落下的石头要看得见下落的过程——从天而降的影子先到、石头后到,玩家的躲才有依据;石头凭空出现,白圈就白画了。预告、下落、砸地,三段都要在画面上走完,天灾才像天灾,而不是系统随手扣的血。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 控制技能的镜像问题是:锁住了怪,自己是不是也闲着?影锁把这道两难摆上台面:影锁四秒,它动不了、你也动不了——它…
【游戏功能】 打断为什么只有"清读条"一种?震魂偏要反过来——不清招、不断势,打在它读条半途的那一劲顺着招震进腑——中劲十秒…
【游戏功能】 蜂群为什么总是一只一只出?蜂王偏要让它们进化:放一只蜂王出来,杀掉小怪喂它——喂三只升一阶,三阶蜂王的毒刺一秒…
【游戏功能】 技能为什么总是不扣自己的血?血刃偏要反着来:开着血刃的每一刀先扣自己二血、命中回三血——净赚一但要打得中,空刀…
【游戏功能】 bn.t = bn.t - dt ——一行旗面倒计时的代码,撑起了破军旗全部的紧迫感:旗立三秒、圈内加攻三成,…
【游戏功能】 淬毒为什么要一毒到底?淬毒刃偏要一层一层叠:一刀淬一层毒、毒层一秒六地烂,六层封顶之后一刀下去毒伤三十六——叠…