/* AnimoiSilmat.java Tekijä: juha Peltomäki, 12.1998 Esimerkki: Java-kirja, luku 4. Toiminta: Animoidaan päätä, jossa pallo-osa pysyy paikalla, mutta silmät ja suu vilistää run()-metodin määräämässä tahdissa. */ import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class AnimoiSilmat extends Applet implements Runnable { Thread saie; int nro = 0; // Vuorossa oleva kuva. int kuvia = 4; // Erilaisten kuvien määrä. boolean nousussa = true; // true = kasvatetaan laskurin nro arvoa, // false = vähennetään arvoa. int lepoaika = 150; // animaationopeus. // Piirtoon vaikuttavat muuttujat: int paa_alkuY = 50, paa_alkuX = 50, // pään alkukoordinaatit. paa_kokoX = 150; // Muuttujat, joiden arvo lasketaan yo. muuttujista. Älä muuta! int paa_kokoY = paa_kokoX, // pään koko. silma_alkuX = paa_alkuX + (int)(paa_kokoX/3.6), // silman alkupaikat. silma_alkuY = paa_alkuY + (paa_kokoY/4), silma_alkuX2 = silma_alkuX + (int)(paa_kokoX/2.4), silma_kokoX = paa_kokoX/15, silma_kokoY = paa_kokoX/15, // silmän alkukoot. sm_koko = (silma_kokoX/3), // silmämunan koko. suu_alkuX = (silma_alkuX + silma_alkuX2)/2 - (paa_kokoX/12), // suun alkukohdat suu_alkuY = silma_alkuY + (int)(paa_kokoY/2.5), suu_kokoX = (paa_kokoX/6), // suun koko. suu_kokoY = (paa_kokoX/15); /* Metodissa piirretään pään pallo-osa. */ public void piirra_pallo(Graphics piirtopinta) { // piirretään pallo piirtopinta.drawOval(paa_alkuX, paa_alkuY, paa_kokoX, paa_kokoY); piirtopinta.drawOval(paa_alkuX - 1, paa_alkuY - 1, paa_kokoX + 2, paa_kokoY + 2); } /* piirretään Silmät ja silmämuna. Parametrien selitykset: kokoX, KokoY, silman koko siirtoX, siirtoY, silmämunan alkukohta vaakasuunnassa */ public void piirra_silmat(Graphics piirtopinta, int kokoX, int kokoY, int siirtoX, int siirtoY ) { // Piirretään vasemmanpuoleinen silmä. piirtopinta.drawOval(silma_alkuX, silma_alkuY, kokoX, kokoY); piirtopinta.drawOval(silma_alkuX - 1, silma_alkuY - 1, kokoX + 2, kokoY + 2); // Piirretään oikeanpuoleinen silmä. piirtopinta.drawOval(silma_alkuX2, silma_alkuY, kokoX, kokoY); piirtopinta.drawOval(silma_alkuX2 - 1, silma_alkuY - 1, kokoX + 2, kokoY + 2); // Piirretään silmämuna vasempaan ja oikeaan silmään. piirtopinta.fillOval(silma_alkuX + siirtoX, silma_alkuY + siirtoY, sm_koko, sm_koko); piirtopinta.fillOval(silma_alkuX2 + siirtoX, silma_alkuY + siirtoY, sm_koko, sm_koko); } /* Piirretään suu. Parametrien selitykset: paikkaX, PaikkaY - Suun paikkakoordinaatit kokoX, KokoY - Suun koko */ public void piirra_suu(Graphics piirtopinta, int paikkaX, int paikkaY, int kokoX, int kokoY) { piirtopinta.drawOval(paikkaX, paikkaY, kokoX, kokoY); } public void paint(Graphics piirtopinta) { piirtopinta.clearRect(paa_alkuX, paa_alkuY, paa_kokoX, paa_kokoY); piirra_pallo(piirtopinta); // Lasketaan silmalle ja suulle uusi paikka parametrin nro perusteella. piirra_silmat(piirtopinta, silma_kokoX + nro*2, silma_kokoY, 2 + nro*2, 2); piirra_suu(piirtopinta, suu_alkuX + nro*2, suu_alkuY, suu_kokoX - nro*4, suu_kokoY - nro*2); } /* run()-metodissa ajetaan säiettä kutsuen joka kierros paint()-metodia kuvat uudelleen piirtämiseksi. */ public void run() { while (true) { repaint(); if (nousussa) nro++; else nro--; if (nro >= kuvia) { nousussa = false; nro--; } else if (nro < 0) { nousussa = true; nro++; } try { Thread.sleep(lepoaika); } catch (InterruptedException e) { } } } /* Aloitetaan uusi säie. */ public void start() { if (saie == null) { saie = new Thread(this); saie.start(); } } /* Pysäytetään säie. */ public void stop() { if (saie != null) { saie.stop(); saie = null; } } }