夜深人静做游戏---之五

2.6 来点音乐

一般游戏为了解决枯燥的问题,通常还要加点音乐,,我们也来加点音乐,其实并不是那么难,想其他所有的编程一样,无非是调用微软的API函数就可以完成了,书归正传

我们可以使用MCI来简易地实现在程序中播放MIDIWAV等声音。使用它需要预先声明,我们需要在文件头#include <mmsystem.h>,并在工程中加入"winmm.lib"

    下面先让我们看看播放MIDI的过程。首先我们要打开设备:

MCI_OPEN_PARMS OpenParms;

OpenParms.lpstrDeviceType =

(LPCSTR) MCI_DEVTYPE_SEQUENCER; //MIDI类型文件

OpenParms.lpstrElementName = (LPCSTR) filename; //文件名

OpenParms.wDeviceID = 0; //打开的设备的标识,后面需要使用

mciSendCommand (NULL, MCI_OPEN,

MCI_WAIT | MCI_OPEN_TYPE |

MCI_OPEN_TYPE_ID | MCI_OPEN_ELEMENT,

(DWORD)(LPVOID) &OpenParms); //打开设备

   接着就可以播放MIDI了:

MCI_PLAY_PARMS PlayParms;

PlayParms.dwFrom = 0; //从什么时间位置播放,单位为毫秒

mciSendCommand (DeviceID, MCI_PLAY, //DeviceID需等于上面的设备标识

MCI_FROM, (DWORD)(LPVOID)&PlayParms); //播放MIDI

   停止播放:

      mciSendCommand (DeviceID, MCI_STOP, NULL, NULL);

   最后要关闭设备:

      mciSendCommand (DeviceID, MCI_CLOSE, NULL, NULL);

   打开WAV文件与打开MIDI文件的方法几乎完全相同,只是需要将MCI_DEVTYPE_SEQUENCER 改为MCI_DEVTYPE_WAVEFORM_AUDIO

还是结合我们的demo来讲比较清楚一点,在我们的demo里面,我采用了仙剑奇侠传里面的一个比较经典的那个音乐,你听了一定会知道是哪一个(希望大宇公司不要告我侵权呀,借来用用而已呀^_^).我在地图初始化的时候就加载这段音乐,所以我写了一个void map::sound()函数.

void map::sound()

{

    MCI_OPEN_PARMS OpenParms;

    OpenParms.lpstrDeviceType = (LPCSTR) MCI_DEVTYPE_SEQUENCER;

    OpenParms.lpstrElementName = (LPCSTR) "0311.mid";//要播放的音乐文件名

    OpenParms.wDeviceID = 0;

    mciSendCommand (NULL, MCI_OPEN, MCI_WAIT | MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID | MCI_OPEN_ELEMENT,(DWORD)(LPVOID) &OpenParms);

    MCI_PLAY_PARMS PlayParms;

    PlayParms.dwFrom = 0;

    mciSendCommand (OpenParms.wDeviceID, MCI_PLAY,MCI_FROM, (DWORD)(LPVOID)&PlayParms);

}

其他的函数和语句前面介绍过了,不再累赘了.完成这些以后你就能在我的demo里面听到仙剑奇侠传》的背景音乐了.

2.7 冒险去了

结合以上讲述的方法,再写一个好点的剧本,那么就可以冒险去了,于是我就有了现在的《理工冒险记》,虽然还有很多问题.但是勉强也算是一个单线情节的RPG,至于个中滋味,就要各位玩家自己亲身去体会了.这一节纯粹是游戏的宣传,没有一点技术含量,希望大家不要拿砖头砸我呀.

2.8 编后语

到这里,我想讲述的游戏编程的东东就基本上完了,但是必须要提醒大家的是,这只是沧海一粟,它本身是一个博大精深的东西,里面包含了无数前辈的智慧的结晶.随便找一本游戏编程的书来看看,你就知道,书中还提到:人工智能,游戏中的物理动作设计,动画制作, DirectSound,DirectInput,DirectPlay……,就是在图形显示部分都还有包含粒子应用,碰撞检测,地图卷轴技术……,举不胜举,这里特别有关于人工智能的一点要拿出来说一下:记得曾经一个老游戏程序员告诉我一句话,现在我转告给你们:"一个AI代表一个程序员的水平,程序员越聪明,就越能写出高明的计算机AI.,没有其他的意思,我比较喜欢这句话,所以就说给你们听.说了这么半天废话,我想要说的还是那句话,游戏编程是一个博大精深的领域,如果本文的阅读者有志于在这方面有所发展的话,强烈建议你买一本好书(怎么这个人没说几句话就又要买书啊,莫非真的是托?),花点时间好好看一看,动手写写code,那样的话,无论是你的编程水平,还是你做游戏的水平都会有一个质的提高.

树形动态规划(Tree DP)是一种解决树状结构问题的算法思想。它利用了树这种特殊的数据结构的性质进行求解,常用来解决树的最优路径、最大值、最小值等类型的问题。 在夜深人静的时候写算法,我通常会采用以下步骤来完成树形dp的实现: 第一步是定义状态。我们首先需要确定问题的状态表示方式。对于树形dp来说,常用的状态表示方式是以节点为单位进行表示。我们可以定义dp[i]表示以节点i为根的子树的某种性质,比如最大路径和、最长路径长度等。 第二步是确定状态转移方程。根据问题的特点,我们需要找到状态之间的关系,从而确定状态转移方程。在树形dp中,转移方程常常与节点的子节点相关联。我们可以通过遍历节点的子节点,利用它们的状态来更新当前节点的状态,从而得到新的状态。 第三步是确定初始条件。在动态规划中,我们需要确定初始状态的值。对于树形dp来说,我们可以选择将叶节点作为初始状态,然后逐步向上更新,最终得到整棵树的最优解。 第四步是确定计算顺序。树形dp的计算通常是从根节点开始,自顶向下逐步计算,直到达到叶节点。因为树形dp的计算过程中需要利用到子节点的状态来更新当前节点的状态,所以必须按照计算顺序进行。 夜深人静时,写算法树形dp是相对较复杂的算法,需要仔细思考问题的状态表示方式,转移方程以及初始条件。在实现过程中,可以采用递归的方式进行代码编写,或者利用栈等数据结构进行迭代实现。 总的来说,夜深人静写算法树形dp需要耐心和细心,经过思考和实践,才能顺利解决树状结构问题。但是,一旦理解并掌握了树形dp的思想和方法,就能够高效地解决各种树形结构问题,提升算法的效率和准确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值