Tallo: gestire l’animazione con il timer

Il modo migliore per gestire l’animazione e le iterazioni fra i vari elementi è l’utilizzo del timer, che permette di eseguire una serie di istruzioni ogni determinato periodo.

In realtà la prima idea che mi era venuta è stata quella di fare un ciclo infinito utilizzando la funzione sleep per gestire la velocità; in realtà in questo modo creavo un loop in quanto la funzione sleep si limita a tenere occupata la cpu per tutto il tempo.

Istruzione Timer in Pascal

L’istruzione Timer è semplice da utilizzare; basta impostare l’intervallo e indicare quale funzione va eseguita ad ogni ciclo. Quando volete farla partire basta impostare l’attributo enabled a True; questo ci permette di fermare o avviare la simulazione con un semplice click, basta associare le seguenti istruzioni ad un bottone:

procedure TForm1.Button1Click(Sender: TObject);
begin
if timer1.enabled then begin
   timer1.enabled := false;
   button1.Caption := ' Avvia ';
   end
  else begin
  timer1.enabled := true;
   button1.Caption := ' Ferma ';
   end;
end;

Con queste istruzioni ogni volta che si clicca se il ciclo è fermo viene avviato se avviato viene fermato e contemporaneamente si aggiusta il testo del bottone.

Un’altra funzione comoda è quella che permette di bloccare l’esecuzione del cliclo, durante le prove puo’ capitare di voler analizzare la situazione al verificarsi di un determinato evento, ad esempio durante una collisione e con questa funzione invece di essere costretti a cliccare è sufficiente richiamarla al verificarsi della condizione. Poi possiamo far ripartire l’animazione sempre con il bottone avvia/ferma.

Possiamo anche andare a fare colazione, quando torniamo troviamo il programma ad attenderci proprio nel punto in cui ci serviva. Questa la funzione:

procedure blocca();
begin
form1.timer1.enabled := false;
form1.button1.Caption := ' Avvia ';
end;

Gestire la velocità

Altra cosa utile è la possibilità di accellerare o rallentare l’animazione, si puo’ fare facilmente. il ciclo inzialmente viene eseguito ogni 200 millisecondi; quindi abbiamo utilizzato l’istruzione timer1.interval := 200; per impostarlo, basta associare ad alcuni bottoni l’impostazione di valori diversi, ad esempio 1000 per farlo andare più lento e 40 per farlo andare più veloce. Naturalmente bisogna evitare che l’intervallo sia più breve della durata delle istruzioni. Non so cosa succederebbe ma non credo nulla di buono, anzi, durante le prove ci provo e vi faccio sapere.

Ciclo singolo

Un ulteriore bottone molto utile è quello che ci permette di eseguire un solo ciclo; così siamo noi a pilotare l’andamento della animazione.

  public
   ciclo_singolo : boolean;  // definito fra le public è visibile a tutte le procedure del programma

procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.WindowState:=wsMaximized;
randomize();
timer1.interval := millisecondi_ciclo;
ciclo_singolo := false; // impostato a falso a inizio programma
end;
procedure TForm1.Button2Click(Sender: TObject);
//var
//Points: array of TPoint;
begin
ciclo_singolo := true;
timer1.enabled := true;
button1.Caption := ' Avvia ';
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
aggiorna_animazione();
if ciclo_singolo then begin
   ciclo_singolo := false;
   timer1.enabled := false;
   end;
end;

Quando clicchiamo viene impostato a true la variabile ciclo_singolo e abilitato il timer , se l’animazione era già attiva l’istruzione di abilitazione non ha effetto.

Nella funzione associata al timer dopo aver aggiornato l’animazione se ciclo_singolo è vero il timer viene disattivato e naturalmente ciclo_singolo viene impostato a false. quindi l’animazione fa un solo aggiornamento e aspetta un nuovo click.

Maurizio

Lascia un commento