java - 如何停止运行剪辑
问题描述
我在那里尝试了一些关于它的主题,但音乐不会停止。我的代码看起来不错,但可能我遗漏了什么?
public void playMusic(String musicLocation) {
try {
File musicPath = new File(musicLocation);
AudioInputStream audioInput = AudioSystem.getAudioInputStream(musicPath);
Clip clip = AudioSystem.getClip();
clip.open(audioInput);
if (musicPath.exists()&&inGame == true) {
clip.start();
clip.loop(Clip.LOOP_CONTINUOUSLY);
}
if (musicPath.exists()&&inGame == false) {
clip.stop();
}
else {
System.out.println("Cannot find audio file!");
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
当游戏开始时,我点击开始,inGame值设置为 true,音乐开始播放。当回合结束时,值inGame设置为 false 但我上面的代码似乎不起作用。下面的代码使剪辑开始“当我按下's'键时”
if (key == 's' || key == 'S') {
inGame = true;
playMusic(filepath);
initGame();
}
谢谢你的想法。编辑:我忘了这个String filepath = "pacmanMusic.wav";
由于问题而添加:
private void death() {
pacsLeft--;
if(pacsLeft == 0) {
inGame = false;
//createFile();
}
writeScoreToFile();
continueLevel();
}
private void win() {
N_GHOSTS--;
if(N_GHOSTS == 0) {
inGame = false;
win_intro++;
}
continueLevelWin();
}
解决方案
我认为问题在于您假设 AudioSystem.getClip() 将返回当前剪辑,因此您可以在刚刚从 getClip() 获得的剪辑上调用 stop() 以停止当前播放音频,
据我所知,每次调用 getClip() 时,都会得到一个新剪辑。
因此,如果要停止当前正在播放的剪辑,则必须在开始播放时保留对剪辑的引用。然后,要停止该剪辑,您必须在同一个剪辑实例上调用 stop(),而不是一个新实例。
推荐阅读
- python-2.7 - 逐行比较两个文件数据并将它们之间的差异仅存储在另一个文件中
- angular - 在 TypeScript 中将字符串转换为字符串文字的更好方法
- angular - 如何处理 Effect 中的 If-else 条件以引发错误或从 API 返回响应?
- python - 如何在使用 os.rename 之前判断文件是否可以重命名
- html - 如何从 HTML 为 SCSS 变量设置值?
- flutter - 如何使用 FlutterDriver 检查小部件是否可见
- c++ - 如何使用 lambda 避免代码重复 const 和 non-const 集合处理
- javascript - 解析从 PHP 脚本返回 2D 数组到 Wordpress 代码块内的 Javascript 变量
- sql-server - MS SQL Server 2016,文件流
- ruby-on-rails - rails 在每个页面上呈现两个主体,当前和上一个