【游戏功能】
赛季结算那天出了个乌龙:赛马玩法的彩金发了双倍,运营追着要撤回,技术一查,是某玩家在冲线前一帧改了押注,结算取的是"冲线时的押注"而不是"开赛时的押注"。一行取值时机的差别,赔穿了一个奖池。今天拆赛马竞速的表现,顺带把"押注锁定"这门课补上。
一、押注、起跑、冲刺三段拍
赛马的节奏三段。押注段:四匹马列在四条赛道,名字、毛色一目了然,点选哪匹哪匹头顶亮"押"字标——押注在开赛前随时可改,开赛瞬间锁死。起跑段:四马并辔冲出,步频动画各自独立,蹄下扬尘按速度差异化。冲刺段:每匹马随机进入爆发冲刺,红光缠身、速度翻倍、持续半秒——爆发的时机和马匹都随机,四马你追我赶,冲线顺序常常直到最后一刻才揭晓。冲线瞬间终点旗抖动、彩带按名次喷发,押中的话金色彩金从天而降——双倍彩金的"双倍"要用金雨的量级直接砸给玩家看。
完整演示在这,押注后开赛:
fx-horserace
二、幂尔框架实现:爆发随机与押注锁定
马匹的速度是基础速加随机爆发的叠加,押注在开赛时快照:
local HorseRace = {}
local KEY = { BASE = 95, BURST = 130 }
local race = { running = false, bet = -1, finish = {} }
function Race.PlaceBet(horseId)
if race.running then
SL:ShowSystemTips("开赛了, 不能改注")
return
end
race.bet = horseId
SL:ShowTipAbove("horse" .. horseId, "押")
end
function Race.Start()
if race.running or race.bet < 0 then
SL:ShowSystemTips("先押一匹马")
return
end
race.running = true
race.finish = {}
-- 每匹马独立推进
SL:Schedule(function(dt)
local allDone = true
for id = 0, 3 do
if not race.finish[id + 1] then
allDone = false
local burst = 0
if math.random() < dt * 0.9 then burst = 0.5 + math.random() * 0.7 end
local spd = KEY.BASE + burst * KEY.BURST
SL:MoveActorX("horse" .. id, spd * dt)
SL:PlayDust("horse" .. id, id % 2 == 0)
local x = SL:GetValue("actorX", "horse" .. id)
if x >= 600 and not race.finish[id + 1] then
race.finish[#race.finish + 1] = id
if #race.finish == 1 then Race.Settle(id) end
end
end
end
if allDone then SL:UnSchedule("horseRun") end
end, 0.016, "horseRun")
end
function Race.Settle(champion)
if champion == race.bet then
SL:PlayFxAt("gold_rain", 600, SL:GetValue("laneY", champion))
SL:SetValue("payout", SL:GetValue("payout") * 2)
SL:ShowSystemTips("押中了! 双倍彩金")
else
SL:ShowSystemTips(NAMES and "没押中" or "下次再来")
end
-- 押注快照清空, 下一局重新押
race.bet = -1
end
return HorseRace
Settle 读的是开赛时快照的 race.bet——冲线前改注在这套结构里根本无处下手。
三、爆发的公平幻觉
随机爆发的节奏是赛马的戏肉:爆发间隔做成"独立掷骰"而不是轮流雨露均沾——有马连爆两次一骑绝尘,有马全程爆不出一次垫底,悬殊才有故事。但基础速要保证四马差距在冲线前收得住,最差的马也有机会靠一波连爆反超——"看起来谁都有机会"比"确实谁都有机会"更重要,这是表现层心照不宣的分工。冲线后剩余的马继续跑完,别瞬间清场——观众还想看名次,赛马的世界里第二名也有掌声。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 零点一秒之内,血条无端少了一截——没有刀光没有红字,人却已经站在它嘴边了。吸力的机制就是这场无声的绑架:它吸气…
【游戏功能】 有块场地被玩家们称作"阅兵场":一尊石像立在正中,眼睛扫出的一道红光从场子这头滚到那头,碰着就烧——新手进场先…
【游戏功能】 seal.x = P.x ——一行把雷的落点锁在你此刻坐标的代码,写尽了雷印全部的凶险:被点名的三秒后,雷落在…
【游戏功能】 单子上写着一场三连摔:狼怪每跺一次地,玩家就摔一个跟头,三连摔摔出了真火气——直到有人教他一个字:跳。地波的机…
【游戏功能】 火力全开轰在主母身上,伤害数字却全是"免伤"的白字——多少人跟这道白打的罩子耗到弹尽粮绝,才有人喊一句:先杀小…
【游戏功能】 伤害统计里有条诡异的曲线:同一场仗,前半段每刀挨十五,后半段每刀挨三十——配置没人动过,狼怪却像换了个人。狂暴…