擎墨閣文學 2008-5-1 11:59
扑克牌类游戏DIY之一:整体布局的设计 (6)
[table=98%][tr][td]游戏吗,少不了要添加点声音才有趣味性。VB自带有一个MCI32.OCX控件,可以播放多媒体文件,在游戏中加入几个实例便可轻松播放各种背景音乐,与游戏音效。但这要在软件传播时,带上这个近200K的控件,且需在新系统中注册才能使用,这一般要通过VB的打包向导完成,无形中又得再加上一批其它文件,一个小游戏的安装包少说得2M以上,不利于软件的传播。[/td][/tr][/table][table=98%][tr][td]其实背景音乐无需那么多控制功能,游戏中需用到的很少,占用这么多容量太浪费了。不妨试试利用Windows API代替,只需几行代码便可搞定,系统自有的功能为什么不用呢?以后编写各种其它软件也都可照搬不误!现在的主流系统都是win98第二版以上了,用API播放MIDI或WAV不会有任何问题,而且大多数情况下MP3也能放。说来说去,只要不得一个API声明就够了,当然对WAV文件我用了一个更“专业”一点的API,下面是实例。[/td][/tr][/table][table=98%][tr][td]API声明:[/td][/tr][/table][table=98%][tr][td]Public Declare Function PlayMCI Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long '各种系统支持的MCI设备都可用它下命令[/td][/tr][/table][table=98%][tr][td]Public Declare Function PlayWav Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal lpszSoundName As String, ByVal uFlags As Long) As Long '专放WAV的API,音效靠它就行了[/td][/tr][/table][table=98%][tr][td]加入Sub Main过程的变量赋值:[/td][/tr][/table][table=98%][tr][td]gstrInOpenMci="c:\mp3\ddz.mp3" '用一个全局变量保存音乐文件,便于控制[/td][/tr][/table][table=98%][tr][td]播放音乐的过程:[/td][/tr][/table][table=98%][tr][td]Sub Music(Start as Boolean)[/td][/tr][/table][table=98%][tr][td]If Start then 'Start变量是播放音乐的开关[/td][/tr][/table][table=98%][tr][td]PlayMCI "Open """ & gstrInOpenMci & """", "", 0, 0 '注意MCI命令(如:Open)后要有一个空格,音乐文件名最好用引号括起来,VB字符串中要加一个引号,必须用两个引号("")表示。[/td][/tr][/table][table=98%][tr][td]PlayMCI "Play """ & gstrInOpenMci & """", "", 0, 0 '播放用open命令打开的文件[/td][/tr][/table][table=98%][tr][td]Timer1 = True '启动监视播放状态的Timer控件,后面有说明[/td][/tr][/table][table=98%][tr][td]Else[/td][/tr][/table][table=98%][tr][td]PlayMCI "Close """ & gstrInOpenMci & """", "", 0, 0 '关闭用open命令打开的文件[/td][/tr][/table][table=98%][tr][td]Timer1 = False '关闭监视播放状态的Timer控件[/td][/tr][/table][table=98%][tr][td]End If[/td][/tr][/table][table=98%][tr][td]End Sub[/td][/tr][/table][table=98%][tr][td]音乐播放后,不会自已重播或换曲,用个Timer控件可监视它,并实现更多控制。Interval属性设为1000即可,Timer事件中加入以下代码:[/td][/tr][/table][table=98%][tr][td]Private Sub Timer1_Timer()[/td][/tr][/table][table=98%][tr][td]Dim restr As String * 255 '定义一个用于接收API返回串的定长字符串[/td][/tr][/table][table=98%][tr][td]PlayMCI "status """ & gstrInOpenMci & """ mode", restr, 255, 0 '查询音乐播放状态[/td][/tr][/table][table=98%][tr][td]If LCase$(Left$(restr, 7)) = "stopped" Then '如果已停止就重播[/td][/tr][/table][table=98%][tr][td]Music False[/td][/tr][/table][table=98%][tr][td]Music True[/td][/tr][/table][table=98%][tr][td]End If[/td][/tr][/table][table=98%][tr][td]End Sub[/td][/tr][/table][table=98%][tr][td]至于音效,只需一句便行了:[/td][/tr][/table][table=98%][tr][td]PlayWav "c:\ddz\wav\click.wav", &H1 '标志值是&H1表示同步,&H0表示异步[/td][/tr][/table]