/* AmmusApplet.java Copyright (c) Kari Laitinen http://www.naturalprogramming.com 2010-02-26 File created. 2011-01-28 Latest modification. Tämä on esimerkki animaatioon liittyen. Ammus-olio saadaan lentämään ruudulla kun näppäimistön jotain näppäintä painetaan. Huomaa, että ammus jää lentämään näytön ulkopuolella 'ikuisiksi' ajoiksi kunnes ohjelman käyttö lopetetaan. */ import java.awt.* ; import java.awt.event.* ; import javax.swing.* ; import java.awt.geom.* ; class Ammus { double ammuksen_paikka_x ; double ammuksen_paikka_y ; double siirtyma_x; double siirtyma_y; double laukaisukulma = Math.PI / 4 ; // 45 astetta double lentovoima = 100 ; int radius = 10 ; int ammuksen_alkupaikka_x = 100 ; int ammuksen_alkupaikka_y = 400 ; // Oleellisille ammuksen lentoon vaikuttaville datajäsenille // annetaan arvot konstruktorin avulla kun Ammus-olio luodaan. // Yllä asetetuilla oletusarvoilla ei näin ollen ole vaikutusta. public Ammus( int annettu_alkupaikka_x, int annettu_alkupaikka_y, int annettu_laukaisukulma_asteina, double annettu_lentovoima ) { ammuksen_alkupaikka_x = annettu_alkupaikka_x ; ammuksen_alkupaikka_y = annettu_alkupaikka_y ; laukaisukulma = 2 * Math.PI * annettu_laukaisukulma_asteina / 360 ; lentovoima = annettu_lentovoima ; aseta_alkutilaan() ; } public void aseta_alkutilaan() { ammuksen_paikka_x = ammuksen_alkupaikka_x ; ammuksen_paikka_y = ammuksen_alkupaikka_y ; siirtyma_x = ( lentovoima / 10.0 ) * Math.cos( laukaisukulma ) ; siirtyma_y = -( ( lentovoima / 10.0 ) * Math.sin( laukaisukulma ) ) ; } public void liikuta() { // Liikutetaan ammusta aiemmin määriteltyjen siirtymäarvojen // verran. Huomaa että alussa y-suuntainen siirtymä on // negatiivinen jolloin ammus lentää ylöspäin. ammuksen_paikka_x += siirtyma_x ; ammuksen_paikka_y += siirtyma_y ; // y-suunnan siirtymäarvoa kasvatetaan. Jossain vaiheessa // siitä tulee positiivinen ja ammus alkaa lentämään // alaspäin. Huomaa että alaspäin liikkumisnopeus kasvaa // hiljalleen kun siirtymän arvo kasvaa. siirtyma_y += 0.3; } public void piirra( Graphics graphics ) { graphics.setColor( Color.RED ) ; graphics.fillOval((int) ammuksen_paikka_x - radius, (int) ammuksen_paikka_y - radius, 2 * radius, 2 * radius); } } class AmmusPanel extends JPanel implements Runnable, KeyListener { Thread tahdistussaie = null ; boolean saietta_on_suoritettava = false ; Ammus ammus = new Ammus( 100, 400, 60, 150 ) ; public AmmusPanel() { addKeyListener( this ) ; } public void kaynnista_saie() { if ( tahdistussaie == null ) { tahdistussaie = new Thread( this ) ; saietta_on_suoritettava = true ; tahdistussaie.start() ; } } public void lopeta_saie() { if ( tahdistussaie != null ) { tahdistussaie.interrupt() ; saietta_on_suoritettava = false ; tahdistussaie = null ; } } public void keyPressed( KeyEvent event ) { ammus.aseta_alkutilaan() ; } public void keyReleased( KeyEvent event ) { } public void keyTyped( KeyEvent event ) { } public void run() { while ( saietta_on_suoritettava == true ) { ammus.liikuta() ; repaint(); try { Thread.sleep ( 50 ); } catch ( InterruptedException vangittu_poikkeus ) { saietta_on_suoritettava = false ; } repaint() ; } } public void paintComponent ( Graphics graphics ) { super.paintComponent( graphics ) ; ammus.piirra( graphics ) ; // A window has 'focus' when keyboard input is directed to it. // The following statement ensures that the applet window will // receive keyboard input. if ( ! hasFocus() ) { requestFocus() ; } } } public class AmmusApplet extends JApplet { AmmusPanel paneeli_aplettiin = new AmmusPanel() ; public void init() { getContentPane().add( paneeli_aplettiin ) ; } public void start() { paneeli_aplettiin.kaynnista_saie() ; } public void stop() { paneeli_aplettiin.lopeta_saie() ; } }