【游戏功能】
为什么棒球里全垒打最值钱?因为球在天上的那一秒,全场的眼睛都仰着头。全垒把这份仰头搬进了打架:一记挑空把小怪送上半空——它在天上蹬腿的那一瞬,一记扣杀砸下去:它挨十六,被砸成炮弹的大怪垫背二十四。这篇把整套模块拆开:配置表、挑空构件、扣杀判定、定时器、调试按钮,一段一段照抄能跑。
一、效果演示:挑空一拍,扣杀一锤
演示场一只大怪带一只小怪。点「挑空!」:玩家一记上勾拳把小怪打上半空——它在空中划到最高点又往下落,头顶挂着"空中!点扣杀"的读秒。这一秒三是全套的窗口:手够快,点「扣杀!」——半空中一记重锤,小怪吃十六,整只怪被砸得斜飞出去,结结实实砸在大怪身上——垫背二十四点,大的晃三晃。手慢了,小怪落地,"没接住"三个字灰溜溜的,再挑一次就是。演示里练的是那一拍的节奏:挑空是发球,扣杀是接发,两拍之间的空当全凭手感。全垒打的是连招,更是时机。
fx-homerun
二、底层原理:一段滞空窗口加一次空中结算
模块的机关是一对搭档。滞空窗口:挑空那一拍小怪挂一段一点三秒的滞空态——模型沿抛物线上天再落回,滞空期间它的行为冻结、受击解锁,头顶的读秒就是窗口的明账。空中结算:扣杀只在滞空态有效——半空的小怪先吃十六点,随即被砸成飞行道具斜飞向大怪,大怪吃二十四点垫背伤,一锤两响。和击退推撞那类位移伤害的分野在"打的是空中的":推掌推地上的,扣杀砸天上的——滞空态是扣杀的门票,地上的怪连被砸的资格都没有。
扣杀为什么必须两段按钮而不是挑空自动接?自动接的版本玩家只按一次键看动画,全垒的乐趣少一半;两段的节奏把"发球"和"接发"都交给玩家的手——时机是自己掐的,爽才是自己挣的。
三、核心代码:完整模块(上·骨架)
-- @file HomeRun.lua
-- 全垒 —— 把小怪挑上天,一记扣杀双倍入账
local HomeRun = {}
local CONST = {
AIR_TIME = 1.3,
AIR_HEIGHT = 110,
LOB_DMG = 0,
SPIKE_DMG = 16,
BACK_DMG = 24,
LOB_CD = 3.0,
COLOR_SMASH = "#e86848",
COLOR_DEEP = "#5e1a10",
COLOR_GHOST = "#f8c0b0",
ZORDER_AIR = 136,
ZORDER_FX = 135,
AUTOINC_BASE = 1014000,
}
local _airT = 0
local _airID = 0
local _cdLeft = 0
local _scheduler = nil
local _autoInc = 0
local function GenID(prefix)
_autoInc = _autoInc + 1
return string.format("%s_%d", prefix or "HMR",
CONST.AUTOINC_BASE + _autoInc)
end
local function GetActorPos(id)
if not id then return nil end
local x = SL:GetValue("ACTOR_POSITION_X", id)
local y = SL:GetValue("ACTOR_POSITION_Y", id)
if not x or not y then return nil end
return { x = x, y = y }
end
local function SafeRemove(node)
if node and not GUI:Widget_IsNull(node) then
GUI:removeFromParent(node)
end
end
local function ShowTip(msg)
if msg and msg ~= "" then SL:ShowSystemTips(msg) end
end
function HomeRun.Lob()
if _cdLeft > 0 then
ShowTip("手在抬——" .. string.format("%.1f", _cdLeft) .. "秒")
return
end
if _airT > 0 then
ShowTip("正飞着——快扣杀!")
return
end
local tid = SL:GetValue("MARK_SMALL_ID")
if not tid or SL:GetValue("ACTOR_DEAD", tid) then
ShowTip("小的没了——没得挑了")
return
end
_cdLeft = CONST.LOB_CD
_airT = CONST.AIR_TIME
_airID = tid
SL:LaunchActorUp(tid, CONST.AIR_HEIGHT, CONST.AIR_TIME)
SL:PlayLobFx(tid)
SL:TipAbove(tid, "上天!")
ShowTip("挑上天了——趁它下落前点扣杀")
end
四、核心代码:完整模块(下·定时器与扣杀结算)
-- 扣杀:滞空态里的一锤两响
function HomeRun.Spike()
if _airT <= 0 then
ShowTip("它在地上——先挑空再扣杀")
return
end
local tid = _airID
_airT = 0
SL:ActorHurt(tid, CONST.SPIKE_DMG)
SL:TipAbove(tid, "扣-16")
SL:PlaySpikeFx(tid)
SL:ScreenShake(3, 0.2)
SL:ThrowActorAt(tid, SL:GetValue("MARK_TARGET_ID"),
0.26)
SL:DelayCall(0.26, function()
local bigID = SL:GetValue("MARK_TARGET_ID")
local bp = bigID and GetActorPos(bigID)
if bp then
SL:ActorHurt(bigID, CONST.BACK_DMG)
SL:TipAbove(bigID, "垫背-24")
SL:PlayBackSmashFx(bigID)
ShowTip("双倍全垒——它挨十六,大的垫背二十四")
end
if SL:GetValue("ACTOR_HP", tid) <= 0 then
SL:KillActor(tid)
end
end)
end
-- 定时器:滞空读秒与落地兜底
if not _scheduler then
_scheduler = SL:Schedule(function(dt)
_cdLeft = math.max(0, _cdLeft - dt)
if _airT > 0 then
_airT = _airT - dt
if _airT <= 0 then
ShowTip("它落地了——没接住,再挑一次")
end
end
end, 0.02)
end
SL:ScheduleOnce(function()
SL:BindDebugButton("挑空", function()
HomeRun.Lob()
end)
SL:BindDebugButton2("扣杀", function()
HomeRun.Spike()
end)
ShowTip("技能已加载: 全垒 (调试按钮触发)")
end, 1.0)
function HomeRun.Unload()
if _scheduler then SL:Unschedule(_scheduler) end
_airT = 0
end
return HomeRun
五、机制问答
问:扣杀能砸地上的怪吗?
答:不能——扣杀认滞空态,地上的它连被打的资格都没有,这也是全垒必须两段的原因:先发球,才有的接。
问:挑空的小怪是干嘛的都行吗?
答:有分量就行——空中的它只是弹药,韧性太高的头目挑不起来,说明栏写明"小型单位可挑"。
问:滞空期别的怪会护它吗?
答:不会——行为冻结的它等于暂离战场,大怪照常冲着你来,全垒的全程大怪不受任何影响。
问:扣杀那锤能暴击吗?
答:能——十六和垫背的二十四都走正常结算,双暴的全垒是这套连招的头奖,砸得全场起立。
问:它落地上没死,还能再挑吗?
答:能——落地回冷却,三秒后另一记挑空再来一遍,没接住的球重新发。
六、调参指南与商业服怎么用
第四笔是滞空的长度:一点三秒是"看清抛物线、来得及点钮"的窗口——一秒的窗口纯拼反应,两秒的滞空怪在空中睡着,节奏感的甜区就在一点三。第三笔是双响的比例:十六加二十四的四成垫背是"空中的它比地上的值钱"的定价——垫背太薄扣杀不如平砍,太厚大怪战变棒球赛。第二笔是落地的宽容:落地不清挑空冷却——没接住的球重新发,惩罚只丢时机不丢资源,练节奏的机制别拿资源吓人。第一笔是空中的戏份:小怪在空中的蹬腿和落地土崩全套配上——空中的那一秒是全垒的招牌帧,招牌糊了,整套连招就降了档。常见坑三个:滞空的小怪成了无敌靶,范围技打不着也躲不掉;扣杀期间再点挑空,两段动画打架;垫背的大怪恰好死亡,尸体的结算顺序出错。
商业服里全垒是"重锤流派"的高光时刻:两段按键一秒半,全场最响的一锤——商城里扣杀的锤纹做成品级,铁锤、星锤、流星锤,砸下去那一圈橙光就是重锤手的全垒打纪念。运营落地还有两笔:一段是连招教学——教一句"挑了就接,别让它落地",流派的手感课一句话开蒙;一段是全垒榜——按单次扣杀加垫背的总伤排名,最响的一锤有据可查。变体做成三连全垒:扣杀把小怪砸向第二只小怪再弹向大怪——一颗弹珠打三只,台球的手感搬进战场。这一篇的演示和整套模块照抄能跑,改的就是 CONST 那张表。
补一拍手感:挑空之后数半拍再点扣杀,抢拍的锤全抡在空气上。
写完留一句给做连招系的同学:全垒卖的是"天上的一秒"——把怪挑上去的手和把它砸下来的手要是同一个人,这一锤才算真的双倍。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 香烧着的时候,人心最定。焚香把这句老话做成了机制:点一炷八秒的香,香烧着的三刀一叩首——每叩一回,血回六点。香…
【游戏功能】 下一封战书是什么概念?是你和它同时签下"六秒内往死里打"的字据:你加三,它加四——它的刀更疼,你的刀也不再客气…
【游戏功能】 日志里躺着一条没人在意的细节:某只头目的治疗明细里,回血来源写着一颗珠子的名字——两颗珠子轮流替它回血,每两秒…
【游戏功能】 oil = oil - 1 —— 灯芯上两秒烧掉的一滴油,就是挑灯的全部家底:灯亮着,刀足十;油见底,刀软成五…
【游戏功能】 守塔组出过一单静悄悄的失误:同一批怪,同样的守塔人,有的晚上一血没掉,有的被摸了三回——查录像才发现,守得住的…
【游戏功能】 为什么有些玩家越打越软?前二十刀刀刀十点,二十刀之后刀刀四点——装备没变,变的是气。匀气把这件事做成了明账:五…