打造轻量级Windows Phone7 游戏引擎-Samurai 第一话 Globals & Music

本文介绍如何在WindowsPhone游戏中实现音乐和音效管理,包括创建全局变量类SAGlobal以便于统一管理游戏资源,以及SAMusicManager类的具体实现细节,确保游戏音乐播放符合平台规定。

我们先建一个“Windows Phone游戏”项目名为SaDemo,然后在解决方案中添加一个新建项目“Windows Phone游戏库”,命名为Samurai,最后别忘了给SaDemo添加Samurai的引用。

(接下来不少类的命名都是以SA开头~)

Globals:(在Samurai中新建文件夹Globals,然后添加一个类,命名为SAGlobal)

正常的在XNA Game中我们总是会用到如下几个引用:game,spriteBatch,Content等。为了方便使用,我们专门写一个静态类SAGlobal来在全局使用这些变量。

当然了,spriteBatch是在LoadContent()方法中初始化的,所以,我们在LoadContent()中初始化SAGlobal类即可。

 public  static class SAGlobal
    {
        public static Game game;
        public  static ContentManager Content;
        public  static SpriteBatch spriteBatch;
        public static GraphicsDeviceManager graphics;

        public static void Setup(Game game, SpriteBatch spriteBatch, GraphicsDeviceManager graphics)
        {
            SAGlobal.game = game;
            SAGlobal.Content = game.Content;
            SAGlobal.spriteBatch = spriteBatch;
            SAGlobal.graphics = graphics;
        }
    }

Music:(与Globals没太大关系,因为篇幅比较小,所以写到一片博客里了)

新建文件夹Music,在里面添加一名为SAMusic的静态类。

音乐管理主要是处理音乐和音效,我们设置如下的几个变量:

        //音乐/音效集合
        static Dictionary<string, Song> songList = new Dictionary<string, Song>();
        static Dictionary<string, SoundEffect> soundList = new Dictionary<string, SoundEffect>();
        //依赖项 用于加载
        private static ContentManager Content;
        //标志
        private static bool IfPlayMusic;
        private static bool IfPlaySound;
        private static float songVolume;
        private static float soundEffectVolume;
方法的话,就是要注意

1.Setup()的时候会检测用户是否在听自己的音乐,如果是的话,它会将播放游戏音乐和音效的开关关闭。

2.播放音乐时,我们判断CanPlayMusic(),然后自己决定是否PlaySong()。

而播放音效时,我们不用判断,直接PlaySoundEffect()即可(会自己根据开关变量来选择是否播放)
3.方法的名字比较显而易见,大家试着调用一下差不多就了解了。

4.开发Windows Phone的同学要注意下,为了通过审核,我们的游戏在播放音乐之前一定要先判断用户是否在听他自己的音乐,如果是的话,我们可以:

a.询问他到底想听谁的,

b.不播放游戏的音乐(等他想听了,自己打开游戏的音乐设置)


代码的模块如下图:(写道这里发现,其实音调也可以设置的,但是漏掉了...)


 public static class SAMusicManager
    {
        //音乐/音效集合
        static Dictionary<string, Song> songList = new Dictionary<string, Song>();
        static Dictionary<string, SoundEffect> soundList = new Dictionary<string, SoundEffect>();
        //依赖项 用于加载
        private static ContentManager Content;
        //标志
        private static bool IfPlayMusic;
        private static bool IfPlaySound;
        private static float songVolume;
        private static float soundEffectVolume;

        //使用前需要先注册给SADirector
        public static void Setup(ContentManager content)
        {
            SAMusicManager.Content = content;
            IfPlaySound = IfPlayMusic = CanPlayMusic();
            SetVolume(1);
        }

        public static void Setup()
        {
            Setup(SAGlobal.Content);
        }
        
        #region Music总开关
        public static void DisableAll()
        {
            EnableSoundEffect(false);
            if (CanPlayMusic())
            {
                StopSong();
            }
        }

        public static void EnableAll(string name)
        {
            PlaySong(name);
            EnableSoundEffect(true);
        }
        #endregion

        #region 播放音乐相关
        public static void PlaySong(string name)
        {
            PlaySong(name,true);
        }    
        public static void PlaySong(string name, bool ifLoop)
        {
            if (!songList.ContainsKey(name))
            {
                songList.Add(name, Content.Load<Song>(name));
            }
            MediaPlayer.IsRepeating = ifLoop;
            MediaPlayer.Volume = songVolume;
            MediaPlayer.Play(songList[name]);
            IfPlayMusic = true;
        }
        public static void RemoveSong(string name)
        {
            if (songList.ContainsKey(name))
            {
                songList.Remove(name);
            }
        }
        public static bool CanPlayMusic()
        {
            return MediaPlayer.GameHasControl;
        }
        public static void PauseSong()
        {
            MediaPlayer.Pause();
            IfPlayMusic = false;
        }
        public static void StopSong()
        {
            MediaPlayer.Stop();
            IfPlayMusic = false;
        }
        public static void ResumeSong()
        {
            MediaPlayer.Resume();
            IfPlayMusic = true;
        }
        #endregion

        #region 播放音效相关
        public static void EnableSoundEffect(bool soundOn)
        {
            SAMusicManager.IfPlaySound = soundOn;
        }
        public static void PlaySoundEffect(string name)
        {
            if (IfPlaySound)
            {
                if (!soundList.ContainsKey(name))
                {
                    soundList.Add(name, Content.Load<SoundEffect>(name));
                }
                SoundEffectInstance temp = soundList[name].CreateInstance();
                temp.Volume = soundEffectVolume;
                temp.Play();
            }
        }
        public static void RemoveSoundEffect(string name)
        {
            if (soundList.ContainsKey(name))
            {
                soundList.Remove(name);
            }
        }
        #endregion

        #region 设置音量大小
        public static void SetVolume(float v)
        {
            SetSongVolume(v);
            SetSoundEffectVolume(v);
        }

        public static void SetSongVolume(float v)
        {
            if (v <= 1.0&&v>=0.0)
            {
                songVolume = v;
            }
        }

        public static void SetSoundEffectVolume( float v)
        {
            if (v <= 1.0&&v>=0.0)
            {
                soundEffectVolume = v;
            }
        }
        #endregion
    }


这两块的内容比较少,在后文中会给出一个整合了更多模块的使用样例来,敬请期待。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值