DemoBiljard.java [Last ned]

import static java.lang.Integer.*;
 
/*  Demo-program som både viser lengre forflytninger av
 *  enkelt-figurer og "samtidig" forflytning av flere
 *  figur-objekt ("biljardkuler") i mange, korte steg.
 *  Farten på animasjonen blir lest inn fra brukeren.
 */
public class DemoBiljard extends EasyGraphics {
 
  public static void main(String[] args) {
    launch(args);
  }
 
  public void run() {
    final int ANT_ITER = 10000; // Totalt antall steg
    final int ANT_FIGS = 5;     // Antall figurer
 
    final int BREDDE  = 800;
    final int HØYDE   = 800;
 
    // Lagrer posisjon, størrelse og retning i tabeller
    int[] r  = new int[ANT_FIGS];
    int[] x  = new int[ANT_FIGS];
    int[] y  = new int[ANT_FIGS];
    int[] dx = new int[ANT_FIGS];
    int[] dy = new int[ANT_FIGS];
 
    // Initierer tabellene
    for (int i=0; i<ANT_FIGS; i++) {
      // Tilfeldig størrelse og posisjon
      r[i]  = (int) (Math.random()*20)+5;
      x[i]  = (int) (Math.random()*(BREDDE-200))+100;
      y[i]  = (int) (Math.random()*(HØYDE-200))+100;
 
      // Merk at alle forflytninger er kortere enn 4
      // langs begge akser.
      dx[i] = (int) (Math.random()*3)+1;
      dy[i] = (int) (Math.random()*3)+1;
    }
 
    makeWindow("Biljard", BREDDE, HØYDE);
 
    // Innlesing av fart fra bruker
    int fart = parseInt(getText("Angi fart:"));
    setSpeed(fart);
 
    // Tegner biljardkulene
    for (int i=0; i<ANT_FIGS; i++) {
      int rf = (int) (Math.random()*150);
      int gf = (int) (Math.random()*150);
      setColor(rf, gf, 255);  // Tilfeldig blåfarge
      fillCircle(x[i], y[i], r[i]);
    }
 
    // Flytter én og én kule fram og tilbake.
    // Hvis vinduet er lite nok vil deler av bevegelsen
    // skje utenfor vinduet.
    for (int k=0; k<ANT_FIGS; k++) {
      moveCircle(k, x[k]+200, y[k]+200);
      moveCircle(k, x[k], y[k]);
    }
 
    // Flytter alle kulene "samtidig" i små steg,
    // slik at de holder seg innenfor tegnevinduet.    
    for (int step=0; step<ANT_ITER; step++) {
      for (int i=0; i<ANT_FIGS; i++) {
        if ( (x[i]+dx[i]-r[i]) <= 0 || (x[i]+dx[i]+r[i]) >= BREDDE )
          dx[i] = -dx[i];
        if ( (y[i]+dy[i]-r[i]) <= 0 || (y[i]+dy[i]+r[i]) >= HØYDE )
          dy[i] = -dy[i];
        x[i] += dx[i];
        y[i] += dy[i];
        moveCircle(i, x[i], y[i]);
      }
 
      // Eventuell innlagt venting med jevne mellomrom
      // if (step % 500 == 0)
      //   getText("Trykk enter for å fortsette");
    }
  }
}
Kildekode blir vist ved hjelp av GeSHi.