diff options
| author | hazel <hazel@hazelthats.me> | 2026-01-26 22:04:39 +0100 |
|---|---|---|
| committer | hazel <hazel@hazelthats.me> | 2026-01-26 22:04:39 +0100 |
| commit | 567c422f8cd42eba2437f9a8c2522716a1649be7 (patch) | |
| tree | 93c5b296f3b7c14b626d0aadf5cad37764c41c74 /source/game/music | |
| download | celesteia-567c422f8cd42eba2437f9a8c2522716a1649be7.tar.gz celesteia-567c422f8cd42eba2437f9a8c2522716a1649be7.tar.bz2 celesteia-567c422f8cd42eba2437f9a8c2522716a1649be7.zip | |
celesteia archive, last updated april 9th 2024
Signed-off-by: hazel <hazel@hazelthats.me>
Diffstat (limited to 'source/game/music')
| -rw-r--r-- | source/game/music/MusicManager.cs | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/source/game/music/MusicManager.cs b/source/game/music/MusicManager.cs new file mode 100644 index 0000000..8d9f9f5 --- /dev/null +++ b/source/game/music/MusicManager.cs @@ -0,0 +1,54 @@ +using System; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Media; + +namespace Celesteia.Game.Music { + public class MusicManager : GameComponent { + private new GameInstance Game => (GameInstance) base.Game; + public MusicManager(GameInstance Game) : base(Game) {} + + private float SetVolume = 0.1f; + private float _volume; + private Song _nextUp; + private float _elapsedTransitionTime; + private float _transitionDuration = 2f; + private bool _transitionComplete = false; + + public override void Update(GameTime gameTime) + { + if (_elapsedTransitionTime >= _transitionDuration) _volume = 1f; + else { + _elapsedTransitionTime += ((float)gameTime.ElapsedGameTime.TotalMilliseconds / 1000f); + + if (_elapsedTransitionTime >= _transitionDuration / 2f && !_transitionComplete) { + if (_nextUp != null) { + MediaPlayer.Play(_nextUp); + _nextUp = null; + } else Stop(); + + _transitionComplete = true; + } + + _volume = Volume(_elapsedTransitionTime); + } + + MediaPlayer.Volume = _volume * SetVolume; + } + + public void PlayNow(Song song, bool repeat = true) { + MediaPlayer.IsRepeating = repeat; + + _elapsedTransitionTime = MediaPlayer.State == MediaState.Playing ? 0f : 1f; + _transitionComplete = false; + _nextUp = song; + } + + public void Stop() { + MediaPlayer.Stop(); + } + + private float Volume(float x) { + return Math.Abs(x - (_transitionDuration / 2f)); + } + } +}
\ No newline at end of file |
