JavaFX媒体卷绑定

时间:2018-05-10 20:08:43

标签: javafx properties binding media volume

我正在开发JavaFX中的小游戏。 我有一个实用程序类来管理音乐:

private static Map<SongEnum, Media> songs = new EnumMap<>(SongEnum.class);
private static MediaPlayer currentSong;
public static void playSong(SongEnum song) {
    if(songs == null && currentSong != null) {
        currentSong.stop();
        currentSong = null;
    }
    Media media = songs.get(song);
    if(media == null) {
        String path = ApplicationUtils.class.getResource(song.getPath()).toExternalForm();
        media = new Media(path);
        songs.put(song, media);
    }
    if(currentSong != null) {
        if(currentSong.getMedia() == media)
            return;
        currentSong.stop();
    }
    currentSong = new MediaPlayer(media);
    currentSong.setCycleCount(MediaPlayer.INDEFINITE);
    currentSong.play();
}

我希望能够播放许多不同的歌曲 - 上面的方法是否正确? 此外,我不确定如何在这种情况下实现卷管理系统。我的第一个想法是使用MediaPlayer属性绑定一些滑块属性(位于另一个类中),但在这种情况下,每次歌曲更改时它都会更改。那么,实现它的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

在我们目前正在进行的游戏中,我们只使用了MediaPlayer的volume属性。我们将0.3放在背景主题上,0.81放在效果上,因为它们应高于背景主题。使用currentSong.setVolume("0 to 1");测试一下它是如何最好的。在使用滑块时,为什么不使用setOnEndOfMedia来循环播放歌曲。有了这个,音量不应该改变。这只适用于你当然只循环播放同一首歌的情况。

currentSong.setOnEndOfMedia(() -> {
        currentSong.seek(Duration.ZERO);
        currentSong.play();
    });

如果没有,我会添加make currentSong static,然后像"YourMediaClass.currentSong.setVolume("slider.getSliderValue or whatever you use")一样访问它。这可能就是你要找的东西。