javafx:每当点击某些东西时播放声音



我当前在这里有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((;在语句与增加分数的行完全相同的情况下,我期望声音也会播放。每次点击圆圈时,我该如何使我的跳动播放?

编辑:我添加了MediaPlayer.stop((;在points.value 下,似乎偶尔会播放hitsound,但并非总是如此。

在您提到的问题注释中,音频仅长一秒钟。如果是这样使用AudioClip的情况,则可能比Media/MediaPlayer更适合您的需求。

MediaPlayer不同,AudioClip可以并行多次播放(允许多次快速命中一次(。它也可以随心所欲地玩多次。

如果您坚持使用MediaPlayer JAMES_D,而Tomn似乎在正确的轨道上。从一些小测试中,似乎MediaPlayer到达媒体结束后,在调用play()时不仅重新启动。原因是因为媒体完成后,MediaPlayerStatus不会从PLAYING变为STOPPED。而且,由于play()StatusPLAYING时无能为力,因此不会重新启动。

要解决这个问题,您必须首先使用seek(Duration.ZERO)将时间设置为0,然后致电play()。实际上,在第一次以前没有打电话给pause()stop()的第一次拨打play()

但是,由于您的音频只有第二秒,所以我仍然建议AudioClip。该课程是为您从我能告诉的。

您需要正确检查媒体播放器的状态,此方法可能会帮助mediaPlayer.getStatus()

播放时,另一种play()方法似乎无能为力,因为它将状态更改为播放,但已经改变了。请参阅MediaPlayer和MediaPlayer.status


尝试在代码中使用以下方法。

mediaPlayer.stop()它将阻止媒体并将当前时间重置为零。

媒体结束时添加此方法。您可以尝试以下代码

mediaPlayer.setOnEndOfMedia(new Runnable() 
{
    public void run() 
    {
        mediaPlayer.stop();
    }
});

或使用mediaPlayer.seek()查找当前时间。

当以前的媒体尚未到达结束时,您需要暂停它,并在下一个play()之前寻求当前时间为零。

最新更新