【游戏功能】
一、先抛一个坑
青龙偃月斩为什么是横着扫而不是竖着劈?因为横扫的范围是一个扇形而不是一条线——扇形就是"身前一扇谁也别想过"的领地宣言。横扫的判定是扇形,视觉是新月弧光,玩家看到的新月就是判定的边界。新月弧光从细到宽展开再从宽到窄收起,展开是扫出、收起是扫回,一个来回就是一刀。
二、底层原理
新月弧光用双弧夹月牙的绘制方式:外弧和内弧之间填充色块形成月牙形。判定是扇形:以施法者为圆心,半径和半角定义覆盖区域。在幂尔框架里,SL:GetValue 读施法者朝向控制弧光展开方向,SL:SendLuaNetMsg 在弧光最大时结算命中。
fx-crescent
三、正确写法
local DragonSweep = {}
local CONST = { KEY = "DragonSweep", RADIUS = 150, ANG = 150 }
function DragonSweep.Cast(myID)
local faceDeg = SL:GetValue("ACTOR_DIR", myID) * 45
SL:SendLuaNetMsg(CONST.MSG_ID, 0, 0, 0,
SL:JsonEncode({ key = CONST.KEY, op = 1, actorID = myID }))
local list = SL:GetValue("FIND_IN_VIEW_MONSTER_LIST") or {}
for _, id in ipairs(list) do
local mx = SL:GetValue("ACTOR_POSITION_X", id)
local my = SL:GetValue("ACTOR_POSITION_Y", id)
local dx, dy = mx - SL:GetValue("ACTOR_POSITION_X", myID), my - SL:GetValue("ACTOR_POSITION_Y", myID)
local dist = math.sqrt(dx * dx + dy * dy)
if dist <= CONST.RADIUS then
local deg = ((math.atan2(dy, dx) * 57.29577951 + 90) + 360) % 360
local diff = math.abs(deg - faceDeg)
if diff > 180 then diff = 360 - diff end
if diff <= CONST.ANG / 2 then
SL:SendLuaNetMsg(CONST.MSG_ID, id, 0, 0,
SL:JsonEncode({ key = CONST.KEY, op = 2, hit = id }))
end
end
end
end
return DragonSweep
四、四个必须钉死的细节
五、心法:扇形技能的形状就是它的性格
横扫是威慑、突刺是突袭、圆是守卫。扇形范围技能的性格由张角和半径共同决定:小张角大半径是狙击枪,大张角小半径是霰弹枪。判定形状和视觉形状永远同源——这是范围技能设计的铁律。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 heat = heat + 1; if heat = 3 then rest = 1.6 ——两行管刀温的代码…
【游戏功能】 兄弟俩打一只狼,哥哥攒了三层劲自己放,一层加二十五;弟弟站在旁边干瞪眼——直到有人把劲递了过去:同样的三层,过…
【游戏功能】 有篇纠错单写得像小说:同一只狼,有人打它半小时血线稳如老狗,有人三分钟放倒——排查到最后发现,会打的那个从头到…
【游戏功能】 追着你满场跑的狼怪,为什么绕过一根石柱就懵在原地?脱影的答案藏在柱子背后:视线被石柱掐断一秒二,它脑子里"你"…
【游戏功能】 巡查群里有人喊邪门:同一套连招,昨天刀刀见血,今天刀刀被挡——查录像看到第三遍才看懂:狼怪学会了。他的出刀间隔…
【游戏功能】 if hand == last then acid = acid + 1 ——一行数手的判定,攒出了换手全部的…