Tallo: la procedura per disegnarlo

Per procedura si intende un blocco di istruzioni con un nome; questo permette di chiamare le stesse istruzioni in più parti del programma senza riscrivere le stesse istruzioni e permette inoltre di modificarle in un unico punto in caso di implementazioni successive o correzioni.

Ad una procedura possono essere passati dei parametri in modo che si adatti.

La procedura di disegno del tallo è ora completa e si presente così:

procedure disegna_tallo(punta : integer; tipo : string);
var
 CRect: TRect;
 raggio,x,y : integer;
 tallox : ttallo;
 posizione,nuova_posizione : tposizione;
begin
tallox := form1.tallo[punta];
if tallox.stato = 'X' then exit;
raggio := calcola_raggio(tallox.energia);
if tallox.stato = 'M' then raggio := 5;
 CRect.Left   := tallox.x_int - raggio;
 CRect.Top    := tallox.y_int - raggio;
 CRect.Right  := tallox.x_int + raggio;
 CRect.Bottom := tallox.y_int + raggio;
 form1.Canvas.brush.color := tallox.colore;
 form1.Canvas.Pen.Color := colore_tallo;
 form1.Canvas.brush.style := bsSolid;
 if tipo = 'c' then begin
    form1.Canvas.Pen.Color := colore_acqua;
    form1.Canvas.Brush.Color := colore_acqua;
    end;
 if tallox.stato = 'M' then begin
    form1.Canvas.Pen.Color := colore_morto;
    form1.Canvas.Brush.Color := colore_morto;
    end;
form1.Canvas.Ellipse(CRect);
posizione.x := tallox.x;
posizione.y := tallox.y;
posizione.direzione := tallox.direzione;
posizione.distanza := raggio*-100;
nuova_posizione := aggiorna_posizione(posizione);
x := round(nuova_posizione.x/100);
y := round(nuova_posizione.y/100);
form1.Canvas.MoveTo(X,Y);
posizione := nuova_posizione;
posizione.distanza := raggio * -100 * 2;
nuova_posizione := aggiorna_posizione(posizione);
x := round(nuova_posizione.x/100);
y := round(nuova_posizione.y/100);
form1.Canvas.Pen.Color := colore_flagello;
 if tipo = 'c' then begin
    form1.Canvas.Pen.Color := colore_acqua;
    form1.Canvas.Brush.Color := colore_acqua;
    end;
form1.Canvas.LineTo(x,y);
posizione.x := tallox.x;
posizione.y := tallox.y;
posizione.direzione := tallox.direzione2;
posizione.distanza := raggio*-100;
nuova_posizione := aggiorna_posizione(posizione);
x := round(nuova_posizione.x/100);
y := round(nuova_posizione.y/100);
form1.Canvas.MoveTo(X,Y);
posizione := nuova_posizione;
posizione.distanza := raggio * -100 * 2;
nuova_posizione := aggiorna_posizione(posizione);
x := round(nuova_posizione.x/100);
y := round(nuova_posizione.y/100);
form1.Canvas.Pen.Color := colore_flagello;
 if tipo = 'c' then begin
    form1.Canvas.Pen.Color := colore_acqua;
    form1.Canvas.Brush.Color := colore_acqua;
    end;
form1.Canvas.LineTo(x,y);
end;

Nella prima parte c’e’ la definizione delle variabili;

Descriviamo la procedura di disegno

A inizio procedura viene impostata la variabile locale tallox di tipo ttallo con i dati dell’elemento della array tallo puntato dalla variabile punta; questo per evitare di lavorare direttamente sull’array; inizialmente si impostano le coordinate di partenza che sono il centro del cerchio che rappresenta il tallo;

L’impostazione dei colori avviene in base allo stato del tallo, se morto (quando l’energia scende a zero lo stato diventa “M”), se eliminato (quando un tallo morto viene “mangiato” da un altro tallo lo stato diventa “X”), mentre se la procedura viene richiamata con il secondo paramentro impostato a “C” per cancellare il tallo i colori sono uguali a quelli i sfondo.

Le istruzioni che seguono la chiamata della funzione ellipse (quella che disegna il cerchio del tallo) servono a disegnare i due flagelli; il punto di inizio del flagello è determinato calcolando lo spostamento di lunghezza raggio dal centro alla circonferenza del cerchio nella direzione opposta a quella in cui si muove il tallo. Il punto finale dove disegnare la linea che rappresenta il flagello è calcolata partendo dalla posizione iniziale e calcolando lo spostamento di lunghezza raggio * 2 nella direzione opposta a quella in cui si muove il Tallo.

Altri dettagli

Considerate che il raggio è proporzionale alla quantità di energia che il Tallo ha incamerato, quindi un Tallo con più energia è un Tallo più grande; il flagello è uguale al diametro del Tallo. Considerate anche che il calcolo delle varie coordinate avviene ad una precisione maggiore rispetto ai pixel disponibili di 100 volte, questo permette di avere movimenti più fluidi anche se costringe spesso a moltiplicare o dividere per 100 i valori prima di utilizzarli.

Se qualche istruzione non vi è chiara leggetevi gli articoli precedenti dove sono descritte meglio e se ancora avete dubbi contattatemi, sarò ben lieto di aiutarvi.

Maurizio

Lascia un commento