DIY自己的“贪吃蛇”(3)——用BREW设计游戏音效

数字办公

上期我们一起用BREW设计手机游戏“贪吃蛇”的游戏主画面,但是好游戏如果没有音乐来衬托,就像炒菜没放盐一样,所以这期我们就来讲讲如何DIY自己心爱的音效。

“贪吃蛇”音效的设计思路

当游戏开始时,播放背景音乐,如果贪吃蛇吃到食物就播放一声特殊音效,在游戏结束时,停止播放背景音乐(见图)。

33-f14-1.jpg

“贪吃蛇”音效的接口选择

BREW API 里面基本的播放声音的接口有如下几种:

●ISound接口:提供基本的声音服务,可以用来播放蜂鸣、铃声、振动、各种音调以及音调序列。该接口定义了一系列音调,可以播放指定的时间长度或者持续播放直到停止。

●ISoundPlayer接口:“提供了多媒体声音服务,支持MIDI、MP3等格式,不过高通官方的API里面现在已经不推荐使用了,所以不再多介绍。

●IMedia 接口:提供了强大的音频播放功能,支持MIDI、MP3、QCP等多种格式,Media 接口提供了一系列播放或录音控制函数,比如音频的播放、录音、定位、暂停等功能。

在游戏中我们用到了两种音效。一种是播放游戏的背景音乐(使用IMedia 接口),另一种是特殊音效:当蛇吃到食物后播放类似“嘟”一声的提示音(使用ISound接口)。

“贪吃蛇”音效代码是如何编写的

第一步:变量定义

首先引入音效接口需要使用的头文件。

#include "AEESound.h"//音效

#include "AEEMedia.h"//音效

然后在结构体snake里加入全局变量,修改后的结构体如下: */

typedef struct _snake {

AEEApplet a ; // First element of this structure must be AEEApplet

AEEDeviceInfo DeviceInfo; // always have access to the hardware device information

// add your own variables here...

int Mode; //程序中状态

IMenuCtl *pIMenuCtl; //菜单接口

AEERect ScreenRect; //屏幕大小矩形

//游戏画面和逻辑相关

int x[SNAKE_MAX_LENGTH];//int x; 蛇每节X坐标

int y[SNAKE_MAX_LENGTH];//int y; 蛇每节Y坐标

int length; //蛇当前长度(节数)

int direction; // 蛇的移动方向

int life; // 蛇的生命: LIVE 1 活着,DEAD 0 死亡

int foodx; // 食物X坐标

int foody; // 食物Y坐标

boolean yes; // 1,需要生成食物; 0,不需要

unsigned int scores; //得分

//sound

IMedia *pimedia; //新增的音频接口

} snake;

第二步:添加音效功能

我们要在snake_HandleEvent函数中,加入播放背景音乐的代码:

case EVT_COMMAND:

switch (wParam){//各菜单选择后处理

case ITEM_MENU_START://开始游戏

……

/* 上面是以前的代码,新增一句音效播放代码 */

playSound(pMe);

break;

在main_Display函数中播放特殊音效:

case MODE_GAME://游戏状态

……

/* 吃到食物*/

if ((pMe->x[0] == pMe->foodx) && (pMe->y[0] == pMe->foody)){

playTone(pMe);//播放音效

第三步:实现音效功能播放

/*播放背景音乐 */

void playSound(snake* pMe){

AEEMediaData pinfo; /* 音频源信息 */

pinfo.clsData = MMD_FILE_NAME; /* 指定文件 */

pinfo.pData = (void *)"test.mp3"; /* 指向文件名的指针 */

pinfo.dwSize = NULL; /* 缓冲区地址,指向文件时无效 */

ISHELL_CreateInstance(pMe->a.m_pIShell, AEECLSID_MEDIAMP3,

(void **)&(pMe->pimedia)); /* 创建pimedia对象,指定使用MP3文件 */

IMEDIA_SetMediaData(pMe->pimedia, &pinfo); /* 设置音频信息 */

IMEDIA_Play (pMe->pimedia); /* 播放声音 */

}

/*播放特殊音效*/

void playTone(snake* pMe){

ISound *pisound;

AEESoundToneData tonedata; /* 音调数据 */

tonedata.eTone = AEE_TONE_ANSWER_TONE; /* 设置一种音调 */

tonedata.wDuration = 30; /* 音调持续时间 */

ISHELL_CreateInstance(pMe->a.m_pIShell, AEECLSID_SOUND, (void **)&pisound);

ISOUND_PlayTone(pisound,tonedata); /* 播放音调 */

ISOUND_Release(pisound); /* 释放接口 */

}

/* 游戏结束时,停止声音效果和释放接口 */

void stopSound(snake* pMe){

if (pMe->pimedia){

IMEDIA_Stop (pMe->pimedia); /* 停止播放 */

IMEDIA_Release(pMe->pimedia); /* 释放接口 */

pMe->pimedia = NULL; /* 清空,防止重复释放 */

}

}

小提示: 背景音乐可以是任意的MP3格式音乐,只要重新命名为“test.mp3”,保存到工程所在目录“C:\Program Files\BREW 3.1.5\sdk\examples\snake”下即可。

代码添加完成,编译运行后,就能听到自己喜欢的音效了。

网站上有之前的文章和相关代码下载(http://bbs.cpcw.com/viewthread.php?tid=1227720),下期我们将进行“贪吃蛇”游戏文件存储的设计