Lua: 由于未使用`math.random`生成的值

对我来说,Lua是一种新的语言,但我现在看到的行为完全令我困惑。

我有一段代码块如下所示:

function PlayState:update(dt)
    -- 更新管道生成计时器
    self.timer = self.timer + dt

    -- 每1.5秒产生一个新的管道
    if self.timer > 2 then
        -- 在这里加入代码
    end

    -- 在此处添加更多代码
end

如您所见,我每2秒(生成一个物体)运行一些代码..现在我想要使用math.random来产生1到4秒之间的物体..于是我尝试了这个:

function PlayState:update(dt)
    -- 更新管道生成计时器
    self.timer = self.timer + dt

    timeToCheck = math.random(4)
    print('timeToCheck: ' .. timeToCheck)

    -- 每1.5秒产生一个新的管道
    if self.timer > timeToCheck then
        -- 在这里加入代码
    end

    -- 在此处添加更多代码
end

但是这不起作用..当我这么做时,对象之间的距离为零。 我添加了print('timeToCheck: ' .. timeToCheck)来查看随机数是否被正确生成,确实如此。 输出如下所示:

timeToCheck: 4
timeToCheck: 3
timeToCheck: 1
timeToCheck: 3
timeToCheck: 1
timeToCheck: 4
timeToCheck: 1
timeToCheck: 3
timeToCheck: 1
-- 等等..

如果我将“timeToCheck”更改为硬编码值(例如:“timeToCheck = 3”),那么对象将按预期分隔。

太疯狂了。 我在这里遗漏了什么?

更新:

我为“self.timer”添加了另一个打印消息。此外,我在下面包括了更多代码,以便您可以看到我在哪里重置计时器:

function PlayState:update(dt)
    -- 更新管道生成计时器
    self.timer = self.timer + dt

    timeToCheck = math.random(4)
    print('timeToCheck: ' .. timeToCheck)
    print('self.timer: ' .. self.timer)

    -- 每1.5秒产生一个新的管道
    if self.timer > timeToCheck then
        -- 修改我们放置的上一个Y坐标,使管道间隙不要太远
        -- 不得高于屏幕顶部的10个像素,
        -- 不得低于底部距离的间隙长度(90个像素)
        local y = math.max(-PIPE_HEIGHT + 10,
            math.min(self.lastY + math.random(-20, 20), VIRTUAL_HEIGHT - 90 - PIPE_HEIGHT))
        self.lastY = y

        -- 在屏幕的末尾添加一个新的管道对
        table.insert(self.pipePairs, PipePair(y))

        -- 重置计时器
        self.timer = 0
    end
    -- 更多代码在这里(不相关)
end

如您所见,我唯一重置计时器为0的地方是在if语句的末尾。 这里是打印的输出:

timeToCheck: 2
self.timer: 1.0332646000024
timeToCheck: 4
self.timer: 1.0492977999966
timeToCheck: 1
self.timer: 1.0663072000025
timeToCheck: 2
self.timer: 0.016395300015574
timeToCheck: 4
self.timer: 0.032956400013063
timeToCheck: 2
self.timer: 0.049966399994446
timeToCheck: 2
self.timer: 0.066371900000377
timeToCheck: 3
self.timer: 0.083729100006167
-- 等等...

不好意思,如果我在这里很迟钝,但我对Lua和游戏编程完全是外行..请注意,如果我将随机值更改为硬编码值,例如:

timeToCheck = 3,那么它可以正常工作。 只有当我使用math.random时,它才会失败,这真的很令人困惑。

点赞
用户3574628
用户3574628

看起来你每帧都在设置一个新的 timeToCheck。这将导致大约每秒钟产生一次新的生成,因为 timeToCheck 几乎保证每几帧就是 1。你需要仅在 if 语句中设置 timeToCheck,同时设置计时器。

-- 重置计时器
self.timer = 0
timeToCheck = math.random(4)

你可能需要在 update 函数之外的某个地方初始化 timeToCheck

2020-04-19 06:52:29