Come usare l'audio e le immagini in un'applet Java?
-
05-07-2019 - |
Domanda
Domanda 1: come devo strutturare il mio progetto in modo che i file audio e di immagini possano essere caricati più facilmente? In questo momento, ho la cartella:
C:\java\pacman
con la sottodirectory
C:\java\pacman\src
contenente tutto il codice e
C:\java\pacman\assets
contenente le immagini e i file .wav. È la struttura migliore o dovrei mettere le risorse da qualche altra parte?
Domanda 2:
Qual è il modo migliore per fare riferimento alle immagini / ai suoni senza utilizzare l'intero percorso, ad esempio C: \ java \ pacman \ assets \ something.png
? Se uso la funzione getCodeBase ()
sembra fare riferimento alla C: \ java \ pacman \ bin
anziché a C: \ java \ pacman \
.
Voglio usare una tale funzione / classe che funzionerebbe automaticamente quando compilo l'applet in un barattolo così come adesso quando collaudo l'applet tramite eclipse.
Domanda 3: come devo caricare le immagini / i suoni? Questo è quello che sto usando ora:
1) Per immagini generali:
import java.awt.Image;
public Image getImg(String file)
{
//imgDir in this case is a hardcoded string containing
//"C:\\java\\pacman\\assets\\"
file=imgDir + file;
return new ImageIcon(file).getImage();
}
Le immagini restituite da questa funzione sono utilizzate nel metodo drawImage
della classe Graphics
nel metodo paint
dell'applet.
2) Per un'immagine con buffer, utilizzata per ottenere immagini secondarie e caricare sprite da un foglio sprite:
public BufferedImage getSheet() throws IOException
{
return ImageIO.read(new File(img.getPath("pacman-sprites.png")));
}
In seguito:
public void loadSprites()
{
BufferedImage sheet;
try
{
sheet=getSheet();
redGhost.setNormalImg(sheet.getSubimage(0, 60, 20, 20));
redGhost.setUpImg(sheet.getSubimage(0, 60, 20, 20));
redGhost.setDownImg(sheet.getSubimage(30, 60, 20, 20));
redGhost.setLeftImg(sheet.getSubimage(30, 60, 20, 20));
redGhost.setRightImg(sheet.getSubimage(60, 60, 20, 20));
}
catch (IOException e)
{
System.out.println("Couldnt open file!");
System.out.println(e.getLocalizedMessage());
}
}
3) Per i file audio:
import sun.audio.*;
import java.io.*;
public synchronized void play() {
try {
InputStream in = new FileInputStream(filename);
AudioStream as = new AudioStream(in);
AudioPlayer.player.start(as);
} catch (IOException e) {
e.printStackTrace();
}
}
Soluzione
Inseriscili sul tuo percorso di classe (posizionali con i tuoi file .class) e caricali usando ClassLoader .
Java:
package mypackage;
public class MyClass {
public static void main(String[] args) {
java.net.URL url = MyClass.class.getResource("/mypackage/image.gif");
System.out.println(url);
}
}
Uscita console:
C:\resource>dir /b /s
C:\resource\bin
C:\resource\src
C:\resource\bin\mypackage
C:\resource\bin\mypackage\image.gif
C:\resource\bin\mypackage\MyClass.class
C:\resource\src\mypackage
C:\resource\src\mypackage\MyClass.java
C:\resource>java -cp bin mypackage.MyClass
file:/C:/resource/bin/mypackage/image.gif