JavaFX:点击某物时播放声音

标签 java audio javafx

我目前在这里有我的事件处理程序:

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() 时简单地重新启动。原因是当媒体播放时,MediaPlayerStatus 不会从 PLAYING 更改为 STOPPED完成了。由于当 StatusPLAYINGplay() 不执行任何操作,因此不会重新启动。

要解决此问题,您必须首先使用 seek(Duration.ZERO) 将时间设置为 0,然后调用 play()。事实上,在第一次之后,如果您没有调用 pause()stop() ,则调用 play() 似乎没有必要> 之前的任何地方。

但是,由于您的音频只有一秒长,我仍然推荐 AudioClip。据我所知,该类(class)正是针对您正在做的事情而设计的。

关于JavaFX:点击某物时播放声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44274098/

相关文章:

java - 将 Access 2003 日期数字(整数)转换为 Java 日期

swift - 从 Swift 中的 unSafeMutablePointer Int16 获取音频数据的值(value)

JavaFx TextArea 提示文本

java - 接收来自特征的通知

Java 线程处理

java - 如何检查在 startActivityForResult 中按下了哪个按钮,重写 onActivityResult 方法?

android - 在 View 页面上播放简单的 .wav?

audio - 如何使用声卡测量5V信号

java - 根据内容更改 TableRow 颜色

java - 在 JavaFX 场景中传递对象的最佳方式是什么