LA MULTIMEDIALITÀ: LE IMMAGINI, LE ANIMAZIONI E I SUONI 1

Documenti analoghi
La multimedialità: le immagini, le animazioni e i suoni

A. Lorenzi, A. Rizzi Java. Programmazione ad oggetti e applicazioni Android Istituto Italiano Edizioni Atlas

FloorButton - pressed : Boolean = false + resetbutton( ) : void + pressbutton( ) : void

Programmazione. Cognome... Nome... Matricola... Prova scritta del 11 luglio 2014

COMPITO DI LABORATORIO DI PROGRAMMAZIONE Dicembre Alcune Soluzioni

Array. Walter Didimo

Corso sul linguaggio Java

Le basi del linguaggio Java

L applicazione di MVC alla simulazione di ascensore I COMPONENTI DELLE INTERFACCE UTENTE GRAFICHE: PARTE II 1

9 - Array. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Algoritmi di Ricerca. Esempi di programmi Java

Esempio su strutture dati dinamiche: ArrayList

Programmazione. Cognome... Nome... Matricola... Compitino del 17 gennaio 2007

Scope e visibilità per classi

Programmazione. Cognome... Nome... Matricola... Prova scritta del 22 settembre Negli esercizi proposti si utilizzano le seguenti classi:

Thread, classi attive e sequenze di modellazione IL MULTITHREADING 1

Esercizi riassuntivi (Fondamenti di Informatica 2 Walter Didimo) Soluzioni

Esercitazione n 2. Obiettivi

Programmazione orientata agli oggetti La classe Object, metodi e classi final, this. Object

Soluzione della prova scritta del 5 febbraio 2013

Esercizio: Lista Circolare

