Comment utiliser le son et les images dans une applet Java?
-
05-07-2019 - |
Question
Question 1: Comment structurer mon projet de manière à ce que les fichiers audio et les images puissent être chargés plus facilement? En ce moment, j'ai le dossier:
C:\java\pacman
avec le sous-répertoire
C:\java\pacman\src
contenant tout le code et
C:\java\pacman\assets
contenant les images et les fichiers .wav. Est-ce la meilleure structure ou devrais-je placer les actifs ailleurs?
Question 2:
Quel est le meilleur moyen de faire référence aux images / sons sans utiliser le chemin complet, par exemple C: \ java \ pacman \ assets \ quelque chose.png
? Si j'utilise la fonction getCodeBase ()
, il semble faire référence au C: \ java \ pacman \ bin
au lieu de C: \ java \ pacman \
.
Je veux utiliser une telle fonction / classe qui fonctionnerait automatiquement lorsque je compilerai l'applet dans un bocal, ainsi que maintenant, lorsque je testerai l'applet via eclipse.
Question 3: Comment dois-je charger les images / sons? C'est ce que j'utilise maintenant:
1) Pour les images générales:
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();
}
Les images renvoyées par cette fonction sont utilisées dans la méthode drawImage
de la classe Graphics
dans la méthode paint
de l'applet.
2) Pour une image mise en mémoire tampon, utilisée pour obtenir des sous-images et charger des images-objets à partir d'une feuille d'images-objets:
public BufferedImage getSheet() throws IOException
{
return ImageIO.read(new File(img.getPath("pacman-sprites.png")));
}
Plus tard:
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) Pour les fichiers 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();
}
}
La solution
Placez-les sur votre chemin de classe (avec vos fichiers .class) et chargez-les à l'aide de 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);
}
}
Sortie de la 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