我有一个游戏,我已经开发了很长一段时间,这里是预览:
游戏描述:
-1 v 1
- 有声音
... -etc
问题:声音,只要玩家发射武器,游戏就会播放所需的声音,但这样做会产生更多线程。我认为这是为了确保声音和游戏玩法可以同时运行。
当我向用户显示 Thread.activeCount()方法时,额外的线程数很明显。
当游戏开始时,默认主线程的线程数为3,对于从构造函数开始的另一个线程,线程计数为1,而另一个线程从点击JMenuBar开始。
这里是线程数的变化:
首次开始游戏时。
在玩家发射激光后,这会导致声音播放(这似乎是额外线程创建的罪魁祸首)。
这里有一个代码,当一个人按下时,激光发出声音 键盘上的某个按钮。
private void playClip() { //called when player fires lasers
Clip clip;
AudioInputStream auIn = null;
try {
auIn = ai; //instance variable 'ai' initialized in constr
ai = null; //'ai' is AudioInputStream object, which used an URL
clip = AudioSystem.getClip();
clip.open(auIn);
clip.start();
}
catch (LineUnavailableException | IOException ex) {
err.println(ex);
ex.printStackTrace(System.err);
Logger.getLogger(OuterSpace.class.getName()).log(Level.SEVERE, null, ex);
}
finally {
if (auIn != null) {
try {
auIn.close();
}
catch (IOException ex) {
err.println(ex);
ex.printStackTrace(System.err);
Logger.getLogger(OuterSpace.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
try { //for some reason, i have to reinitialize, in order to hear
//the sounds again, note again, 'ai' is AudioInputStream, also
//'url' is the URL where the sound file is at.
this.ai = AudioSystem.getAudioInputStream(this.url);
}
catch (UnsupportedAudioFileException | IOException ex) {
err.println(ex);
ex.printStackTrace(System.err);
Logger.getLogger(OuterSpace.class.getName()).log(Level.SEVERE, null, ex);
}
}
我的主要问题是:为什么上面这个声音代码创建了更多的线程,为什么这些线程没有被删除'。欢迎提出建议和提示!谢谢。 (抱歉格式混乱!)