public static boolean occorre (int[] a, int n) { int i = 0; boolean trovato = false;

Algoritmi di Ricerca. Esempi di programmi Java

Gerarchia di classi Java 1

Programmazione orientata agli oggetti La classe Object, metodi e classi final, this. Object

Programmazione a Oggetti Modulo B

Programmazione Orientata agli Oggetti. Emilio Di Giacomo e Walter Didimo

public double getraggio() restituisce la lunghezza del raggio del cerchio che esegue il metodo.

Oggetti. La programmazione orientata agli oggetti, OOP (Object-Oriented Programming), prende il nome dall elemento su cui si basa, l oggetto.

14 - Metodi e Costruttori

Programmazione. Cognome... Nome... Matricola... Prova scritta del 20 febbraio 2012

Grafica in Java. introduzione

Java e i Tipi di dati primitivi. Parte 3

Esempio: Tombola! Vogliamo progettare una applicazione che realizza il gioco della tombola Versione semplificata: un banco, un

18 - Vettori. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

SET: specifica INTRODUZIONE. SET: esempio Si stampano i numeri casuali in ordine di generazione e il contenuto dell insieme.

Requisiti. Requisiti (cont.) Sapienza - Università di Roma Facoltà di Ingegneria

19 - Eccezioni. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Esempio su strutture dati dinamiche: ArrayList

Gerarchia di classi Java 1

Alberi. Strutture dati: Alberi. Alberi: Alcuni concetti. Alberi: definizione ricorsiva. Alberi: Una prima realizzazione. Alberi: prima Realizzazione

Programmazione orientata agli oggetti La classe Object, metodi e classi final, this. Object

SOLUZIONE. Requisiti. Requisiti (cont.) Requisiti (cont.) Sapienza - Università di Roma Facoltà di Ingegneria

Esempio su strutture dati dinamiche: ArrayList

Tecniche iterative. Walter Didimo

Programmazione a oggetti

Progettazione del Software

Alberi Binario in Java

Prova d Esame Compito A

Fondamenti di Informatica T1 Interfaccia Comparable Collezioni

Fondamenti di Informatica T-1

Insegnamento di Laboratorio di algoritmi e strutture dati

Diagramma delle classi UML

Grafico della parabola

Programmazione. Cognome... Nome... Matricola... Compitino del 24 novembre 2008

Note ed esercizi aggiuntivi

Corso sul linguaggio Java

{4, 4, 2, 9, 13} {2, 2, 9, 13, 0} {0, 4, 2, 9, 13} {2, 9, 13, 0, 0}

Preparazione allo scritto di Programmazione Comunicazione Digitale / Informatica - A.A. 2012/2013

Algoritmi di Ricerca. Esempi di programmi Java. Prof. Angela Bonifati

Fondamenti di informatica T-1 (A K) Esercitazione 8: classi e oggetti

Array di array. Walter Didimo

Corso sul linguaggio Java

Esempio su strutture dati dinamiche: ArrayList

Programmazione Orientata agli Oggetti in Linguaggio Java

Esercitazione n 2. Obiettivi

Laboratorio di Sistemi Classi e relazioni Java

Corso: Fondamenti di Informatica 1 (gruppo 8-9) Corsi di laurea: Area dell'informazione Questionario di autovalutazione 4

Astrazioni sui dati : Specifica di Tipi di Dato Astratti in Java

Prova d Esame Compito A

Sul pattern Iterator

Prova d Esame Compito A

Parte I Java. Metodologie di Programmaziona Secondo Appello, 14/2/2006 1

Proprietà delle Classi e degli Oggetti in Java

Diagramma delle classi UML

Esercizi di riepilogo (Fondamenti di Informatica 1 Walter Didimo)

OCA JAVA 7 SE PROGRAMMER I DOCENTE: DOTT. FAUSTO DELL ANNO

COGNOME.NOME. Matricola

Esercitazione 11. Liste semplici

Proprietà delle Classi e degli Oggetti in Java

Introduzione a Java e all'ambiente di sviluppo

Microsoft Visio 2002 UML Sergio Colosio

Liste doppie. Doubly Linked Lists. GT: 6.2 (e 3.3) Argomenti della lezione

Programmazione Orientata agli Oggetti in Linguaggio Java

Algoritmi e Strutture di Dati

SAPIENZA Università di Roma Facoltà di Ingegneria dell Informazione, Informatica e Statistica

Capitolo 9. Tipi enumerativi, tipi generici e interfacce. c 2005 Pearson Education Italia Capitolo 9-1 / 73

GESTIONE DEGLI ERRORI

Fondamenti di Informatica

GESTIONE DEGLI ERRORI

Corso: Fondamenti di Informatica (Gruppo 2) a.a Corsi di laurea: Ing. Settore Informazione

semplici ogni elemento contiene un riferimento al successivo doppie ogni elemento contiene un riferimento al successivo e al precedente

Programmazione II Compitino (Vers. B)

Programmazione in Java (I modulo) Lezione 20: Ereditarietà

Transcript:

LA MULTIMEDIALITÀ: LE IMMAGINI, LE ANIMAZIONI E I SUONI 1 8.7 (Caso di studio facoltativo) Pensare a oggetti: animazioni e suoni nella vista Questo caso di studio si è focalizzato principalmente sul modello MVC della nostra simulazione di ascensore. Ora che abbiamo completato la progettazione del modello, ci occupiamo della vista, che fornisce la presentazione visiva del modello. Nel nostro caso di studio, la vista, incapsulata nella classe ElevatorView, è un oggetto JPanel contenente altri oggetti JPanel figli, ognuno rappresentante un oggetto unico del modello MVC (per esempio, un oggetto Person, un oggetto Button, ecc.). La classe ElevatorView è la classe più grande nel caso di studio. In questa sezione, discutiamo le classi per la grafica e il suono usate da ElevatorView. Presenteremo e spiegheremo il resto del codice sul sito Web www.apogeonline.com/libri/ 02097/allegati/. Nella sezione 3.7 del volume Tecniche di base, abbiamo costruito il diagramma di classe del nostro modello individuando sostantivi e frasi dalla specifica del problema. Abbiamo ignorato parecchi di questi sostantivi, perché non erano associati con il modello MVC. Ora, elenchiamo i sostantivi e le frasi che sono relativi alla visualizzazione del modello MVC: visualizzazione audio musica dell ascensore. Il sostantivo visualizzazione corrisponde alla vista, o alla presentazione visuale, del modello MVC. Come descritto nella sezione 2.7, la classe ElevatorView aggrega diverse classi. Il sostantivo audio si riferisce agli effetti sonori che la nostra simulazione genera quando accadono varie azioni; creeremo la classe SoundEffects per generare tali effetti sonori. La frase musica dell ascensore si riferisce alla musica che viene riprodotta quando una persona viaggia sull ascensore; useremo la classe SoundEffects anche per riprodurre questa musica. La vista visualizza gli oggetti del modello MVC. Creeremo la classe ImagePanel per rappresentare gli oggetti stazionari del modello, come ElevatorShaft. Creeremo la classe MovingPanel, che estende ImagePanel, per rappresentare gli oggetti in movimento, come Elevator. Infine, creeremo la classe AnimatedPanel, che estende MovingPanel, per rappresentare gli oggetti in movimento la cui immagine corrispondente cambia continuamente, come Person (useremo diverse immagini per mostrare la persona che cammina e preme un pulsante). Usando queste classi, presentiamo il diagramma di classe della vista per la nostra simulazione nella figura 8.5. Le note indicano i ruoli che hanno le classi nel sistema. Secondo il diagramma di classe, la classe ElevatorView rappresenta la vista, le classi ImagePanel, MovingPanel e AnimatedPanel si riferiscono alla grafica e la classe SoundEffects si riferisce ai suoni. La classe ElevatorView contiene diverse istanze delle classi ImagePanel, MovingPanel e AnimatedPanel e un istanza della classe SoundEffects. Nella versione finale del caso di studio, assoceremo ogni oggetto del modello con una classe corrispondente nella vista. In questa sezione, discutiamo le classi ImagePanel, MovingPanel e AnimatedPanel per spiegare la grafica e le animazioni. Poi, discuteremo la classe SoundEffects per spiegare le funzionalità audio.

2 CAPITOLO 8 ImagePanel 1..* javax.swing.jpanel 1 MovingPanel 1..* 1 1 ElevatorView 1 Audio AnimatedPanel 1..* 1 SoundEffects Grafica Vista Figura 8.5 Diagramma di classe della vista del simulatore di ascensore ImagePanel La classe ElevatorView usa oggetti di sottoclassi di JPanel per rappresentare e visualizzare ogni oggetto nel modello (come Elevator, Person, ecc.). La classe ImagePanel (figura 8.6) è una sottoclasse di JPanel in grado di visualizzare un immagine in una data posizione dello schermo. La classe ElevatorView usa oggetti ImagePanel per rappresentare oggetti immobili nel modello, come ElevatorShaft e i due Floor. La classe ImagePanel contiene un attributo intero, ID (riga 16), che dichiara un identificatore unico per tenere traccia dell ImagePanel nella vista. Ciò è utile quando diversi oggetti della stessa classe sono presenti nel modello, come diversi oggetti Person. La classe ImagePanel contiene l oggetto position della classe Point2D.Double (riga 19) per rappresentare la sua posizione sullo schermo. Vedremo più avanti che MovingPanel, che estende ImagePanel, dichiara la velocità con valori double. Convertiremo le coordinate position in valori int per posizionare l oggetto ImagePanel sullo schermo (Java rappresenta le coordinate dello schermo come interi) nel metodo setposition (righe 90-94). La classe ImagePanel contiene anche un oggetto ImageIcon chiamato imageicon (riga 22), il cui metodo paintcomponent (righe 54-60) visualizza l icona sullo schermo. Le righe 41-42 inizializzano ImageIcon usando un parametro stringa che contiene il nome dell immagine. Infine, la classe ImagePanel contiene l oggetto panelchildren della classe Set (riga 25) che memorizza tutti gli oggetti JPanel figli (o oggetti di una sottoclasse di JPanel). Gli oggetti figli vengono visualizzati sopra il loro ImagePanel genitore: per esempio, un oggetto Person dentro un Elevator. Il primo metodo add (righe 63-67) aggiunge un oggetto a panelchildren. Il secondo metodo add (righe 70-74) inserisce un oggetto in panelchildren all indice specificato. Il metodo seticon (righe 84-87) imposta imageicon con una nuova immagine. Gli oggetti della classe AnimatedPanel usano ripetutamente il metodo seticon per cambiare l immagine visualizzata, in modo da eseguire l animazione.

LA MULTIMEDIALITÀ: LE IMMAGINI, LE ANIMAZIONI E I SUONI 3 1 // ImagePanel.java 2 // sottoclasse di JPanel per posizionare e visualizzare ImageIcon 3 package com.deitel.jhtp5.elevator.view; 4 5 // package Java di base Java 6 import java.awt.*; 7 import java.awt.geom.*; 8 import java.util.*; 9 10 // package Java di estensione 11 import javax.swing.*; 12 13 public class ImagePanel extends JPanel { 14 15 // identificatore 16 private int ID; 17 18 // posizione sullo schermo 19 private Point2D.Double position; 20 21 // imageicon da disegnare sullo schermo 22 private ImageIcon imageicon; 23 24 // memorizza tutti i figli di ImagePanel 25 private Set panelchildren; 26 27 // costruttore che inizializza posizione e immagine 28 public ImagePanel( int identifier, String imagename ) 29 { 30 super( null ); // specifica layout null 31 setopaque( false ); // rende trasparente 32 33 // imposta identificatore unico 34 ID = identifier; 35 36 // imposta posizione 37 position = new Point2D.Double( 0, 0 ); 38 setlocation( 0, 0 ); 39 40 // crea ImageIcon con imagename dato 41 imageicon = new ImageIcon( 42 getclass().getresource( imagename ) ); 43 44 Image image = imageicon.getimage(); 45 setsize( 46 image.getwidth( this ), image.getheight( this ) ); 47 48 // crea Set per memorizzare i figli di Panel Figura 8.6 La classe ImagePanel rappresenta e visualizza un oggetto immobile del modello (continua)

4 CAPITOLO 8 49 panelchildren = new HashSet(); 50 51 } // fine costruttore di ImagePanel 52 53 // disegna Panel sullo schermo 54 public void paintcomponent( Graphics g ) 55 { 56 super.paintcomponent( g ); 57 58 // se l immagine è pronta, disegnala sullo schermo 59 imageicon.painticon( this, g, 0, 0 ); 60 } 61 62 // aggiunge figlio di ImagePanel a ImagePanel 63 public void add( ImagePanel panel ) 64 { 65 panelchildren.add( panel ); 66 super.add( panel ); 67 } 68 69 // aggiunge figlio di ImagePanel a ImagePanel all indice dato 70 public void add( ImagePanel panel, int index ) 71 { 72 panelchildren.add( panel ); 73 super.add( panel, index ); 74 } 75 76 // rimuove figlio di ImagePanel da ImagePanel 77 public void remove( ImagePanel panel ) 78 { 79 panelchildren.remove( panel ); 80 super.remove( panel ); 81 } 82 83 // imposta ImageIcon corrente da visualizzare 84 public void seticon( ImageIcon icon ) 85 { 86 imageicon = icon; 87 } 88 89 // imposta posizione sullo schermo 90 public void setposition( double x, double y ) 91 { 92 position.setlocation( x, y ); 93 setlocation( ( int ) x, ( int ) y ); 94 } 95 96 // ritorna identificatore di ImagePanel Figura 8.6 La classe ImagePanel rappresenta e visualizza un oggetto immobile del modello (continua)

