Yesky首页| 产品报价| 行情| 手机 | 数码 | 笔记本 | 台式机 | DIY硬件 | 外设 | 网络 | 数字家庭 | 评测 | 软件 | e时代 | 游戏 | 图片 | 壁纸 | 群乐 | 社区 | 博客 | 下载
您现在的位置: 天极网 > 开发频道 > 在Pocket PC上编写游戏之九
全文

在Pocket PC上编写游戏之九

2004-04-12 11:32 作者: 雷神编译 出处: VCHELP 责任编辑:方舟
天极IT资讯短信服务 电脑小技巧
资费:包月5元
手机:
介绍:细处着手,巧处用功。高手和菜鸟之间的差别就是:高手什么都知道,菜鸟知道一些。电脑小技巧收集最新奇招高招,让你轻松踏上高手之路。

  导读

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


网友关注
最新上市
编辑推荐
文章阅读排行
周排行
月排行
欢迎订阅天极网RSS聚合资讯:http://www.yesky.com/index.xml