Вопрос 1. Как мне структурировать свой проект, чтобы файлы со звуком и изображениями могли быть загружены наиболее легко? Прямо сейчас у меня есть папка:
C:\java\pacman
с подкаталогом
C:\java\pacman\src
, содержащий весь код, и
C:\java\pacman\assets
содержит изображения и файлы .wav. Это лучшая структура или я должен разместить активы где-то еще?
Вопрос 2:
Как лучше всего обращаться к изображениям / звукам без использования полного пути, например, C:\java\pacman\assets\something.png
к ним? Если я использую функцию getCodeBase()
, кажется, что она ссылается на C:\java\pacman\bin
вместо C:\java\pacman\
.
Я хочу использовать такую функцию / класс, которая будет работать автоматически, когда я компилирую апплет в банке, а также прямо сейчас, когда я тестирую апплет через eclipse.
Вопрос 3: Как мне загрузить изображения / звуки? Вот что я сейчас использую:
1) Для общих изображений:
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();
}
Изображения, возвращаемые этой функцией, используются в методе drawImage
класса Graphics
в методе paint
апплета.
2) Для буферизованного изображения, которое используется для получения субизображений и загрузки спрайтов с листа спрайтов:
public BufferedImage getSheet() throws IOException
{
return ImageIO.read(new File(img.getPath("pacman-sprites.png")));
}
Позже:
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) Для звуковых файлов:
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();
}
}