我的循环循环超出预期范围

时间:2018-12-04 02:52:51

标签: loops lua transparency roblox

该脚本应该通过降低透明度来逐渐增加发光效果。一旦不再触摸物体,则应通过将透明度增加回1来逐渐失去发光,直到不再发光为止。

由于它在运行时打印数字值,因此我看到这些值超过了1,并且似乎比循环中设置的.01高。它不会逐渐起作用-在循环中切出或突然切开。

即使触摸在到达循环的100次迭代之前结束,我也无法弄清楚为什么它超过1或如何使其逐渐增加。

这是脚本:

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)

2 个答案:

答案 0 :(得分:3)

在递增计数的循环结束时,glow1大于0,因为0.01不能精确地表示为浮点数。在我的计算机上,它的值实际上是0.01000000000000000020816681711721685132943093776702880859375。我猜这是基数2中最接近的近似值。 (尝试print(('%.99f'):format(0.01))来查看计算机上的确切值。)因此,乘以100会大于1。

还有其他一些海报作者在Lua的数学方面比我更好,但是正如csaar可能暗示的那样,您可以使用repeat until循环来确保glow1不会越界值(glow1 = 0.01 repeat --[[ do something here ]] glow1 = glow1 + .01 until glow1 > 1),也可以计数和除以(for i = 1, 100 do glow1 = i / 100 --[[ do something here ]] end)。不知道哪个更好。

答案 1 :(得分:1)

Touched事件可能会触发多次。

您可以了解有关它的更多信息以及如何修复它here