#lua #coronasdk
#lua #coronasdk
Вопрос:
Внутри цикла я изменяю текст текстового поля. Но corona не выполняет рендеринг, пока цикл не будет завершен. Возможно ли принудительный рендеринг внутри цикла?
Я пробовал использовать display.setDrawMode ( «forceRender») и переходить в спящий режим в цикле, но это не имеет значения. Я пытаюсь выполнить панель прогресса, которая обновляется.
Комментарии:
1. Вместо использования цикла рассмотрите возможность использования чего-то вроде «local ProgressTimer = timer.performWithDelay( 1000, UpdateProgress, -1 )», а функция UpdateProgress позаботится об обновлении индикатора выполнения.
Ответ №1:
Corona рендерит только между вашими обработчиками событий. Пока ваш обработчик выполняет циклы, Corona не может обновить отображение. В основном все команды в вашем обработчике, которые влияют на отображение, вступают в силу только после того, как обработчик возвращает управление Corona. Поэтому, если вы хотите повторно отображать изменение значения в текстовом поле, вы не можете использовать цикл, на дисплее будет видно только последнее изменение значения, и только после возврата.
Следовательно, вам необходимо использовать один из механизмов Corona, чтобы заставить обновление произойти снова. Например, вы могли бы прослушать событие Runtime
‘s enterFrame
; там определите, пришло ли время обновить значение и / или текстовое поле, и действуйте соответствующим образом. Если это приводит к слишком большому количеству обновлений (это будет 30 или 60 раз в секунду), то другим способом было бы запланировать обновление текстового поля на более поздний срок, как предлагает Frozire:
function updateValueDisplayed()
...compute new value...
...if changed, update the display object that shows the value...
end
timer.performWithDelay( 500, updateValueDisplayed, -1 )
Вышеуказанное будет вызываться updateValueDisplayed
дважды в секунду, пока вы не завершите работу. Если задержка должна быть разной каждый раз или должна останавливаться при определенных условиях, тогда вы можете performWithDelay
только один раз (удалить третий параметр вызова) и вызывать timer.performWithDelay( delay, updateValueDisplayed)
изнутри updateValueDisplayed
по мере необходимости.
Уточнение: вы не можете использовать for
цикл. Вы можете использовать только повторный вызов функции, два способа описаны выше.
Комментарии:
1. спасибо за ваш ответ, я пробовал оба из них, но ни один из них не работает. Затем функция enterframe обновляется, но как только цикл запускается, функция update останавливается и начинает обновление непосредственно после завершения цикла. Как и corona, использует только один поток.
2. Да, Corona выполняется только в одном «потоке». Вам не нужно создавать новый цикл для непрерывной обработки обновления внутри функции updateValueDisplayed(). Вместо этого вашим циклом становится функция updateValueDisplayed(), эта функция вызывается непрерывно. Итак, вы берете логику внутри своего цикла и помещаете ее в эту функцию.