LA MULTIMEDIALITÀ: LE IMMAGINI, LE ANIMAZIONI E I SUONI 5 97 public int getid() 98 { 99 return ID; 100 } 101 102 // ottiene posizione di ImagePanel 103 public Point2D.Double getposition() 104 { 105 return position; 106 } 107 108 // ottiene imageicon 109 public ImageIcon getimageicon() 110 { 111 return imageicon; 112 } 113 114 // ottiene Set di figli di ImagePanel 115 public Set getchildren() 116 { 117 return panelchildren; 118 } 119 } Figura 8.6 La classe ImagePanel rappresenta e visualizza un oggetto immobile del modello MovingPanel La classe MovingPanel (figura 8.7) è una sottoclasse di ImagePanel in grado di cambiare la sua posizione sullo schermo in base ai valori xvelocity e yvelocity (righe 20-21). La classe ElevatorView usa oggetti MovingPanel per rappresentare oggetti mobili del modello, come Elevator. 1 // MovingPanel.java 2 // Sottoclasse di JPanel con funzionalità di movimento sullo schermo 3 package com.deitel.jhtp5.elevator.view; 4 5 // package Java di base 6 import java.awt.*; 7 import java.awt.geom.*; 8 import java.util.*; 9 10 // package Java di estensione 11 import javax.swing.*; 12 13 public class MovingPanel extends ImagePanel { 14 Figura 8.7 La classe MovingPanel rappresenta e visualizza un oggetto che si muove dal modello (continua)

