Pregunta

Pregunta 1: ¿Cómo debo estructurar mi proyecto para que los archivos de sonido e imágenes se puedan cargar más fácilmente? En este momento, tengo la carpeta:

C:\java\pacman

con el subdirectorio

C:\java\pacman\src

que contiene todo el código, y

C:\java\pacman\assets

que contiene las imágenes y archivos .wav. ¿Es esta la mejor estructura o debería poner los activos en otro lugar?

Pregunta 2:

¿Cuál es la mejor manera de referirse a las imágenes / sonidos sin usar la ruta completa, por ejemplo, C: \ java \ pacman \ asset \ something.png ? Si uso la función getCodeBase () , parece referirse a C: \ java \ pacman \ bin en lugar de C: \ java \ pacman \ .

Quiero usar una función / clase de este tipo que funcionaría automáticamente cuando compilo el applet en un jar, así como ahora mismo cuando pruebo el applet a través de eclipse.

Pregunta 3: ¿Cómo debo cargar las imágenes / sonidos? Esto es lo que estoy usando ahora:

1) Para imágenes generales:

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

Las imágenes devueltas de esta función se utilizan en el método drawImage de la clase Graphics en el método paint del applet.

2) Para una imagen almacenada en búfer, que se utiliza para obtener subImágenes y cargar sprites desde una hoja de sprites:

public BufferedImage getSheet() throws IOException
{
    return ImageIO.read(new File(img.getPath("pacman-sprites.png")));

}

Más tarde:

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) Para archivos de sonido:

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

}
¿Fue útil?

Solución

Colóquelos en su ruta de clase (colóquelos con sus archivos .class) y cárguelos utilizando 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);
    }
}

Salida de consola:

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top