Como usar som e imagens em um applet java?
-
05-07-2019 - |
Pergunta
Pergunta 1: Como devo estruturar meu projeto para que os arquivos de som e imagens possam ser carregados com mais facilidade? No momento, eu tenho a pasta:
C:\java\pacman
com o subdiretório
C:\java\pacman\src
contendo todo o código e
C:\java\pacman\assets
contendo as imagens e arquivos .wav. Essa é a melhor estrutura ou devo colocar os ativos em outro lugar?
Questão 2:
Qual é a melhor maneira de se referir às imagens/sons sem usar o caminho completo, por exemplo, C:\java\pacman\assets\something.png
para eles? Se eu usar o getCodeBase()
função parece se referir ao C:\java\pacman\bin
ao invés de C:\java\pacman\
.
Quero usar essa função/classe que funcionaria automaticamente quando compilar o applet em um frasco e agora quando testo o applet através do Eclipse.
Pergunta 3: Como devo carregar as imagens/sons? É isso que estou usando agora:
1) Para imagens gerais:
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();
}
As imagens retornadas desta função são usadas no drawImage
Método do Graphics
classe no paint
Método do applet.
2) Para uma imagem em buffer, que é usada para obter subimagens e carregar sprites de uma folha de sprite:
public BufferedImage getSheet() throws IOException
{
return ImageIO.read(new File(img.getPath("pacman-sprites.png")));
}
Mais 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 arquivos de som:
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();
}
}
Solução
Coloque -os em seu caminho de classe (coloque -os com seus arquivos .class) e carregue -os usando o 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);
}
}
Saída do 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