Video erstellt mit JSL.
Entwickelt für eine Bildschirmauflösung von 1920x1080.
Die JSL verwendet eine Datentabelle, um für jeden Bewegungspunkt im Video eine Datenzeile zu speichern.
Die ForEachRow-Schleifen verwenden die Spaltennamenvariablen rowpos und colpos, um einen Punkt in der Bitmap-Matrix an einer Zeile bzw. Spalte zu platzieren, sowie rowstep und colstep, um rowpos und colpos für jedes Frame zu erhöhen.
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" )
);
Die Punkte für den nächsten Frame werden erhöht:
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;
)
);
Die komplizierten if-Anweisungen prüfen, ob der Punkt im Begriff ist, den Rahmen zu verlassen; eine frühe Version verwendete bounceLimit=1, um ihn einmal abprallen zu lassen, indem der Schritt umgekehrt wurde.
Der Code befindet sich auf GitHub .