6 CAPITOLO 8 15 // MovingPanel dovrebbe cambiare posizione? 16 private boolean moving; 17 18 // numero di pixel di cui MovingPanel si muove nelle direzioni x e y 19 // per animationdelay millisecondi 20 private double xvelocity; 21 private double yvelocity; 22 23 // costruttore che inizializza posizione, velocità e immagine 24 public MovingPanel( int identifier, String imagename ) 25 { 26 super( identifier, imagename ); 27 28 // imposta velocità di MovingPanel 29 xvelocity = 0; 30 yvelocity = 0; 31 32 } // fine costruttore di MovingPanel 33 34 // aggiorna posizione e animazione di MovingPanel 35 public void animate() 36 { 37 // aggiorna posizione a seconda della velocità 38 if ( ismoving() ) { 39 double oldxposition = getposition().getx(); 40 double oldyposition = getposition().gety(); 41 42 setposition( oldxposition + xvelocity, 43 oldyposition + yvelocity ); 44 } 45 46 // aggiorna tutti i figli di MovingPanel 47 Iterator iterator = getchildren().iterator(); 48 49 while ( iterator.hasnext() ) { 50 MovingPanel panel = ( MovingPanel ) iterator.next(); 51 panel.animate(); 52 } 53 } // fine metodo animate 54 55 // MovingPanel si sta muovendo sullo schermo? 56 public boolean ismoving() 57 { 58 return moving; 59 } 60 61 // imposta MovingPanel per muoversi sullo schermo 62 public void setmoving( boolean move ) Figura 8.7 La classe MovingPanel rappresenta e visualizza un oggetto che si muove dal modello (continua)

