【游戏功能】
指南车是古代的导航黑科技:车怎么转,车上小人的手永远指着南边——齿轮抵消了车身的每一度转向。今天拆指南车的表现,看"方向不变"这个承诺怎么在转弯的车上兑现。
一、转弯、抵消、指向三段齿轮
指南车的机械三段。转弯段:车沿轨迹行驶,遇到弯道车身随路径转向——车的朝向一直在变,这是所有车辆的本能。抵消段:车内的差动齿轮把车身的转向角等量反向传导到小人的底座——车身转多少度,小人底座就反转多少度,两相抵消。指向段:小人站在底座上,手臂永远指向南方——指向的"永远"就是指南车的承诺:转弯、掉头、绕圈,小人纹丝不动。三段的机械核心是"抵消":车身的转向被齿轮完美吃掉,小人的指向才恒定如初。
完整演示在这,默认自动循环:
fx-southpoint
二、幂尔框架实现:车身转向与小人的反旋
车身沿轨迹转,小人的旋转做反向抵消:
local SouthPoint = {}
local cartAng, turnT, turnDir = -1.5708, 0, 1
function SP.Tick(dt)
-- 车沿轨迹行驶 + 随机转弯
if turnT > 0 then
turnT = turnT - dt
cartAng = cartAng + turnDir * (SL:GetValue("turnRate") or 80) / 100 * 1.4 * dt
else
turnT = 1.5 + math.random() * 2
turnDir = math.random() < 0.5 and -1 or 1
end
local x = SL:GetValue("trackCX") + math.cos(cartAng) * SL:GetValue("trackR")
local y = SL:GetValue("trackCY") + math.sin(cartAng) * SL:GetValue("trackR") * 0.8
SL:SetActorPos("cart", x, y)
SL:SetActorRotate("cart", cartAng * 2.4)
-- 小人: 底座反向旋转抵消车身转向
SL:SetActorRotate("figure", -cartAng * 2.4)
-- 小人手臂永远指向南方
SL:DrawArm("figure", 0, 14)
end
function SP.AutoDrive()
-- 自动行驶: 随机转弯段与直行段交替
if turnT <= 0 and math.random() < 0.8 then
turnT = 1 + math.random() * 1.5
turnDir = math.random() < 0.5 and -1 or 1
end
end
return SP
小人的反旋系数和车身的正旋系数完全相等——抵消是精确的数学关系,不是近似的视觉补偿。
三、转向速率与指向的试金石
转向速率滑块是齿轮的试金石:速率低时小人纹丝不动,速率拉满小人微微颤动——颤动的幅度就是齿轮抵消的误差,误差可见说明机械是活的。轨迹圈的行驶方向随机反转:顺时针走三秒逆时针走两秒,转向的随机让"齿轮在工作"这件事持续可见——匀速转圈的指南车看不出齿轮在干活。指向的"南"用红色标注在轨迹圈正下方:红色的"南"字是全场的方位锚,小人的手臂、红字的位置、轨迹圈的方位三点一线——指南车的"南"不是画出来的,是全场景的坐标原点。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【游戏功能】 if _shadowT 0 then spd = noShadow and 12 or 24 end ——一行…
【游戏功能】 魂卫的全机制就一句:杀掉小怪化一盏魂火跟着你走,每盏魂火两秒自动劈最近的大怪一口八点,至多三盏——「引魂!」按…
【游戏功能】 一道咒飞过来,硬吃是四秒里一秒十的钝疼——有没有第三条路?纸人替灾给的就是第三条路:贴一个纸人在身后,八秒里头…
【游戏功能】 挨打还能赚钱?水镜式的答案是:挨的刀七成存进镜里不扣血、三成照常疼,六秒后点「还镜」,存量乘一点五放成水炮——…
【游戏功能】 if _mirrorT 0 then SL:TipAboveMe("免疫") return end ——一道写…
【游戏功能】 远近战的矛盾怎么解?远战的答案是把怪挡在射程外,近战的答案是把人拖进射程内——缩地阵给的第三个答案最蛮横:圈只…