import java.awt.*; import java.applet.Applet; import java.awt.Graphics; class Item { String s; int tickerx; int tickery; int tickerlen; int middle; int width; int height; int hoscil; int hoscilmax; int mode = 0; double cmpt; // counter for graphics animations double yinit; int xinit; double a; double tmax = 10; int turn = 0; double phase = 100; Color tickercolor; Font tickerfont; Item( String s0, Font font0, int len, int middle0, int W, int H, int initx0, int inity0) { tickerx = initx0; xinit = initx0; tickerfont = font0; tickerlen = len; s = s0; cmpt = initx0; yinit = inity0; width = W; height = H; hoscilmax = H-middle0; hoscil = 0; middle = middle0; //cmpt = 0; tickercolor = new Color( 255-xinit/2, xinit/2, xinit/2); } void compute(int speed) { // x loop tickerx -= speed; //((speed * (curtick - lasttick)) / 1000); if (tickerx > width || tickerx + tickerlen < 0) { turn++; int nr, nb; if (turn < 10) { nr = (tickercolor.getRed() - 20); if (nr < 0) nr = 0; nb = (tickercolor.getBlue() + 17);if (nb > 255) nb = 255; } else { nr = (tickercolor.getRed() + 20);if (nr > 255) nr = 255; nb = (tickercolor.getBlue() - 17); if (nb < 0) nb = 0; } tickercolor = new Color( nr, tickercolor.getGreen(), nb); tickerx = width; hoscil += height/20; if (hoscil > hoscilmax) hoscil = hoscilmax; if (phase != 50) if (hoscil == hoscilmax) { cmpt = (cmpt*(phase-10))/phase; phase -= 10; } if (phase == 50) mode++; if ((mode == 2) || (mode == 1)) { cmpt = 0; yinit = tickery; a = tmax*tmax/yinit; } if (mode >=3) { cmpt=xinit; } if (turn > 20) { turn = 0; mode = 0; phase = 100; hoscil = 0; tmax = 10; tickercolor = new Color( 255-xinit/2, xinit/2, xinit/2); } } // y loop if (mode == 0) { cmpt-=speed; tickery = (int)(Math.sin(cmpt/phase)*hoscil + middle); } if ((mode == 1) || (mode == 2)) { cmpt+=0.5; if (cmpt > tmax) { cmpt -= tmax; //time remaining; //rebound*=2; yinit = (2*yinit)/3; tmax = Math.sqrt(yinit*a); cmpt = -tmax + cmpt; // time initialisation } tickery = height - (int)(yinit - cmpt*cmpt/a); } if (mode >= 3) { cmpt++; tickery = (int)((Math.cos(cmpt/10) + Math.sin(cmpt/14)) * hoscilmax/2 + middle); } } } public class ScrollApplet2 extends Applet implements Runnable { int speed; // In pixels per second for scrolling int nbItems; long lasttick; Thread runner; Item [] tabItem; int W; int H; Image offscreenImage; Graphics offscreenGraphics; public void init() { initialise("Helvetica", "SpikeNET"); offscreenImage = createImage(size().width, size().height); offscreenGraphics = offscreenImage.getGraphics(); } public void update(Graphics g) { paint(g); } public void destroy() { offscreenGraphics.dispose(); } void initialise( String f, String s) { Font tickerfont; speed = 4; String fontname = f; W = size().width; H = size().height; // adjust to the right font size FontMetrics fm; int size; int nextsize = H/3; do { size = nextsize; tickerfont = new Font(fontname, Font.PLAIN, size); fm = getFontMetrics(tickerfont); nextsize = (size * 9) / 10; } while (fm.getHeight() > H && size > 0); // reserv memory for items nbItems = s.length(); tabItem = new Item[ nbItems ]; int offsetletter = 0; int maxlen = 40; int middle = (H + fm.getAscent())/2; for (int i=0; i < nbItems; i++) { StringBuffer stmp = new StringBuffer(); stmp.append(s.charAt(i)); tabItem[i] = new Item( stmp.toString(), tickerfont, maxlen, middle, W, H, offsetletter, (H-fm.getAscent())-10*i); // (int)((H-fm.getAscent())/(Math.random()*3+1))); offsetletter += fm.stringWidth(stmp.toString()); } lasttick = System.currentTimeMillis(); } /* public void getMedia() { tickerx = 0; repaint(); lasttick = System.currentTimeMillis(); }*/ public void run() { while(true) { try { //long curtick = System.currentTimeMillis(); //tickerx -= speed; //((speed * (curtick - lasttick)) / 1000); //if (tickerx > W || tickerx + tickerlen < 0) { tickerx = W; } for (int i=0; i