我正在开发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属性绑定一些滑块属性(位于另一个类中),但在这种情况下,每次歌曲更改时它都会更改。那么,实现它的最佳方法是什么?
答案 0 :(得分:0)
在我们目前正在进行的游戏中,我们只使用了MediaPlayer的volume属性。我们将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")
一样访问它。这可能就是你要找的东西。