Правильное повторное выполнение сопрограммы? - PullRequest
1 голос
/ 30 апреля 2019

Я создаю игру, используя lua; Мне нужен таймер для запуска во время игровых перерывов, а также во время игровых раундов. Игра изначально выполняется с перерывом в 15 секунд. В этом случае таймер работает нормально, но последующие вызовы функции, похоже, не вызывают его вообще ... какие-либо советы?

Я пытался поменять метод создания сопрограммы на coroutine.wrap () вместо coroutine.create (). При успешном запуске после первого вызова состояние сопрограммы по-прежнему кажется уступающим.

Упрощенная логика показана здесь: где секунды - это int, а окончание - логическое значение

module.startTimer = coroutine.create(function(seconds,ending)
    wait()
print("Timer starting with: "..seconds.." seconds...round ending: "..tostring(ending))
while seconds > -1 do
    wait(1)
    seconds = seconds - 1
end
if ending == true then
    coroutine.yield(module.startTimer)
else
    coroutine.yield(module.startTimer)
end
end)

Первый звонок (работает):

print(coroutine.status(module.startTimer))
coroutine.resume(module.startTimer,15,false)
wait(1)
print(coroutine.status(module.startTimer))

отпечатки: приостановлено, приостановлено

Второй вызов (не работает): где RoundLength.Value - проверяемое значение типа int (300), которое успешно печатается.

print(coroutine.status(module.startTimer))
coroutine.resume(module.startTimer,CURRENT_ROUND:FindFirstChild("RoundLength").Value,true)
wait()
print(coroutine.status(module.startTimer))
wait(CURRENT_ROUND:FindFirstChild("RoundLength").Value)

Ничего не печатает, выполнение не выполняется, startTimer не печатает статус.

1 Ответ

1 голос
/ 30 апреля 2019

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

Как написано, функция будет зацикливаться, пока не пройдет времяout, затем возвращает себя (?), так что его собственное значение функции будет возвращено из вызова coroutine.resume.

Как только оно возобновится, оно снова начинается с вызова couroutine.yield, достигает концафункции и возвращает, завершая выполнение сопрограммы.

...