import java.awt.*; import java.awt.image.*; //import java.net.*; import java.util.*; //import java.io.*; /** * This class implements an animation thread which animates all the banners that have been added to it. * @author Torbjörn Nil55on * @version 1.0 */ public class Banner extends Thread { static final int BANNER_X = 10; static final int BANNER_Y = 9; Image manyBanners; Image[][] banners = new Image[7][10]; //[col][anims] int bannerCtr = 0; Vector allBanners = new Vector(30,10); Container cont; /** * Default constructor */ public Banner(Container c, String host){ cont = c; try { ImageLoader imlo = new ImageLoader(host); manyBanners = imlo.add("http://www.lysator.liu.se/~nexus/FOD/PICS/transflag.gif"); imlo.loadAllImages(); } catch (Exception e) { System.out.println("Inga flaggor: "+e); } /* resize(100,100); setBackground(Color.red.darker()); manyBanners = pic; */ setPriority(Thread.MIN_PRIORITY); //get separate pics from manyBanners // MakeTransFilter mtf = new MakeTransFilter(); Toolkit tk = Toolkit.getDefaultToolkit(); for(int gfxRow=0;gfxRow<7;gfxRow++) for(int i=0;i<10;i++) { ImageProducer ip = manyBanners.getSource(); ImageFilter cropper = new CropImageFilter(i*20+3,2+gfxRow*10,BANNER_X,BANNER_Y); ImageProducer producer = new FilteredImageSource(ip,cropper); // ImageProducer producer2 = new FilteredImageSource(producer,mtf); banners[gfxRow][i] = tk.createImage(producer); // System.out.println(banners[i]); } } /** * Prepare for a new collection of add-operations, by removing all previous banners. */ public synchronized void clear() { //remove from container Enumeration e = allBanners.elements(); while(e.hasMoreElements()) { BannerCanvas bc = (BannerCanvas)e.nextElement(); cont.remove(bc); } //remove from vector allBanners.removeAllElements(); } /** * Use this method to add another banner in a given colour and at a given position. Last argument indicates whether this particular banner should be twice the normal size. * */ public synchronized void add(int col, int x, int y, boolean capital ) { if (col == -1) System.out.println("No capital! NOT added!"); else { BannerCanvas c = new BannerCanvas(col, capital); if (capital) { c.resize(BANNER_X*2,BANNER_Y*2); } else { c.resize(BANNER_X,BANNER_Y); } c.move(x,y); cont.add(c); allBanners.addElement(c); // c.resize(100,100); // c.setBackground(Color.red); // System.out.println(c); // System.out.println(cont); } } /** * Alternative add(). Calls the other add with last argument set to FALSE. */ public synchronized void add(int col, int x, int y) { add(col,x,y, false); } /* public void start() { System.out.println("start"); if (runner == null) { runner = new Thread(this); runner.start(); runner.setPriority(Thread.MIN_PRIORITY); } } public void stop() { if (runner != null && runner.isAlive()) runner.stop(); runner = null; } */ /** * Mainloop of this thread. */ public void run() { System.out.println("run"); while(true){ bannerCtr = (bannerCtr+1)%10; paint(); try {Thread.sleep(100);} catch (InterruptedException e){} } } /** * Draw all the animated banners added to this Banner object. */ public void paint() { // System.out.println("hej"); Color bkgCol = new Color(210,210,150); Enumeration e = allBanners.elements(); while (e.hasMoreElements()) { BannerCanvas bc = (BannerCanvas)e.nextElement(); if (bc.gfx == null) { bc.gfx = bc.getGraphics(); // System.out.println("gfx="+bc.gfx); } if (bc.gfx != null) { if (bc.capital) (bc.gfx).drawImage(banners[bc.col][bannerCtr],0,0,BANNER_X*2,BANNER_Y*2,bkgCol,cont); // (bc.gfx).drawImage(banners[bc.col][bannerCtr],0,0,BANNER_X*2,BANNER_Y*2,cont); else (bc.gfx).drawImage(banners[bc.col][bannerCtr],0,0,bkgCol,cont); // (bc.gfx).drawImage(banners[bc.col][bannerCtr],0,0,cont); // System.out.println("drawing..."); } } } /* public static void main(String[] a) { ImageLoader imlo = new ImageLoader(); Image testPic= imlo.add("http://www-und.ida.liu.se/~c93torni/FOD/pics/map4.jpg"); imlo.loadAllImages(); Frame f = new Frame(); bkgPanel p = new bkgPanel(testPic); p.setLayout(null); f.add("Center",p); Banner b = new Banner(p); // f.add(b); // b.move(100,100); f.resize(400,400); b.add(0,100,100); b.add(1,110,110); b.add(2,120,120); b.add(3,130,130, true); b.add(4,150,140); b.add(5,160,150); b.add(6,170,160); b.start(); f.show(); System.out.println(b.allBanners.size()); b.suspend(); b.clear(); b.add(2,120,120); b.add(3,130,130, true); b.resume(); System.out.println(b.allBanners.size()); } */ } /** * Objects containing important data about each animatefd banner added to a Banner object. * @author Torbjörn Nilsson * @version 1.0 * */ class BannerCanvas extends Canvas { int col = -1; Graphics gfx = null; boolean capital = false; BannerCanvas(int c, boolean cap) { col = c; capital = cap; } } /* // written specially for Banner.class, makes a color transparent class MakeTransFilter extends RGBImageFilter { int[] ireds = {0,68,0,0,0,255,255,255}; int[] igreens = {0,0,0,170,238,0,255,238}; int[] iblues = {0,119,153,0,238,0,0,221}; byte[] reds = new byte[8]; byte[] greens = new byte[8]; byte[] blues = new byte[8]; public MakeTransFilter() { canFilterIndexColorModel = true; for(int i=0;i<8;i++) { reds[i] = (byte)ireds[i]; greens[i] = (byte)igreens[i]; blues[i] = (byte)iblues[i]; } IndexColorModel icm = new IndexColorModel(8,8, reds, greens, blues, 0); newmodel = icm; // setColorModel(icm); // System.out.println(icm.getTransparentPixel()); } public int filterRGB(int x, int y, int rgb) { return rgb; } } */