LA MULTIMEDIALITÀ: LE IMMAGINI, LE ANIMAZIONI E I SUONI 7 63 { 64 moving = move; 65 } 66 67 // imposta le velocità x e y di MovingPanel 68 public void setvelocity( double x, double y ) 69 { 70 xvelocity = x; 71 yvelocity = y; 72 } 73 74 // ritorna velocità x di MovingPanel 75 public double getxvelocity() 76 { 77 return xvelocity; 78 } 79 80 // ritorna velocità y di MovingPanel 81 public double getyvelocity() 82 { 83 return yvelocity; 84 } 85 } Figura 8.7 La classe MovingPanel rappresenta e visualizza un oggetto che si muove dal modello Il metodo animate (righe 35-53) muove MovingPanel secondo i valori attuali dei campi xvelocity e yvelocity. Se la variabile boolean moving (riga 16) è true, le righe 38-44 usano i campi xvelocity e yvelocity per determinare la prossima posizione di movingpanel. Le righe 47-52 ripetono il procedimento per tutti i figli. Nella nostra simulazione, ElevatorView invoca il metodo animate e il metodo paintcomponent della classe ImagePanel ogni 50 millisecondi. Queste chiamate in rapida successione spostano l oggetto MovingPanel. AnimatedPanel La classe AnimatedPanel (figura 8.8), che estende la classe MovingPanel, rappresenta un oggetto animato del modello (cioè, oggetti in movimento la cui immagine corrispondente cambia continuamente), come Person. La classe ElevatorView anima un AnimatedPanel cambiando l immagine associata con imageicon. 1 // AnimatedPanel.java 2 // Sottoclasse di Panel con funzionalità di animazione 3 package com.deitel.jhtp5.elevator.view; 4 5 // package Java di base 6 import java.awt.*; 7 import java.util.*; Figura 8.8 La classe AnimatedPanel rappresenta e visualizza un oggetto animato dal modello (continua)

