/********************************************************************* logo.java Esimerkki väriliu'un toteuttamisesta ja grafiikan kaksoispuskuroinnista. Appletin taustalle piirretään jatkuvasti päivittyvää väriliukua ja sen päälle piirretään osittain läpinäkyvä kuvatiedosto. Kuvatiedostoa käytetään siis ikään kuin mustana sapluunana värikkääseen taustaan. Näin saadaan aikaan mielenkiintoinen efekti. Appletin alareunaan piirretään väriä vaihtava liikkuva teksti. Tekijä: Pekka Malmirae 2/1999 Muutoksia: Appletti päivitetty Java 1.1 -mukaiseksi: * size -> getSize * Säikeiden käsittelyssä päivitetty turvallisemmaksi (poistettu deadlock-vaarat) 11/1999, Pekka Malmirae *********************************************************************/ import java.applet.*; import java.awt.*; public class logo extends Applet implements Runnable { Thread saie = null; Color raidat[]; Image dbufferimage; Graphics dbuffer; String scrolltext; int scrolltextpos = 0; int maxpos = 0; int punainen = 0; int vihrea = 0; int sininen = 0; int raidanLeveys = 4; Image logo; boolean odota = true; boolean lisaa_punaista = true; boolean lisaa_sinista = false; boolean lisaa_vihreaa = false; boolean kasvaa = true; public void init() { String parm; raidat = new Color[getSize().height/raidanLeveys]; // Loads picture MediaTracker tracker = new MediaTracker(this); logo = getImage(getDocumentBase(), getParameter("logo")); parm = getParameter("scroll"); if ( parm !=null) scrolltext = parm; else scrolltext = ""; parm = getParameter("factor"); if ( parm !=null) raidanLeveys = Integer.parseInt(parm); tracker.addImage(logo, 0); try { tracker.waitForID(0); } catch(Exception e) {}; for(maxpos = 0; maxpos<(getSize().height/raidanLeveys)-1 ; maxpos++) { raidat[maxpos]=new Color(0,0,0); } maxpos = getSize().height; dbufferimage = createImage(getSize().width,getSize().height); scrolltextpos = getSize().width + 20; dbuffer = dbufferimage.getGraphics(); dbuffer.setFont(new Font("Arial",Font.BOLD,24)); } public void update(Graphics g) { if (logo == null) return; odota = true; for(maxpos = 1; maxpos < (getSize().height/raidanLeveys)-1 ; maxpos++) { raidat[maxpos-1]=raidat[maxpos]; dbuffer.setColor(raidat[maxpos]); dbuffer.fillRect(0,(maxpos-1)*raidanLeveys,getSize().width,((maxpos-1)*raidanLeveys)+raidanLeveys); } createcolorFade(); raidat[maxpos-1]=new Color(punainen,vihrea,sininen); dbuffer.drawImage(logo,0,0,this); scrolltextpos -=2; dbuffer.setColor(new Color(punainen,vihrea,sininen)); dbuffer.drawString(scrolltext,scrolltextpos,getSize().height-15); odota = false; if (scrolltextpos * -1 > scrolltext.length()*12) scrolltextpos = getSize().width + 20; paint(g); } public void paint(Graphics g) { if(!odota) { if (dbufferimage!= null) { g.drawImage(dbufferimage, 0, 0, null); } } } public void start() { saie = new Thread(this); saie.start(); } public void stop() { saie = null; } public void run() { Thread tamaSaie = Thread.currentThread(); while (true) { try { repaint(); tamaSaie.sleep(50); } catch (InterruptedException e) {} } } public void createcolorFade() { if( kasvaa) { if( lisaa_punaista == true ) { punainen += 15; if ( punainen == 255) { lisaa_punaista = false; lisaa_vihreaa = true; } } if( lisaa_vihreaa == true ) { vihrea += 15; if ( vihrea == 255) { lisaa_vihreaa = false; lisaa_sinista = true; } } if( lisaa_sinista == true ) { sininen += 15; if ( sininen == 255) { lisaa_sinista = false; lisaa_vihreaa = true; kasvaa = false; } } } else { if( lisaa_vihreaa == true ) { vihrea -= 15; if ( vihrea == 0) { lisaa_vihreaa = false; lisaa_punaista = true; } } if( lisaa_punaista == true ) { punainen -= 15; if ( punainen == 0) { lisaa_punaista = false; lisaa_sinista = true; } } if( lisaa_sinista == true ) { sininen -= 15; if ( sininen == 0) { lisaa_sinista = false; lisaa_punaista = true; kasvaa = true; } } } } }