2016-01-25 1 views
3

Редактировать: Этот вопрос касается Roblox Lua.Есть ли способ всегда начинать с 0, используя math.sin() Lua

Я использую math.sin(tick()), чтобы получить переменное число и хотел бы, чтобы он всегда начинался с 0. Возможно ли использование math.sin? Есть ли что-то еще, что я могу использовать, кроме tick(), чтобы сделать эту работу?

Пример:

for i = 1, 10 do 
    local a = math.sin(tick())+1 
    print(a) 
    wait() 
end 
wait(1) 
for i = 1, 10 do 
    local a = math.sin(tick())+1 
    print(a) 
    wait() 
end 

Моя цель состоит в том, чтобы этот стартовый номер в 0 каждый раз, а затем увеличить оттуда. Таким образом, он начинался с 0, затем увеличивался до 2, а затем уменьшался до нуля и продолжал модулировать между 0 и 2 до тех пор, пока я продолжаю называть его. Используя пример выше, число начинается с любого произвольного числа от 0 до 2.

+0

Что такое «тик»? Это не стандартная функция Lua. –

+0

@Nicol Это функция ROBLOX, она возвращает количество секунд с 1 января 1970 года (я думаю). Имеет некоторые десятичные знаки. – warspyking

+0

@NicolBolas Возвращает локальное время UNIX. –

ответ

1

Чтобы не-Roblox пользователей: tick() возвращает местное время UNIX. wait(t) дает текущую резьбу для t секунд, наименьший возможный интервал составляет примерно 1/30 секунды.

Учитывая, что math.sin(0) равно 0, вам нужно вычесть tick() внутри цикла с началом цикла. Это должно сделать выражение внутри math.sin начинаться с примерно 0 в начале цикла.

local loopstart = tick() 
for i = 1, 10 do 
    local a = math.sin(tick() - loopstart)+1 
    print(a) 
    wait() 
end 
+0

Спасибо, xaxa. Это рабочее решение, использующее math.sin (tick()). @KeithThompson сделал то же предложение, и он работает. Он начинается с 1 вместо 0, но самая важная часть состоит в том, что он начинается с одного и того же номера каждый раз. Отлично. Я за исключением этого как ответа. – JJJ

2

Я принял другой подход и придумал это. Он делает именно то, что я хотел сделать с помощью math.sin (tick()). Если кто-то знает другие способы сделать это, я хотел бы знать.

local n = 0 
    local m = 0 
    local Debounce = true 

    local function SmoothStep(num) 
     return num * num * (3 - 2 * num) 
    end 

    while Debounce do 
     for i = 1, 100 do 
      wait() 
      m = m+.01 
      n = SmoothStep(m) 
      print(n) 
    if not Debounce then break end 
     end 

     for i = 1, 100 do 
      wait() 
      m = m+.01 
      n = SmoothStep(m) 
      print(n) 
    if not Debounce then break end 
     end 
    end 
+1

Это не * точно * то же самое. Если вы нарисуете напечатанные значения, вы увидите треугольную волну, а не синусоидальную волну. Если это соответствует вашим целям, все в порядке. –

+1

Я вижу. Это соответствует моей цели, но да, это не совсем то же самое. Я редактирую его и добавляю функцию плавного перехода, чтобы приблизить ее к истинной синусоидальной волне. – JJJ