8 CAPITOLO 8 8 9 // package Java di estensione 10 import javax.swing.*; 11 12 public class AnimatedPanel extends MovingPanel { 13 14 // ImageIcon deve essere animato? 15 private boolean animating; 16 17 // frequenza di cambio immagine 18 private int animationrate; 19 private int animationratecounter; 20 private boolean cycleforward = true; 21 22 // ImageIcon individuali usati per l animazione 23 private ImageIcon imageicons[]; 24 25 // memorizza tutte le sequenze di frame 26 private java.util.list framesequences; 27 private int currentanimation; 28 29 // deve continuare l animazione alla fine del ciclo? 30 private boolean loop; 31 32 // deve visualizzare l ultima immagine alla fine dell animazione? 33 private boolean displaylastframe; 34 35 // determina la prossima immagine da visualizzare 36 private int currentframecounter; 37 38 // costruttore che prende un array di nomi di file 39 public AnimatedPanel( int identifier, String imagename[] ) 40 { 41 super( identifier, imagename[0] ); 42 43 // crea oggetti ImageIcon dall array di stringhe imagename 44 imageicons = new ImageIcon[ imagename.length ]; 45 46 for ( int i = 0; i < imageicons.length; i++ ) { 47 imageicons[i] = new ImageIcon( 48 getclass().getresource( imagename[i] ) ); 49 } 50 51 framesequences = new ArrayList(); 52 53 } // fine costruttore di AnimatedPanel 54 55 // aggiorna posizione dell icona e immagine dell animazione 56 public void animate() Figura 8.8 La classe AnimatedPanel rappresenta e visualizza un oggetto animato dal modello (continua)

LA MULTIMEDIALITÀ: LE IMMAGINI, LE ANIMAZIONI E I SUONI 9 57 { 58 super.animate(); 59 60 // visualizza la prossima immagine se counter > frequenza di animazione 61 if ( framesequences!= null && isanimating() ) { 62 63 if ( animationratecounter > animationrate ) { 64 animationratecounter = 0; 65 determinenextframe(); 66 } 67 else 68 animationratecounter++; 69 } 70 } // fine metodo animate 71 72 // determina prossima immagine dell animazione 73 private void determinenextframe() 74 { 75 int framesequence[] = 76 ( int[] ) framesequences.get( currentanimation ); 77 78 // se non ci sono più immagini, determina immagine finale 79 // a meno che non si debba ripetere l animazione 80 if ( currentframecounter >= framesequence.length ) { 81 currentframecounter = 0; 82 83 // se loop è false, termina animazione 84 if (!isloop() ) { 85 86 setanimating( false ); 87 88 if ( isdisplaylastframe() ) 89 90 // visualizza ultima immagine della sequenza 91 currentframecounter = framesequence.length - 1; 92 } 93 } 94 95 // imposta immagine corrente dell animazione 96 setcurrentframe( framesequence[ currentframecounter ] ); 97 currentframecounter++; 98 99 } // fine metodo determinenextframe 100 101 // aggiunge animazione all ArrayList framesequences 102 public void addframesequence( int framesequence[] ) 103 { 104 framesequences.add( framesequence ); Figura 8.8 La classe AnimatedPanel rappresenta e visualizza un oggetto animato dal modello (continua)

10 CAPITOLO 8 105 } 106 107 // chiede se AnimatedPanel sta eseguendo l animazione 108 public boolean isanimating() 109 { 110 return animating; 111 } 112 113 // imposta AnimatedPanel per eseguire l animazione 114 public void setanimating( boolean animate ) 115 { 116 animating = animate; 117 } 118 119 // imposta ImageIcon corrente 120 public void setcurrentframe( int frame ) 121 { 122 seticon( imageicons[ frame ] ); 123 } 124 125 // imposta frequenza di animazione 126 public void setanimationrate( int rate ) 127 { 128 animationrate = rate; 129 } 130 131 // ottiene frequenza di animazione 132 public int getanimationrate() 133 { 134 return animationrate; 135 } 136 137 // imposta se l animazione deve ripetersi 138 public void setloop( boolean loopanimation ) 139 { 140 loop = loopanimation; 141 } 142 143 // ottiene se l animazione deve ripetersi 144 public boolean isloop() 145 { 146 return loop; 147 } 148 149 // ottiene se visualizzare l ultima immagine alla fine dell animazione 150 private boolean isdisplaylastframe() Figura 8.8 La classe AnimatedPanel rappresenta e visualizza un oggetto animato dal modello (continua)

