DIY自己的“贪吃蛇”(3)——用BREW设计游戏音效
数字办公
上期我们一起用BREW设计手机游戏“贪吃蛇”的游戏主画面,但是好游戏如果没有音乐来衬托,就像炒菜没放盐一样,所以这期我们就来讲讲如何DIY自己心爱的音效。
“贪吃蛇”音效的设计思路
当游戏开始时,播放背景音乐,如果贪吃蛇吃到食物就播放一声特殊音效,在游戏结束时,停止播放背景音乐(见图)。

“贪吃蛇”音效的接口选择
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),下期我们将进行“贪吃蛇”游戏文件存储的设计