选择显示字体大小

在pocket pc上编写游戏之九

  导读

  如何发出声音?我们首先需要了解pocket pc机器的硬件体系结构。我们有双声道设备(立体声模式)用来播放wave音频。不过有的设备只有一个声道(单音的模式)。如果我们有双声道,那么声音电路能生产的音频范围可以从8khz到44hkz。如果每条声道能分别地工作,我们便能产生简单的动态的声音。不幸地是技术上这是不可能的。

  我们使用api函数messagebeep(...)可以制造出声音。它听上去与windows的典型的系统报警声音一样。它可以被应用到一些小的简单游戏中,这是在游戏中产生声音或音响效果的最容易和最安全的方法。同时还可以减小你的游戏的文件大小。

<source listing 1, messagebeep> nyi

  在pocket pc上使游戏发出声音的另外的一个容易的方法是使用api函数playsound(...)。它可以用来录制和播放音频。因此你可以使用它给你的游戏增加声音,但你需要有外部的音频文件资源。音频文件的扩展名是“wav”。 它还可以被用来实现录制数字的音频好象录音机软件。你可以从许多地方找到合适的声音资源。在windows目录,在pocket pc系统中都有预装的一些声音。我们也能使用他们,象闹钟声、错误提示声等等。

<source listing 2, playsound> nyi

  playsound(...) 应用程序接口可以播放来自外部的wave文件和内在的wave资源,系统会将他们放到内存中(运行时刻产生)。 它有一些播放模式的的选择,例如,循环播放或顺序播放。

  sndplaysnd(...) 是一个playsound(...)的子集。它少了一些播放选择但是因此有获得了速度。它也可以通过外部的wave文件向游戏提供声音,并且播放的声音文件在win.ini文件中进行了注册。

<source listing 3, sndplaysound> nyi

  使用标准的api播放声音有一个主要的问题;当一个新声音播放时,前一个会停止。这在一般的游戏程序中可能算不上问题。可一个好的游戏,需要动态的产生声音,什么时候需要,什么时候便产生,声音出现完全取决于游戏的进行状态。我们怎样达到这种效果呢?

  使用pgsnd.dll

  我们可以使用windows多媒体扩展系统(mmsystem)来解决低级的播放音频api带来的问题。方法很简单,我们利用混频器引擎技术实现实时的数字混频。因为代码太复杂了。关于这个我不准备多将。但我们提供一个免费混频的引擎pgsnd.dll,你可以从网站下载栏目下载它。我们同时提供使用它的免费许可证。

  在使用这个库之前,你需要调用pg_waveinit(…) 应用程序接口函数。它将接管设备的声音系统。因此你将不能使用任何标准的声音api例如sndplaysound(…)。

  当你正在运行着一个应用时,你希望切换任务(使用另外一个应用程序),你的程序将失去焦点,但是并没有停止,仍然在运行。此时系统已经被pg_waveinit(…)钩住,你将没有办法实现在新的应用程序使用wav。怎么办呢?我们可以这样做当你的应用失去焦点或停止活动时,windows将自动地发送wm_activate消息到应用程序窗口。wparam将显示你的应用程序是处在停止还是激活的状态。然后可以用pg_waveactivate(…) 解决这个问题。

  ex:

wm_activate:
pg_waveactivate((bool)wparam);
break;

  pgsnd.dll的作用是对插槽/声道进行分配。当游戏需要的声音时,就指定插槽数。然后将声音发出到硬件输出设备。装载声音可以到任何插槽,pg_waveload(…)函数被用来处理这个任务。如果你装载新声音到任何已经存在的插槽,先前的声音将自动地被删除并且被新的代替。

  ex:

pg_waveload(g_hinst, 1000, 0); // load wave to slot 0
..
pg_waveplay(0,false); // start to play wave from slot 0

  有两个函数可以用来管理声音插槽, 他们是:

  ex:

pg_wavesetchannelvalume(…)
pg_wavestop(…)

  音量控制: 有三种音量控制类型; 主音量,所有的音乐音量,单独声道的音量。

  最后在退出你前应用前,你需要手工解下wave设备。如果你不这样做,声音将不能生产直到你已经重新启动你的机器。有些时候你的程序需要在退出之前就调用pg_waveclose (…)函数来解下设备,这也许会产生意想不到的事情或者在你的程序中产生一个错误。你同样需要重新启动机器来再次产生声音。

  这个反初始化操作最好的位置是在退出应用程序之前。

  ex:

while(getmessage(....))
{
translatemessage(&msg);
dispatchmessage(&msg);
}

pg_waveclose();



 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons