Lua:不使用`math.random`生成的值

问题描述 投票:0回答:1

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

我有如下代码块:

function PlayState:update(dt)
    -- update timer for pipe spawning
    self.timer = self.timer + dt

    -- spawn a new pipe pair every second and a half
    if self.timer > 2 then
        -- Some code here
    end

    -- Some more code here
end

您可以看到,我每2秒运行一些代码(生成一个对象)。现在,我想使用math.random间隔1到4秒之间生成一个对象。所以我尝试了此操作:

function PlayState:update(dt)
    -- update timer for pipe spawning
    self.timer = self.timer + dt

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

    -- spawn a new pipe pair every second and a half
    if self.timer > timeToCheck then
        -- Some code here
    end

    -- Some more code here
end

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

timeToCheck: 4
timeToCheck: 3
timeToCheck: 1
timeToCheck: 3
timeToCheck: 1
timeToCheck: 4
timeToCheck: 1
timeToCheck: 3
timeToCheck: 1
-- etc..

如果我将timeToCheck更改为硬编码的内容(例如timeToCheck = 3),则对象将按预期的方式分离。

太疯狂了。我在这里想念什么?

UPDATE:

我为self.timer添加了另一条打印消息。另外,我在下面提供了更多代码,因此您可以看到我在哪里重置计时器:

function PlayState:update(dt)
    -- update timer for pipe spawning
    self.timer = self.timer + dt

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

    -- spawn a new pipe pair every second and a half
    if self.timer > timeToCheck then
        -- modify the last Y coordinate we placed so pipe gaps aren't too far apart
        -- no higher than 10 pixels below the top edge of the screen,
        -- and no lower than a gap length (90 pixels) from the bottom
        local y = math.max(-PIPE_HEIGHT + 10, 
            math.min(self.lastY + math.random(-20, 20), VIRTUAL_HEIGHT - 90 - PIPE_HEIGHT))
        self.lastY = y

        -- add a new pipe pair at the end of the screen at our new Y
        table.insert(self.pipePairs, PipePair(y))

        -- reset timer
        self.timer = 0
    end
    -- more code here (not relevant)
end

您可以看到,将计时器重置为0的唯一位置是if语句的末尾。这是print的输出:

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
-- etc...

很抱歉,如果我在这里很密集,但是我对Lua和游戏编程一无所知。请注意,如果我将随机值更改为硬编码的值,例如:

timeToCheck = 3,则可以正常工作。它仅在使用math.random时失败,这确实令人困惑

lua love2d zerobrane
1个回答
0
投票

似乎您正在每帧设置一个新的timeToCheck。由于timeToCheck几乎可以保证每几帧为1,因此这将导致大约每秒产生一次新的刷新。您只需在设置计时器的同时在timeToCheck内设置if

-- reset timer
self.timer = 0
timeToCheck = math.random(4)

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

© www.soinside.com 2019 - 2024. All rights reserved.