【游戏功能】
一、一个砸不准的跳劈
腾空下劈类技能的第一版,玩家按下技能,角色跳出了屏幕上沿,然后……凭空掉回来,砸没砸中人全凭缘分。两处欠账:一,角色在屏幕外的那段时间玩家完全丢失了自己的位置;二,落地冲击的范围与玩家心中的预期毫无对应。跳劈的爽感公式是"起跳的舍 + 影子的准 + 落地的狠"——三样里影子是唯一能救命的:它把"我会落在哪、砸多大一片"提前零点九秒画在地上。
二、机制原理:跃出、影子、砸落
跳劈的时间线四拍。跃出拍:角色从原地向上跳出屏幕上沿,离开瞬间地面留一个快速缩小的残影——玩家最后看到的画面是"他往上去了"。影子拍:零点九秒里,落点先是角色大小的小暗影,逐渐扩大成技能判定圈,双圈同步扩张,小圈是人、大圈是范围。砸落拍:零点二二秒内从屏幕上沿砸到影子中心,落地帧炸双层冲击环加一次震屏,圈内的目标全部受击。余韵拍:冲击环散去,落地扬尘慢慢沉降。影子的小圈与大圈同时预告"人身落点"与"伤害范围",读得懂的玩家把脚放在两圈之间最安全。
fx-leap
三、正确写法:影子双圈(幂尔版)
local SkySlam = {}
local CONST = { MSG_ID = 12130, KEY = "SkySlam", WARN = 0.9, FALL = 0.22, RADIUS = 120 }
function SkySlam.Cast(myID, tx)
local myY = SL:GetValue("ACTOR_POSITION_Y", myID)
SkySlam._tx, SkySlam._ty = tx, myY
SkySlam._shadow = CreateLeapShadow(tx, myY, CONST.RADIUS)
SL:SendLuaNetMsg(CONST.MSG_ID, 0, 0, 0,
SL:JsonEncode({ key = CONST.KEY, op = 1, actorID = myID, tx = tx }))
-- 跃出屏 0.4s + 影子期 0.9s 后砸落
SL:ScheduleOnce(function()
SkySlam.Slam()
end, 1300)
end
function SkySlam.Slam()
SpawnSlamShock(SkySlam._tx, SkySlam._ty, CONST.RADIUS)
ScreenShake(0.5)
for _, id in ipairs(SL:GetValue("FIND_IN_VIEW_MONSTER_LIST") or {}) do
local mx = SL:GetValue("ACTOR_POSITION_X", id)
local my = SL:GetValue("ACTOR_POSITION_Y", id)
if math.sqrt((mx - SkySlam._tx) ^ 2 + ((my - SkySlam._ty) / 0.5) ^ 2) <= CONST.RADIUS then
SL:SendLuaNetMsg(CONST.MSG_ID, id, 0, 0,
SL:JsonEncode({ key = CONST.KEY, op = 2, hit = id }))
end
end
end
return SkySlam
四、四个必须钉死的细节
五、心法:离开屏幕前先留下线索
天降系与跳劈系的共同命门是"角色或弹体在屏幕外的时间"。影子、残影、拖尾都是屏幕外的线索投影,投影越早、越准、越稳定,玩家越敢把自己的角色交给你抛出屏幕。一切"看不见的表现"都要在看得见的地方埋一个锚。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 一、一个被投诉的手感 格挡类玩法首测,最扎心的反馈是:"我按了格挡,还是掉血,那我按它干嘛?"复盘发现三档判定…
【游戏功能】 一、一个只写在面板上的攻速 血怒类增益技能初版,面板攻速翻倍,实际战斗里玩家毫无感觉——动作动画的播放速度压根…
【游戏功能】 一、一行代码拆解 ctx.ellipse(0, 0, 26 pul, 44 pul, 0, 0, 7) ——传…
【游戏功能】 一、先抛一个坑 地刺为什么从脚下开始、沿着一条线追到敌阵?做成目标脚下原地一丛刺不行吗?行,但那是控制技。地刺…
【游戏功能】 一、先抛一个坑 三段连斩的第一版做出来,策划看完只说了一句:"这是三个技能吧?"三刀的斩痕分别从上斜、下斜、平…
【游戏功能】 一、一个只有正前方能躲的技能 月刃横扫类范围技能第一版,判定画的是以角色为圆心的整圆,视觉画的是身前一扇新月。…