【游戏功能】
一、一次砸偏了的轰炸
空中支援类技能第一版测试,轰炸区画得漂漂亮亮,炸弹也一枚枚落下来了,测试的评语只有四个字:"炸了个寂寞。"回放发现炸弹全落在区域正中心附近,边缘一只怪都没蹭到——随机落点用了直接随机半径,数学上叫中心密集分布,视觉上叫窝心炸。区域轰炸的落点要的是"铺满",均匀随机要按面积算,一个 sqrt 的差距就是天壤之别。
二、机制原理:标记、抛撒、溅射
区域轰炸三层。标记层:红色虚线椭圆先立一秒,明灭节奏就是倒计时,圈的大小即覆盖范围。抛撒层:炸弹逐枚从天而降,落点在椭圆内按面积均匀撒(半径开根号),下坠弹体带尾烟,落地间隔递进——先密后疏的落点节奏比匀速轰炸更像"支援火力"。溅射层:每枚落地炸一圈扩散焰,圈内的目标按炸点结算伤害与受击——注意结算挂炸点不挂区域,边缘的怪被边缘的单枚蹭到就掉一点血,被中心命中就吃满,伤害天然有了空间梯度。
fx-airstrike
三、正确写法:均匀撒点(幂尔版)
local AirStrike = {}
local CONST = { MSG_ID = 12100, KEY = "AirStrike", MARK = 1.0, RX = 110, RY = 46 }
function AirStrike.Cast(myID, cx, cy)
AirStrike._zone = { x = cx, y = cy, rx = CONST.RX, ry = CONST.RY }
SL:SendLuaNetMsg(CONST.MSG_ID, 0, 0, 0,
SL:JsonEncode({ key = CONST.KEY, op = 1, actorID = myID, cx = cx, cy = cy }))
-- 面积均匀撒点: 半径开根号
local count = 12
for i = 1, count do
local a = math.random() * math.pi * 2
local rr = math.sqrt(math.random())
local bx = cx + math.cos(a) * rr * CONST.RX
local by = cy + math.sin(a) * rr * CONST.RY
PerformWithDelayGlobal(function()
AirStrike.DropOne(bx, by)
end, (CONST.MARK + i * 0.12) * 1000)
end
end
function AirStrike.DropOne(bx, by)
SpawnBomb(bx, by, 560) -- 手绘弹体+尾烟
OnBombLand(function()
SpawnBoomRing(bx, by) -- 扩散爆焰
for _, m in ipairs(GetMonstersNear(bx, by, 60)) do
m:OnHit(45) -- 溅射挂炸点
end
end)
end
return AirStrike
四、四个必须钉死的细节
五、心法:随机分布是有性格的
开根号的均匀、不开根号的窝心、正态的中心簇拥——三种随机撒点就是三种弹幕性格。轰炸要铺满、暴击要稳、散弹要边缘稀疏,同一个 random 配不同的曲线就是不同的手感。写弹幕之前先画撒点分布图,一秒钟看清这门炮的脾气。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 一、一个被投诉的手感 格挡类玩法首测,最扎心的反馈是:"我按了格挡,还是掉血,那我按它干嘛?"复盘发现三档判定…
【游戏功能】 一、一个只写在面板上的攻速 血怒类增益技能初版,面板攻速翻倍,实际战斗里玩家毫无感觉——动作动画的播放速度压根…
【游戏功能】 一、一行代码拆解 ctx.ellipse(0, 0, 26 pul, 44 pul, 0, 0, 7) ——传…
【游戏功能】 一、先抛一个坑 地刺为什么从脚下开始、沿着一条线追到敌阵?做成目标脚下原地一丛刺不行吗?行,但那是控制技。地刺…
【游戏功能】 一、先抛一个坑 三段连斩的第一版做出来,策划看完只说了一句:"这是三个技能吧?"三刀的斩痕分别从上斜、下斜、平…
【游戏功能】 一、一个只有正前方能躲的技能 月刃横扫类范围技能第一版,判定画的是以角色为圆心的整圆,视觉画的是身前一扇新月。…