我目前在这里有我的EventHandler:
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);
当我运行程序时,只有第一次点击圆圈才能播放hitsound,但以下所有圆圈都不播放声音。我认为上面的内容应该有效,因为每次点击其他圆圈时,它总是会增加分数。因为我有我的mediaPlayer.play();在完全相同的if语句中作为添加分数的行,我期望声音也可以播放。每次点击圆圈时如何让我的hitsound发挥?
编辑:我添加了mediaPlayer.stop();在points.value ++之下,似乎偶尔会播放hitsound但并非总是如此。
答案 0 :(得分:2)
在问题评论中你提到音频只有一秒钟。如果使用AudioClip
的情况可能比Media
/ MediaPlayer
更适合您的需求。
与AudioClip
不同,MediaPlayer
可以多次并行播放(允许多次快速点击一次播放声音)。它也可以根据需要多次播放而不会有太多麻烦。
如果坚持使用MediaPlayer
James_D并且TomN似乎在正确的轨道上。从一些小测试开始,MediaPlayer
在到达媒体结束后似乎不会在您拨打play()
时重新启动。这样做的原因是,当媒体播放完毕后,Status
的{{1}}不会从MediaPlayer
更改为PLAYING
。由于STOPPED
在play()
为Status
时无效,因此PLAYING
无法重启。
要解决此问题,您必须先使用seek(Duration.ZERO)
将时间设置为0,然后调用play()
。事实上,如果您之前未曾在任何地方拨打play()
或pause()
,那么在第一次调用stop()
之后似乎没有必要。
但是,由于您的音频只有一秒钟,我仍然建议使用AudioClip
。本课程的设计正是为了您所能做的事情。
答案 1 :(得分:0)
您需要检查媒体播放器的状态,此方法可能有助于mediaPlayer.getStatus()
。
当它正在播放时,另一个play()
方法似乎什么也不做,因为它将状态改为播放但已经有了。请参阅MediaPlayer和MediaPlayer.Status
尝试在代码中使用以下方法。
mediaPlayer.stop()
它将停止媒体并将当前时间重置为零。
媒体结束时添加此方法。您可以尝试以下代码
mediaPlayer.setOnEndOfMedia(new Runnable()
{
public void run()
{
mediaPlayer.stop();
}
});
或使用mediaPlayer.seek()
寻求当前时间。
当之前的媒体尚未到达结束时,您需要暂停它并在下一个play()
之前将当前时间设为零。