我的循环循环次数超出了预期
Posted
技术标签:
【中文标题】我的循环循环次数超出了预期【英文标题】:My loop is looping more than it's supposed to 【发布时间】:2019-05-05 09:54:51 【问题描述】:脚本应该通过降低透明度来逐渐增加发光效果。一旦对象不再被触摸,它应该逐渐失去发光直到不再发光,方法是将透明度增加到 1。
当我让它在运行时打印数值时,我看到数值超过 1 并且似乎以比循环中设置的 .01 更高的间隔计数。它不会逐渐起作用 - 它会在循环运行时突然中断或开启。
我无法弄清楚为什么它会超过 1 或如何将其保持为逐渐增加,即使触摸在达到 100 次循环迭代之前结束。
这是脚本:
local glow = script.Parent.orb
glow1 = 1
-- turn on when touched
glow.Touched:connect(function(obj)
if obj.Parent:FindFirstChild("Humanoid") then
for i = 0, 1, .01 do
glow1 = glow1 - .01
glow.ParticleEmitter.Transparency = NumberSequence.new(glow1)
wait(.1)
print(glow1)
end
glow1=0
end
end)
-- turn off when no longer touched
glow.TouchEnded:connect(function(obj)
wait(3)
if obj.Parent:FindFirstChild("Humanoid") then
for i = 0, 1, .01 do
glow1 = glow1 + .01
glow.ParticleEmitter.Transparency = NumberSequence.new(glow1)
wait(.1)
print(glow1)
end
end
end)
【问题讨论】:
触摸的条件是什么,所以你可以使用while循环?在此示例中,您的循环都将执行 101 次。此外,从 1 到 100 的循环肯定更好读。 【参考方案1】:在循环结束时,glow1
大于 0,因为 0.01 不能精确地表示为浮点数。在我的电脑上,它的值实际上是 0.01000000000000000020816681711721685132943093776702880859375。我猜这是以 2 为底的最接近的近似值。 (尝试print(('%.99f'):format(0.01))
以查看您机器上的确切值。)所以乘以 100 大于 1。
还有其他发帖者在 Lua 中的数学比我好得多,但正如 csaar 可能建议的那样,您可以使用 repeat until
循环来确保 glow1
不会越过边界值 (@987654325 @),或者您可以数除 (for i = 1, 100 do glow1 = i / 100 --[[ do something here ]] end
)。不知道哪个更好。
【讨论】:
glow1 = i * 0.01
更接近 OP 的意图。【参考方案2】:
Touched 事件可能会触发多次。
您可以阅读有关它的更多信息以及如何修复它here。
【讨论】:
以上是关于我的循环循环次数超出了预期的主要内容,如果未能解决你的问题,请参考以下文章