imagine que tenho algo assim
void color(int a)
{
if (a > 10)
{
return;
}
square[a].red();
sleep(1second);
color(a+1);
}
while (programIsRunning())
{
color(1);
updateProgram();
}
mas com algo que realmente requer uma função recursiva. como posso chamar essa função recursiva para colorir os quadrados um por um. porque por si só é muito rápido e se o programa está sendo atualizado a cada quadro. eles ficam coloridos instantaneamente quando eu quero que eles sejam coloridos um por um (com um atraso).
sleep()
fará com que o thread atual pare. Isso o torna um péssimo candidato para atrasos perceptíveis no thread principal.
Você "poderia" ter um encadeamento que apenas lida com esse processo, mas os encadeamentos são caros, e criar / gerenciar um apenas para colorir quadrados em uma sequência é totalmente exagero.
Em vez disso, você poderia fazer algo como: Sempre que o programa for atualizado, verifique se é o momento apropriado para colorir o próximo quadrado.
const std::chrono::duration<double> color_delay{0.1};
auto last_color_time = std::chrono::steady_clock::now();
bool coloring_squares = true;
while (programIsRunning())
{
if (coloring_squares) {
auto now = std::chrono::steady_clock::now();
// This will "catch up" as needed.
while (now - last_color_time >= color_delay) {
last_color_time += color_delay;
coloring_squares = color_next_square();
}
}
updateProgram();
}
Como color_next_square()
funciona é com você. Você poderia "pré-assar" uma lista de quadrados para colorir usando sua função recursiva e iterar por ela.
Além disso, obviamente, este exemplo usa apenas o código que você postou. Você vai querer organizar tudo isso como parte updateProgram()
, possivelmente em algum tipo de class SquareAnim {};
invólucro com estado.
NB: se o seu programa tem pouco jitter, ou seja, tem um tempo consistente entre as atualizações e o atraso é baixo, usar o seguinte pode levar a uma animação um pouco mais suave:
if (now - last_color_time >= color_delay) {
last_color_time = now;
// ...
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras