Генерировать случайное число, но каждые случайные секунды в LUA/Love2d

Я пытаюсь сгенерировать случайное число каждые случайные секунды (конечная цель будет состоять в том, чтобы время от времени случайным образом менять цвет блока).

Для этого я использую библиотеку Hump (http://vrld.github.io/hump/#hump.timer).

Вот мой код на данный момент, я настоящий новичок в кодировании LUA/Love2d. Он генерирует число и отображает его каждые секунды, а не каждые случайные секунды... (но также генерируются случайные секунды). Я не очень понимаю, почему он не работает.

local Timer = require "timer"

function love.load()
    text="t"
    number2=1
end

local f = function()
math.randomseed(os.time())
    number = math.random( 2,10 )
    text="in " .. number2 .. " seconds (random)...  random number =" .. number
    return true
end

function love.update(dt)

    number2 = math.random( 2,4 ) 
    Timer.update(number2)
    Timer.addPeriodic(number2, f)
end

function love.draw()
    love.graphics.print( text, 330, 300 )
end

Спасибо за любую помощь!


person hycday    schedule 11.06.2014    source источник
comment
Вызовите math.randomseed(os.time()) только один раз в своей программе.   -  person lhf    schedule 11.06.2014
comment
мой плохой, я удалил тот, что в love.update, но проблема остается.   -  person hycday    schedule 11.06.2014
comment
В обновленном коде вы по-прежнему вызываете f в love.update, что означает, что math.randomseed по-прежнему вызывается более одного раза.   -  person Yu Hao    schedule 12.06.2014
comment
хорошо, теперь я понимаю лучше. Мне также нужно было переместить «число2» в функцию, а не вызывать «f» в «love.update»… но у меня была проблема, когда текст печатался каждые 0,1 секунды, поэтому я снова изменил код и придумал с чем-то почти похожим на то, что предложил Анри Ильген ниже!   -  person hycday    schedule 12.06.2014


Ответы (1)


Хотя я не знаком с Hump, кажется, что вы можете легко использовать функцию добавления таймера для своих целей, поскольку она будет вызывать функцию ровно один раз через x секунд, что позволит вам запланировать следующее выполнение с другой задержкой:

local timer = require("timer")
local text = ""

local function tick()
  -- Generate random number
  local newNumber = math.random(2, 10)
  local newDelay  = math.random(2,  4)
  text = ("Current number: %d, next in %d seconds!"):format(newNumber, newDelay)

  -- Actually schedule the next call
  timer.add(newDelay, tick)
end


function love.load()
  tick()
end

function love.update(dt)
  timer.update(dt)
end

function love.draw()
  love.graphics.print(text, 330, 300)
end
person Henrik Ilgen    schedule 12.06.2014