summaryrefslogtreecommitdiff
path: root/source/game/music/MusicManager.cs
diff options
context:
space:
mode:
Diffstat (limited to 'source/game/music/MusicManager.cs')
-rw-r--r--source/game/music/MusicManager.cs54
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