2009-03-08 4 views
1

Question 1: Comment structurer mon projet pour que les fichiers sons et images puissent être chargés plus facilement? En ce moment, j'ai le dossier:Comment utiliser le son et les images dans une applet Java?

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 dois-je mettre les actifs ailleurs?

Question 2:

Quelle est la meilleure façon de se référer aux images/sons sans utiliser le chemin complet pour les C:\java\pacman\assets\something.png par exemple? Si j'utilise la fonction getCodeBase(), il semble se référer à C:\java\pacman\bin au lieu de C:\java\pacman\. Je veux utiliser une telle fonction/classe qui fonctionnerait automatiquement quand je compilerais l'applet dans un pot aussi bien que maintenant quand je teste l'applet par éclipse.

Question 3: Comment charger les images/sons? Voilà ce que je me sers 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és dans la méthode drawImage de la classe Graphics dans la méthode paint de l'applet.

2) Pour une image en mémoire tampon, qui est utilisé pour obtenir des sous-images et charge sprites à partir d'une feuille de sprite:

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 sonores:

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(); 
    } 

} 

Répondre

1

Placez-les sur votre classpath (placez-les avec vos fichiers .class) et chargez-les en utilisant le 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 
+0

Ne fonctionne pas :(retourne toujours nulle, même quand je mets l'image dans le chemin de classe –

+0

System.out.println ("Il donne: "It ispacman-intro.png, null", et sur la ligne suivante, je reçois une exception IllegalArgumentException essayez d'utiliser le fichier nul –

+0

Mettez le .png où vous avez votre fichier java et faites: URL u rl = this.getClass(). getResource ("player.png"); System.out.println (url); – Tommy