// MatoOlioApplet.java (c) 2005 Kari Laitinen // 2005-04-02 Tiedosto luotu. // 2008-02-06 Viimeisin muutos /* Tämä apletti toimii kuten MatoApplet.java, mutta tähän on tehty seuraava parannus: - Tama on oliosuuntautunut versio ohjelmasta, mika tarkoittaa etta kaytossa on luokka nimelta Mato. Mato-luokka edustaa ruudulla naytettavaa matoa. Mato-luokassa on metodit joiden avulla matoa voidaan mm. liikutella ja se saadaan piirtamaan itsensa ruudulle. Datajaseniensa ansiosta Mato-olio tietaa itse mm. varinsa ja paikkansa ruudulla ja osaa siten piirtaa itsensa. Tätä pitäisi vielä siistiä: - madon pysäytys liikkumisen lopussa, vaatii uuden tilan. - nopeudensäädön voisi poistaa ehkä */ import java.awt.* ; import java.util.* ; import java.awt.geom.* ; class Mato { int madon_nykyinen_paikka_x ; int madon_nykyinen_paikka_y ; int madon_nykyinen_pituus ; int madon_nykyinen_korkeus ; int madon_paikka_alussa_x = 50 ; int madon_paikka_alussa_y = 150 ; int madon_pituus_alussa = 100 ; int madon_korkeus_alussa = 30 ; int madon_nopeus = 5 ; static final int PITUUDEN_MUUTOS = 5 ; Color madon_vari = Color.red ; static final int MATO_PYSAHTYNYT = 0 ; static final int MATO_PITENEMASSA = 1 ; static final int MATO_LYHENEMASSA = 2 ; int madon_tila = MATO_PYSAHTYNYT ; int pysahdysajan_laskuri = 0 ; int venytyslaskuri = 0, supistuslaskuri = 0 ; Rectangle2D.Double madon_liikkumisalue ; public Mato( Rectangle2D.Double annettu_liikkumisalue ) { madon_liikkumisalue = annettu_liikkumisalue ; aseta_aloitusarvot() ; } public Mato( int annettu_nopeus ) { madon_nopeus = annettu_nopeus ; aseta_aloitusarvot() ; } public Mato( int annettu_aloituspaikka_x, int annettu_aloituspaikka_y, int annettu_pituus ) { madon_paikka_alussa_x = annettu_aloituspaikka_x ; madon_paikka_alussa_y = annettu_aloituspaikka_y ; madon_pituus_alussa = annettu_pituus ; madon_korkeus_alussa = 30 ; aseta_aloitusarvot() ; } public int anna_madon_paikka_x() { return madon_nykyinen_paikka_x ; } public int anna_madon_paikka_y() { return madon_nykyinen_paikka_y ; } public int anna_madon_pituus() { return madon_nykyinen_pituus ; } public void aseta_aloitusarvot() { madon_nykyinen_paikka_x = madon_paikka_alussa_x ; madon_nykyinen_paikka_y = madon_paikka_alussa_y ; madon_nykyinen_pituus = madon_pituus_alussa ; madon_nykyinen_korkeus = madon_korkeus_alussa ; venytyslaskuri = 0 ; supistuslaskuri = 0 ; pysahdysajan_laskuri = 0 ; } public void vaihda_madon_vari( Color uusi_madon_vari ) { madon_vari = uusi_madon_vari ; } // Seuraavaa metodia kutsuttava n. 50 ms välein public void liikuta() { if ( madon_tila == MATO_PYSAHTYNYT ) { pysahdysajan_laskuri ++ ; // Sitten kun mato on ollut pysähtyneenä 60 liikuttamiskertaa // eli 60 kertaa 50 ms, pannaan se liikkeelle if ( pysahdysajan_laskuri >= 60 ) { madon_tila = MATO_PITENEMASSA ; } } else if ( madon_tila == MATO_PITENEMASSA ) { if ( madon_nykyinen_paikka_x + madon_nykyinen_pituus >= madon_liikkumisalue.width ) { aseta_aloitusarvot() ; madon_tila = MATO_PYSAHTYNYT ; } else if ( venytyslaskuri < 7 ) { madon_nykyinen_pituus += madon_nopeus ; venytyslaskuri ++ ; } else { madon_tila = MATO_LYHENEMASSA ; venytyslaskuri = 0 ; } } else if ( madon_tila == MATO_LYHENEMASSA ) { if ( supistuslaskuri < 7 ) { madon_nykyinen_paikka_x += madon_nopeus ; madon_nykyinen_pituus -= madon_nopeus ; supistuslaskuri ++ ; } else { madon_tila = MATO_PITENEMASSA ; supistuslaskuri = 0 ; } } } public void piirra( Graphics graphics ) { graphics.setColor( madon_vari ) ; graphics.fillRoundRect( madon_nykyinen_paikka_x, madon_nykyinen_paikka_y, madon_nykyinen_pituus, madon_nykyinen_korkeus, 20, 20 ) ; } } public class MatoOlioApplet extends javax.swing.JApplet implements Runnable { Thread tahdistussaie ; boolean saietta_on_suoritettava = false ; int apletin_leveys, apletin_korkeus ; Mato liikkuva_mato ; public void init() { apletin_korkeus = getSize().height ; apletin_leveys = getSize().width ; Rectangle2D.Double liikkumisalue = new Rectangle2D.Double( 0, 0, apletin_leveys, apletin_korkeus ) ; liikkuva_mato = new Mato( liikkumisalue ) ; } public void start() { if ( tahdistussaie == null ) { tahdistussaie = new Thread( this ) ; saietta_on_suoritettava = true ; tahdistussaie.start() ; } } public void stop() { if ( tahdistussaie != null ) { tahdistussaie.interrupt() ; // keskeytä mahdollisesti nukkuva säie saietta_on_suoritettava = false ; tahdistussaie = null ; } } public void run() { while ( saietta_on_suoritettava == true ) { liikkuva_mato.liikuta() ; repaint() ; lepuuta_tata_saietta( 50 ) ; } } void lepuuta_tata_saietta( int lepuutusaika_millisekunteina ) { if ( saietta_on_suoritettava == true ) { try { Thread.sleep( lepuutusaika_millisekunteina ) ; // System.out.print( " Z" ) ; // Rivi testausta varten } catch ( InterruptedException vangittu_poikkeus ) { // System.out.print( " X" ) ; // Rivi testausta varten } } } public void paint( Graphics graphics ) { super.paint( graphics ) ; liikkuva_mato.piirra( graphics ) ; // nopeampi_mato.piirra( graphics ) ; } }