【游戏功能】
for i = 1, #wolves do if math.abs(wolves[i].x - arrow.x) < 16 then hit(wolves[i]) end——一行遍历判定的循环,撑起了贯穿箭的全部野心:一支箭飞出去,穿到几只算几只,穿一只三十、穿三只九十。今天拆贯穿箭,看"穿透系"怎么把一支箭,变成一支会数数的箭。
一、拉弓、穿行、结算三段
贯穿箭的循环三段。拉弓段:弓弦拉满、箭搭弦上,准星线从脚前铺到场边——拉弓段是全技能的瞄准:贯穿箭的弹道是一条直线,线上有几只怪全看你的站位——直线排怪的站位就是你的弹药,这是贯穿箭教给玩家的第一课。穿行段:箭从第一只怪的胸口穿过去、从第二只的肚子穿过去、从第三只的脖子穿过去——穿行段是全技能的核心:箭不减速不停刀不回头,穿到几只算几只——穿一只三十穿三只九十,数量决定账面。结算段:箭飞出屏幕或者穿完最后一只,一箭的账当场结清——结算段是全技能的落幕:穿了几只、打了多少,数字一目了然——贯穿箭的爽不是单发伤害大,是"一箭的账比三支普通箭加起来还厚"。三段的核心是"穿即乘":贯穿箭不提高单发伤害,它只是让一支箭同时吃多个目标的账——穿得越多乘得越多,乘的法则就是找直线。
完整演示在这,默认自动循环:
fx-pierce
二、幂尔框架实现:穿透是一个逐只判定的循环
贯穿箭的账本就是一个遍历循环——
local Pierce = {}
local ARROW_SPD = 400
local PIERCE_DMG = 30
local MAX_PIERCE = 3
local arrow = nil
function SL:FirePierce()
if arrow then return end
arrow = { x = SL:GetValue("actorX", "self") + 20, hits = 0 }
SL:PlayActorAct("self", "attack")
end
function SL:OnTick(dt)
if not arrow then return end
arrow.x = arrow.x + ARROW_SPD * dt
SL:DrawArrow(arrow.x)
for _, w in ipairs(wolves) do
if not w.dead and math.abs(arrow.x - w.x) < 16 then
arrow.hits = arrow.hits + 1
SL:HitActor(w, PIERCE_DMG)
SL:ShowTipAbove(w, "-30")
end
end
if arrow.x > 680 then
arrow = nil
SL:ShowTipAbove("self", "穿了")
end
end
return Pierce
逐只遍历是全技能的骨架:ipairs(wolves) 每帧都把全部怪的位置扫一遍——箭飞到谁的判定区间就穿谁,穿到的都落账。
三、穿行的演出规格
箭矢是全技能的脸面:金色的箭拖着一条渐长的尾焰——箭尾要"拖",拖得越远越像"正在穿"而不是"正在飞"。穿过的每一只要"闪":箭穿过的瞬间怪身上白闪一帧加一粒碎屑——闪一帧是"穿了"的确认,确认给得越快,玩家的读数越流畅。贯穿的特效要"贯通":从第一只穿到最后一只,箭的尾焰不中断——尾焰断了就说明箭停了,箭停了就不是贯穿。穿完三只的结算金字要"竖排":三只头顶各跳各的三十,最后再跳一个"三穿"的金字——结算的金字是贯穿的谢幕,谢幕要齐。三只怪的站位要"连":直线排的怪才是贯穿的弹药,歪了的怪吃不到——三只怪的站位是玩家可以用走位调的。
四、定价与三条穿规
贯穿系的定价一句话:穿一只三十穿三只九十、弹速四百、不限目标——一箭九十对普攻一箭三十,三倍的账面全看"能不能把三只排成一线"。三条穿规:其一,贯穿不衰减——第一只三十、第二只三十、第三只还是三十,穿到最后不递减,贯穿的信念是"箭不回头刀不减力";其二,穿到几只算几只——穿一只是一只,穿两只算两只,贯穿不看你的面子只看怪的站位;其三,箭不停在同一只——同一只怪只吃一箭,贯穿箭不恋战不贪刀,穿过去就是穿过去了。与弹无虚发对照着看:同是"一支箭的输出",弹无虚发是三箭打一只——一箭比一箭疼,打的是深度;贯穿是一箭穿三只——一箭打三只,打的是广度,弓系的两个门派在"打深"还是"打广"上分了家。
五、贯穿系的排线学:直线排怪是走位不是运气
贯穿箭真正教的是"排线"的走位功:三只怪散着的时候,你可以用走位把它们"赶"成一条线——你站左边往右走,狼怪从右边追上来,追着追着就排成了一条线——排线的时机一到,一箭穿三只的爽就有了。这套排线走位练的不是躲技能,是"利用怪物的追击本能来排列它们"——追你的怪就是你的棋子。对观战者,一箭穿三只的瞬间是全场最有"串串感"的画面:三只怪像糖葫芦一样被一支箭串在一起,串的瞬间每只都闪一帧白。工程收尾记一笔:贯穿的箭矢要画一根穿透的"出箭孔"效果——每穿过一只怪的身上留一个小孔特效,孔特效持续零点三秒再消失——孔特效是贯穿的弹道记录,记录越多,一箭穿三只的画面越有说服力。最后留给数值组的一句话:穿一只三十对三只九十,账面要算出"三只排成一线比三只分散输出高五成"——贯穿系的收益不是伤害数值,是"你能不能把散的排成直的",排线的手艺就是这门功夫的功夫。
写完再留一句给做贯穿系的同学:穿透箭最容易做成"穿第一只就消失的普攻",而它本该是一支看完了全场才停的箭——穿要穿得有尾焰、结算要结得竖排、排线要玩家自己排,贯穿的野心立住了,玩家的每一箭才都是在穿线不是在射箭。
补一个演示彩蛋位:贯穿箭穿完最后一只的那一帧,三只怪的身上会同时闪一下白——三只同时闪是"这条线上的都中了"的齐射确认,齐射确认看多了,玩家不用数就知道自己穿了几只。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【语法算法】 上一版的炮台索敌逻辑有个隐蔽报错:炮台永远打同一个怪——即使那只怪已经死了,索敌的游标也不挪窝。追到底索敌的游…
【语法算法】 先抛一个坑:打不完的火系怪怎么办?火抗怪火打不动,换冰系技能要切装备要换面板——切完黄花菜都凉了。元素转换的答…
【语法算法】 上个月的事故复盘会上有个数字被念了三遍:四成——策划写的是"同伴陪疼四成",代码落下去成了"陪疼四十点",两只…
【语法算法】 单行代码拆解:弹射初速=-420——弹射的全部动力就这一行的负初速。负号朝上、四百二十是弹射的初速大小——踩上…
【语法算法】 上一版的减速类模块全按"乘以零点五"来写,帧率无关的版本照搬了这套写法——结果高帧率机上减速效果好,低帧率机上…
【语法算法】 先抛一个坑:怎么把散在四处的怪聚到一起打?逐个拉是笨办法,一个范围技又只能打一片——引力球的答案是一个会动的吸…