LA MULTIMEDIALITÀ: LE IMMAGINI, LE ANIMAZIONI E I SUONI 11 151 { 152 return displaylastframe; 153 } 154 155 // imposta se visualizzare l ultima immagine alla fine dell animazione 156 public void setdisplaylastframe( boolean displayframe ) 157 { 158 displaylastframe = displayframe; 159 } 160 161 // inizia ad eseguire la sequenza di animazione all indice dato 162 public void playanimation( int framesequence ) 163 { 164 currentanimation = framesequence; 165 currentframecounter = 0; 166 setanimating( true ); 167 } 168 } Figura 8.8 La classe AnimatedPanel rappresenta e visualizza un oggetto animato dal modello La classe AnimatedPanel sceglie un oggetto ImageIcon da disegnare sullo schermo tra diversi oggetti ImageIcon memorizzati nell array imageicons (riga 23). La classe AnimatedPanel determina l oggetto ImageIcon secondo una sequenza di riferimenti, memorizzata nella lista framesequences (riga 26), che è un array di interi che memorizza la sequenza appropriata per visualizzare gli oggetti ImageIcon: in particolare, ogni intero rappresenta l indice di un oggetto ImageIcon nell array imageicons. La figura 8.9 mostra la relazione tra imageicons e framesequences (questo non è un diagramma UML). Per esempio, la sequenza numero 2 = { 2, 1, 0 } si riferisce a { imageicon[2], imageicon[1], imageicon[0] }, che porta alla sequenza di immagini { C, B, A }. Nella vista, ogni immagine è un file.png unico. Il metodo addframesequences (righe 102-105) aggiunge una sequenza di animazione alla lista framesequences. Il metodo playanimation (righe 162-167) fa partire l animazione asso- framesequences image sequences imageicons 0= 0 1 2 A B C 1= 0 1 3 1 0 A B C D A B D B A 0 1 2 3 2= 2 1 0 C B A 3= 3 2 2 0 D C C A Figura 8.9 Relazione tra l array imageicons e la lista FrameSequences

