动网论坛,站长建站首选,国内使用量最多的论坛软件 动网论坛官方技术讨论区 站长工具 申请属于您自己的免费论坛
首页 | 新闻资讯 | 网站运营 | 网络编程 | 数据库 | 服务器 | 网页设计 | 图像媒体 | 网络应用 | 搜索优化 | 资源下载 | 动网主机 | DVBOX
    本站内  互联网 ASP论坛  ASP.Net论坛  PHP论坛
   程序开发 → 阅读文章

 在Pocket PC上编写游戏之九

作者来源: 
阅读 数 226 人次 , 2006-4-25 9:14:00 

  导读

  如何发出声音?我们首先需要了解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();


  
 
 收藏本文  打印本文  论坛讨论  关闭窗口
· 上一篇:Windows Mobile开发工具简介
· 下一篇:GCC开发工具简介
· 软件配置管理最佳实践
· 选择Windows CE 还是 Palm OS
· 用预测性对象点度量面向对象软件(1)
· Platform Builder实践之运行环境
· 教你一招 Windows XP任务栏的妙用


关于本站 | 联系我们 | 业务合作 | 客户案例 | 诚聘英才 | 广告合作 | 收藏本站
海口动网先锋网络科技有限公司版权所有
Copyright © 2000 - 2006 Cndw.Com
中华人民共和国电信与信息服务业务经营许可证编号 琼 ICP 020077