【游戏功能】
一、一个冻了个寂寞的冰触
冰封之触首版测试,冰锥命中后怪确实被冻住了——但玩家反馈"冻了像没冻"。冰壳做出来了、色调偏蓝了、怪物停止行动了,三件事全做了但玩家还是觉得没变化。原因出在冰壳的表现力度:冰壳透明度只有一成,怪在冰壳下面照常呼吸——玩家看不出怪被冻了。控制技能的表现命门是"状态的可辨识度",冻住了但看不出来,等于没冻。
二、底层原理
冰封之触的表现由冰锥弹道和冰壳状态两层构成。冰锥弹道是一颗渐变光球从施法者飞向目标,命中后在目标位置炸开冰晶粒子。冰壳状态是目标身上的半透明蓝色圆角矩形,透明度三成,持续期间怪物停止行动。在幂尔框架里,SL:ScheduleOnce 延迟触发冰锥发射、SL:SendLuaNetMsg 在命中时通知服务端施加冻结状态。
fx-frostnova
三、正确写法
local FrostTouch = {}
local CONST = { KEY = 'FrostTouch', FREEZE = 2.0, BOLT_SPEED = 560 }
function FrostTouch.Cast(myID, targetID)
local mx = SL:GetValue('ACTOR_POSITION_X', myID)
local my = SL:GetValue('ACTOR_POSITION_Y', myID) - 52
local tx = SL:GetValue('ACTOR_POSITION_X', targetID)
local ty = SL:GetValue('ACTOR_POSITION_Y', targetID) - 52
SpawnIceBolt(mx, my, tx, ty, CONST.BOLT_SPEED)
SL:ScheduleOnce(function()
FrostTouch.OnHit(targetID)
end, math.sqrt((tx-mx)^2 + (ty-my)^2) / CONST.BOLT_SPEED * 1000)
end
function FrostTouch.OnHit(targetID)
SpawnFrostBurst(targetID)
SL:SendLuaNetMsg(CONST.MSG_ID, targetID, 0, 0,
SL:JsonEncode({ key = CONST.KEY, op = 2, hit = targetID }))
end
return FrostTouch
四、四个必须钉死的细节
五、心法:控制技能的可辨识度是控制玩法的生命线
冰封之触教的通用课是"控制状态必须可辨识":眩晕要冒星、沉默要闭嘴图标、冰冻要挂壳。每种控制状态都要有一个"一眼可辨"的视觉标记。可辨识度不是表现层的可选项,是控制玩法的必要条件——玩家看不见控制发生了,就不会围绕控制来制定策略,控制技能就退化成了纯数值减益。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 heat = heat + 1; if heat = 3 then rest = 1.6 ——两行管刀温的代码…
【游戏功能】 兄弟俩打一只狼,哥哥攒了三层劲自己放,一层加二十五;弟弟站在旁边干瞪眼——直到有人把劲递了过去:同样的三层,过…
【游戏功能】 有篇纠错单写得像小说:同一只狼,有人打它半小时血线稳如老狗,有人三分钟放倒——排查到最后发现,会打的那个从头到…
【游戏功能】 追着你满场跑的狼怪,为什么绕过一根石柱就懵在原地?脱影的答案藏在柱子背后:视线被石柱掐断一秒二,它脑子里"你"…
【游戏功能】 巡查群里有人喊邪门:同一套连招,昨天刀刀见血,今天刀刀被挡——查录像看到第三遍才看懂:狼怪学会了。他的出刀间隔…
【游戏功能】 if hand == last then acid = acid + 1 ——一行数手的判定,攒出了换手全部的…