Video realizzato con JSL.
Progettato per schermi con risoluzione 1920x1080.
Il linguaggio JSL utilizza una tabella dati per memorizzare una riga di dati per ogni punto in movimento nel video.
I cicli ForEachRow utilizzano le variabili rowpos e colpos, che indicano il nome della colonna, per posizionare un punto in corrispondenza di una riga e colonna nelle matrici bitmap, e rowstep e colstep per avanzare rispettivamente rowpos e colpos per ogni fotogramma.
dt = New Table( "points", "private", // private is *much* faster
Add Rows( npoints ), // this table has a row per moving point, location, vector, color
New Column( "rowpos" ), New Column( "colpos" ), New Column( "rowstep" ), New Column( "colstep" ),
New Column( "bounce" ), New Column( "rpix" ), New Column( "gpix" ), New Column( "bpix" )
);
Avanzamento dei punti per il fotogramma successivo:
movepoints = Function( {}, // on each frame the points are all advanced and checked for leaving the bitmap
For Each Row( dt,
If( 1 <= (dt:rowpos + dt:rowstep) < nr + 1, // hit bottom or top edge?
0 // not leaving
, // else...hit the edge
dt:bounce += 1;
If( dt:bounce > bounceLimit,
reset( Row() ) // restart
, // else keep bouncing
dt:rowstep = -dt:rowstep // if bouncing, reverse
);
);
If( 1 <= (dt:colpos + dt:colstep) < nc + 1, // hit left or right edge?
0 // not leaving
, // else...hit the edge
dt:bounce += 1;
If( dt:bounce > bounceLimit,
reset( Row() ) // restart
, // else keep bouncing
dt:colstep = -dt:colstep // reverse
);
);
dt:rowpos += dt:rowstep; // move this point along its path
dt:colpos += dt:colstep;
)
);
Le complesse istruzioni if verificano se il punto sta per uscire dal frame; una versione precedente utilizzava bounceLimit=1 per consentire un rimbalzo inverso.
Il codice è disponibile su GitHub .