Привязки томов JavaFX - PullRequest
       34

Привязки томов JavaFX

0 голосов
/ 10 мая 2018

Я работаю над небольшой игрой в 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 голосов
/ 11 мая 2018

В игре, над которой мы сейчас работаем, мы просто использовали свойство volume MediaPlayer.Мы помещаем 0.3 в фоновую тему и 0.8 или 1 в эффекты, так как они должны быть выше, чем фоновая тема.Проверьте это, посмотрите, как это работает лучше всего, используя 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").Это, вероятно, то, что вы ищете.

...