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
时失败,这确实令人困惑
似乎您正在每帧设置一个新的timeToCheck
。由于timeToCheck
几乎可以保证每几帧为1,因此这将导致大约每秒产生一次新的刷新。您只需在设置计时器的同时在timeToCheck
内设置if
。
-- reset timer
self.timer = 0
timeToCheck = math.random(4)
您可能需要在timeToCheck
函数之外的某个地方初始化update
。