Vidéo réalisée avec JSL.
Conçu pour un écran 1920x1080.
Le JSL utilise un tableau de données pour conserver une ligne de données par point mobile dans la vidéo.
Les boucles ForEachRow utilisent les variables de nom de colonne rowpos et colpos pour placer un point à une ligne, colonne dans les matrices bitmap et rowstep et colstep pour faire avancer les valeurs rowpos et colpos pour chaque image.
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" )
);
Passage aux points suivants :
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;
)
);
Les instructions if complexes testent si le point est sur le point de quitter le cadre ; une version antérieure utilisait bounceLimit=1 pour lui permettre de rebondir une fois en inversant le pas.
Le code est disponible sur GitHub .