Lua: значение, сгенерированное из `math.random`, не используется - PullRequest
1 голос
/ 19 апреля 2020

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), то объекты будут разделены, как и ожидалось.

Это безумие , Что мне здесь не хватает?

ОБНОВЛЕНИЕ:

Я добавил еще одно печатное сообщение для 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, и это действительно сбивает с толку

1 Ответ

2 голосов
/ 19 апреля 2020

Похоже, вы устанавливаете новый timeToCheck каждый кадр. Это приведет к новому спавну примерно раз в секунду, поскольку timeToCheck почти гарантированно будет равняться 1 каждые несколько кадров. Вам нужно будет установить timeToCheck только внутри if, в то же время вы установите таймер.

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

Возможно, вам потребуется инициализировать timeToCheck где-нибудь за пределами функции update.

...