示例#1
0
        public void Play()
        {
            if (IsEmitter)
            {
                var position = Game1.player.Position;
                Listener.Position = new Vector3(0, position.X * Distance, position.Y * Distance);
                Sound?.Apply3D(new AudioListener[] { Listener }, Emitter);
            }

            Sound?.Play();
            IsPlaying = true;

            UpdateThread = new Thread(Update);
            UpdateThread.Start();
        }
示例#2
0
        public void Update()
        {
            try
            {
                while (!Sound.IsDisposed && IsPlaying && Sound.State == SoundState.Playing)
                {
                    if (IsEmitter)
                    {
                        var position = Game1.player.Position;
                        var t        = new Vector3(0, position.X * Distance, position.Y * Distance);
                        if (t != Listener.Position)
                        {
                            Listener.Position = t;
                            Sound?.Apply3D(Listener, Emitter);
                        }
                    }

                    float mainvol    = (Ambient ? Game1.ambientPlayerVolume : Game1.musicPlayerVolume);
                    float optionsvol = (Ambient ? Game1.options.ambientVolumeLevel : Game1.options.musicVolumeLevel);

                    if (IsEmitter && MaxDistance < GetSquaredDistance(Game1.player.getTileLocation(), EmitterTile))
                    {
                        optionsvol = 0f;
                    }

                    SetVolume(Math.Min(optionsvol, mainvol));

                    Thread.Sleep(1);
                }
            }
            catch (Exception e)
            {
                CustomMusicMod.SMonitor.Log(e.Message + ";" + e.StackTrace, StardewModdingAPI.LogLevel.Error);
            }

            IsPlaying = false;
        }