我目前在这里有我的事件处理程序:
theScene.setOnMouseClicked(
new EventHandler<MouseEvent>() {
public void handle(MouseEvent e) {
if (targetData.containsPoint(e.getX(), e.getY())) {
double x = 50 + 400 * Math.random();
double y = 50 + 400 * Math.random();
targetData.setCenter(x, y);
mediaPlayer.play(); //play hitsound
points.value++; //add points
} else {
points.value = 0; //miss
}
}
});
我的音频设置也是这样的:
String hitNormal = ("hit.mp3");
Media sound = new Media(new File(hitNormal).toURI().toString());
MediaPlayer mediaPlayer = new MediaPlayer(sound);
当我运行程序时,只有第一次单击圆圈时会播放点击声音,但后面的所有圆圈都不播放声音。我认为上面的内容应该有效,因为每次我单击其他圆圈时,它总是会增加分数。因为我有我的 mediaPlayer.play();在与添加分数的行完全相同的 if 语句中,我希望声音也能播放。如何让每次点击圆圈时播放点击声音?
编辑:我添加了 mediaPlayer.stop();在points.value++下,它似乎偶尔会播放点击声音,但并非总是如此。
最佳答案
在问题评论中,您提到音频只有一秒长。如果是这种情况,使用 AudioClip
可能比 Media
/MediaPlayer
更适合您的需求。
与 MediaPlayer
不同,AudioClip
可以并行播放多次(允许多次快速点击一次播放声音)。您还可以轻松地多次播放它。
如果您坚持使用 MediaPlayer
James_D 和 TomN 似乎走在正确的道路上。从一些小测试来看,在到达媒体末尾后,MediaPlayer
似乎不会在您调用 play()
时简单地重新启动。原因是当媒体播放时,MediaPlayer
的 Status
不会从 PLAYING
更改为 STOPPED
完成了。由于当 Status
为 PLAYING
时 play()
不执行任何操作,因此不会重新启动。
要解决此问题,您必须首先使用 seek(Duration.ZERO)
将时间设置为 0,然后调用 play()
。事实上,在第一次之后,如果您没有调用 pause()
或 stop()
,则调用 play()
似乎没有必要> 之前的任何地方。
但是,由于您的音频只有一秒长,我仍然推荐 AudioClip
。据我所知,该类(class)正是针对您正在做的事情而设计的。
关于JavaFX:点击某物时播放声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44274098/