RSS
热门关键字:
当前位置 : 主页>嵌入式开发>VxWorks>列表

在Pocket PC上编写游戏之九

来源:我要研发网 作者: 时间:1970-01-01 点击:



导读

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

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

字串4



NYI

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

NYI

字串4


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

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

NYI

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

  使用pgsnd.dll

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

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

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

字串4



  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(…)
字串6

pg_WaveStop(…)

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

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

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

  Ex:

while(GetMessage(....))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

pg_WaveClose();
字串9

最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名?
注册
相关文章