【游戏功能】
一、先抛一个坑
套圈摊位的圈扔出去,为什么有的游戏圈是抛物线飘过去的,有的是直线飞过去的?直线圈的判定简单,但视觉上"扔"的感觉全无——套圈的乐趣一半在圈的飞行轨迹里:圈脱手时向上抛、到顶点悬一下、再加速下坠,最后落在奖品堆上是套中还是弹开,悬念全在弧线的后半段。抛物线飞行加落点判定,就是套圈玩法的全部骨架。
二、机制原理:抛物线与落点判定
套圈的圈有两态。飞行态:脱手时给初速度和向上的分量,重力每帧累加纵向速度,圈沿抛物线前进,同时自旋增加"活物感"。落地态:纵坐标到达地面判定线,检查圈的横坐标与各奖品柱的距离——小于套中半径即套中,奖品柱高亮标记;没套中则圈弹一下滚出屏幕。套中半径是难度旋钮:柱宽一点二倍是休闲,零点八倍是硬核。圈的横向初速度带随机扰动,每次扔的手感微差才像真人扔的。
fx-ringtoss
三、正确写法:套圈抛投(幂尔版)
local RingToss = {}
local CONST = { MSG_ID = 12240, KEY = "RingToss", LEFT_MAX = 5, GRAVITY = 500 }
function RingToss.OnToss(myID)
if (RingToss._left or 0) <= 0 then
SL:ShowSystemTips("圈用完了, 点重摆")
return
end
RingToss._left = (RingToss._left or CONST.LEFT_MAX) - 1
local r = {
x = 120, y = 210,
vx = 150 + math.random() * 60, -- 横向初速带扰动
vy = -260, -- 上抛分量
spinning = true
}
table.insert(RingToss._rings, r)
SL:SendLuaNetMsg(CONST.MSG_ID, 0, 0, 0,
SL:JsonEncode({ key = CONST.KEY, op = 1, actorID = myID }))
end
function RingToss:UpdateRings(dt)
for _, r in ipairs(self._rings) do
if not r.landed then
r.vy = r.vy + CONST.GRAVITY * dt -- 重力累加
r.x = r.x + r.vx * dt
r.y = r.y + r.vy * dt
if r.y >= GROUND_Y and r.vy > 0 then -- 落地判定
r.landed = true
for pi, prize in ipairs(self._prizes) do
if math.abs(r.x - prize.x) < RING_RADIUS then
self:WinPrize(pi) -- 套中!
break
end
end
end
end
end
end
return RingToss
四、四个必须钉死的细节
五、心法:抛物线是免费的手感
套圈、投掷、投篮、扔雪球,一切"扔出去"的玩法都在抛物线里找手感:初速定远近、重力定下坠、随机扰动定人味。这三参数调平了,扔什么都有灵魂。反过来,直线飞行的投掷物无论贴图多精美,玩家一眼就认定"这不是物理世界的东西"。表现系统的物理感不需要真物理引擎,一条抛物线就够开场。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 一刀才二十,凭什么说它是好技能?放血的账要等五秒后才看得全:刀口一开,血自己往外淌,五口小额慢扣,总账远超那一…
【游戏功能】 从它头顶翻过去,落地的哪一秒最疼?答案是它转过身来之前的那半秒。燕返的全套设计都围着这半秒转:起跳掠过头顶、落…
【游戏功能】 移速快两成有什么用?打不到人的时候才知道。疾行术是这批技能里数值最朴素的一个——没有伤害、没有控制,就一条移速…
【游戏功能】 太极阵的骨架就这一行:在地上画一个会转的阴阳圈。但让怪物"身不由己"往阵心走的,不是这个圈的画,是圈里每帧都在…
【游戏功能】 明明开着护甲,怎么比裸奔掉血还快?有人把神圣战甲术和金刚护体混为一谈——罩是先扣罩值再掉血,甲是每一刀 打对折…
【游戏功能】 血条见底的时候,道士的刀为什么还在回血?血刀术的反直觉就在这:伤害照给、血也照回,两条账同时走——它不是"吸血…