12 CAPITOLO 8 ciata con il parametro framesequences. Per esempio, supponiamo di avere un oggetto AnimatedPanel chiamato personanimatedpanel nella classe ElevatorView. Il frammento di codice animatedpanel.playanimation( 1 ); genererebbe la sequenza di immagini { A, B, D, B, A } se usiamo la figura 8.9 come riferimento. Il metodo animate (righe 56-70) sovrascrive il metodo animate della superclasse MovingPanel. Le righe 61-69 determinano la successiva immagine per l animazione a seconda del campo animationrate, che è inversamente proporzionale alla velocità dell animazione: un valore più alto per animationrate comporta un animazione più lenta. Per esempio, se animationrate vale 5, animate si sposta alla successiva immagine dell animazione ogni cinque volte viene invocato. Usando questa logica, la frequenza di animazione viene massimizzata quando animationrate ha un valore 1, perché la successiva immagine viene determinata ogni volta che viene chiamato animate. Il metodo animate chiama determinenextframe (righe 73-99) per determinare la successiva immagine da visualizzare: in particolare, viene chiamato il metodo setcurrentframe (righe 120-123) che imposta imageicon (l immagine correntemente visualizzata) all immagine ritornata dalla corrente sequenza di animazione. Le righe 84-92 di determinenextframe vengono usate per ripetere l animazione. Se loop vale false, l animazione termina dopo una iterazione. L ultima immagine della sequenza viene visualizzata se displaylastframe vale true, e, se vale false, viene visualizzata la prima immagine della sequenza. Se loop vale true, l animazione si ripete finché non viene fermata esplicitamente. Effetti sonori Vediamo ora come generare dei suoni nella nostra simulazione. La classe SoundEffects (figura 8.10) trasforma file audio (.au), wave (.wav) e MIDI (.mid) contenenti suoni come il campanello, i passi della persona e la musica dell ascensore, in oggetti java.applet.audioclip. L oggetto ElevatorView riprodurrà gli oggetti AudioClip per generare i suoni. Tutti i file dei suoni sono nella struttura di directory com/deitel/jhtp5/elevator/view/sounds Nella nostra simulazione, useremo suoni e file MIDI disponibili gratuitamente al sito Web di Microsoft: msdn.microsoft.com/downloads/default.asp Per scaricare questi suoni, fate clic su Graphics and Multimedia, Multimedia (General), e poi Sounds. La classe SoundEffects contiene i metodi getaudioclip (righe 16-27), che usa il metodo statico newaudioclip (della classe java.applet.applet) per ritornare un oggetto AudioClip usando il parametro soundfile. Il metodo setpathprefix (righe 30-33) permette di cambiare directory del file audio (utile se vogliamo dividere i nostri file sonori tra directory diverse).

LA MULTIMEDIALITÀ: LE IMMAGINI, LE ANIMAZIONI E I SUONI 13 1 // SoundEffects.java 2 // Ritorna oggetti AudioClip 3 package com.deitel.jhtp5.elevator.view; 4 5 // package Java di base 6 import java.applet.*; 7 8 public class SoundEffects { 9 10 // posizione dei file audio 11 private String prefix = ; 12 13 public SoundEffects() {} 14 15 // ottiene AudioClip associato con soundfile 16 public AudioClip getaudioclip( String soundfile ) 17 { 18 try { 19 return Applet.newAudioClip( getclass().getresource( 20 prefix + soundfile ) ); 21 } 22 23 // ritorna null se il file audio non esiste 24 catch ( NullPointerException nullpointerexception ) { 25 return null; 26 } 27 } 28 29 // imposta prefisso per la posizione di soundfile 30 public void setpathprefix( String string ) 31 { 32 prefix = string; 33 } 34 } Figura 8.10 La classe SoundEffects ritorna oggetti AudioClip Conclusione Avete appena completato un procedimento di progettazione orientata agli oggetti che aveva lo scopo di prepararvi per le sfide dei progetti di livello industriale. Speriamo che abbiate trovato le sezioni Pensare a oggetti informative e utili come complemento al materiale presentato nei vari capitoli. Inoltre, speriamo vi siate divertiti a progettare il sistema usando UML. Il linguaggio UML è stato adottato come standard dall industria del software mondiale per la modellazione di software orientato agli oggetti. Anche se avete completato la fase di progettazione, avete solo sfiorato il processo di implementazione. Consultate il sito Web www.apogeonline.com/libri/02097/allegati/ per la completa implementazione del progetto, e le traduzioni dei diagrammi UML in un programma Java completo per la simulazione dell ascensore. Studiare l implementazione rafforzerà le abilità nella programmazione che avete sviluppato leggendo il libro e migliorerà la vostra comprensione del processo di progettazione.