从零开始Android游戏编程(第二版) 第十二章 音乐与音效

原创 2011年01月14日 17:02:00

第十二章 音乐与音效

广告说的好“没有声音再好的戏也出不来”,下面就让我们为程序加入声音效果。

一般情况下,游戏中的声音分为音乐和音效两个部分。直观上的区别,音乐播放的时间较长,资源文件较大。音效播放时间较短,资源文件比较小。在Android中,我们使用两种不同的方法播放音乐和音效。

播放音乐需要用到MediaPlayer类,MediaPlayer本身比较复杂,这里我们只做一个简单的介绍,满足播放音乐的基本要求即可,读者可以参考帮助文档中的内容深入研究。

为了调用方便,我们创建一个Util类,将播放背景音乐的方法封装到Util中

public class Util {

static MediaPlayer mp;

static void playBGM(String path, boolean looping) {

if(mp == null) {

mp = new MediaPlayer();

}

mp.reset();

try {

mp.setDataSource(path);

mp.prepare();

} catch (IllegalArgumentException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IllegalStateException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

mp.setLooping(looping);

mp.start();

}

}

让我们分析一下这段代码:首先,我们需要一个MediaPlayer实例,然后重置MediaPlayer到Idle状态。注意,这个操作是必需的,如果当前正在播放,不重置状态直接调用setDataSource会抛出异常。然后指定我们要播放的文件,并调用prepare方法进行准备。如果你想指定开始时间(seekTo)必须在prepare之后进行。还可以设定是否循环,最后就是调用start播放了。

封装好后,我们可以方便的使用这个函数,我们在SceneStartMenu中重载start方法

public void start(SurfaceHolder surfaceHolder){

Util.playBGM("/sdcard/sample.mid", false);

}

这样,程序运行后就开始播放音乐了。还要注意的是,我们应该在适当的时候释放MediaPlayer占用的资源。

运行一下编辑好的代码看看效果吧。sample.mid在res/raw目录下。

下面让我来学习如何播放音效,它将使用完全不同的方法SoundPool。SoundPool虽然是基于MediaPlayer的,但是他被优化用来同时播放多个文件,而且不适合播放较大的文件,可以说,他就是为播放音效定制的。下面就让我们看一下播放音效的代码:

private static int MAX_CHANNEL = 6;

private static SoundPool soundPool;

private static HashMap soundPoolMap;

private static AudioManager audioManager;

首先设定声道数,如果同时播放的音频超过这个数量,最先播放的音频就会被关闭。然后定义SoundPool变量。大家注意soundPoolMap这个变量,下面会重点讲解。

public static void playSE(String path, float volume, int loop, float rate) {

if(soundPool == null) {

soundPool = new SoundPool(MAX_CHANNEL, AudioManager.STREAM_MUSIC, 10);

}

if(soundPoolMap == null) {

soundPoolMap = new HashMap();

}

if(!soundPoolMap.containsKey(path)) {

soundPoolMap.put(path, soundPool.load(path, 1));

}

这里我们要讲解一下soundPoolMap。在音频被播放前需要先将它载入到内存,载入后,会得到一个streamID,SoundPool中的很多函数都使用这个ID来控制特定的音频流。所以,我们将这个ID保存到map中,并与音频文件的路径相对应。后面就可以通过路径来找到这段音频流了。

if(volume < 0) {

if(audioManager == null)

audioManager = (AudioManager)Main.getInstance()

.getSystemService(Context.AUDIO_SERVICE);

volume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);

}

while(soundPool.play(soundPoolMap.get(path),

volume, volume, 0, loop, rate) == 0);

}

这个方法并不是很科学,最好还是在初始化的时候载入音频,大家可以另行撰写一个load方法。

public void playSE(String path) {

playSE(path, -1f, 0, 1f);

}

public void stopSE(String path) {

if(soundPool != null && soundPoolMap != null

&& soundPoolMap.containsKey(path)) {

soundPool.stop(soundPoolMap.get(path));

}

}

修改SceneStartMenu中的start函数测试一下吧

public void start(SurfaceHolder surfaceHolder){

// Util.playBGM("/sdcard/sample.mid", false);

Util.playSE("/sdcard/system11.ogg");

Util.playSE("/sdcard/system12.ogg");

}

现在,这部教程终于可以告一段落了,虽然有点虎头蛇尾,但我大概已经讲解了制作一个简单游戏所用到的各方面的知识。如果还有不足,请读者留言补充,大家互相学习,一起提高。最终我在教程中没有完成坦克大战,不过我会基于坦克大战设计一个新的游戏,不再使用Java,而是一个全新的跨平台框架,到时候再与大家分享我的心得。

本章示例程序http://u.115.com/file/f1435ee7e8

【读书笔记《Android游戏编程之从零开始》】19.游戏开发基础(游戏音乐与音效)

在一款游戏中,除了华丽的界面 UI 直接吸引玩家外,另外重要的就是游戏的背景音乐与音效;合适的背景音乐以及精彩的音效搭配会令整个游戏上升一个档次。 在 Android 中。常用于播放游戏背景音乐的类...
  • dddxxxx
  • dddxxxx
  • 2016年09月09日 11:06
  • 655

python核心编程-第12章课后练习答案

第一题: 路径搜索和搜索路径。路径搜索和搜索路径之间有什么不同? 解答:前者是指查找某个文件的操作,后者是去查找一组目录。 第二题: 导入属性。假设你的模块mymodule里有一个foo()函...
  • qq_34171520
  • qq_34171520
  • 2016年10月31日 12:04
  • 676

《Python核心编程》第12章 习题

第一题: 路径搜索和搜索路径。路径搜索和搜索路径之间有什么不同? 解答:前者是指查找某个文件的操作,后者是去查找一组目录。 第二题: 导入属性。假设你的模块mymodule里有...
  • qq_20113327
  • qq_20113327
  • 2017年03月10日 18:28
  • 235

Android编程权威指南(第二版)学习笔记(十二)—— 第12章 对话框

本章主要介绍了如何使用内嵌在 fragment 中的对话框,以及 fragment 之间如何传递数据...
  • kniost
  • kniost
  • 2016年11月23日 16:04
  • 652

【读书笔记《Android游戏编程之从零开始》】9.游戏开发基础(如何快速的进入 Android 游戏开发)

1.不可盲目看API文档 很多人在接触学习一门新的平台语言时,总喜欢先去探究一番API文档。先不说成效如何,至少编者认为这种方式不适合大部分人来效仿,主要原因在于 API 领域广泛,牵涉到的知识点太...
  • dddxxxx
  • dddxxxx
  • 2016年09月09日 10:53
  • 632

Cocos2d-JS 中游戏背景音乐与音效

游戏中音频的处理也是非常重要的,它分为背景音乐播放与音效播放。 背景音乐是长时间循环播放的,它会长时间占用较大的内存,背景音乐不能多个同时播放。 而音效是短的声音,它占用内存较小,音效能多个同时播...
  • AiCoding_D
  • AiCoding_D
  • 2016年04月20日 11:08
  • 6127

cocos2dx-音乐音效

声  明        本教程仅用于初学cocos2dx同学使用,内容由本人(孤狼)学习过程中笔记编写,本教程使用cocos2dx版本为2.1.4。本教程内容可以自由转载,但必须同时...
  • jianpengxuexikaifa
  • jianpengxuexikaifa
  • 2014年07月03日 12:24
  • 7653

Python:pygame游戏编程之旅六(游戏中的声音处理)

一款人性化的游戏中缺少不了声音,比如角色挂时惨叫一声,或PK时武器交锋的声音,还有就是英雄出场时的背景音乐,无不涉及到声音,本节我们就来看一下pygame中如何控制声音,下面是一个例子,但博客上传不了...
  • novelly
  • novelly
  • 2013年08月03日 23:41
  • 1059

采用easyX插件进行C语言编写的贪吃蛇,自带播放音乐

/********************************************************************************** *本程序采用VC++6.0编程,...
  • qq_35146123
  • qq_35146123
  • 2017年03月21日 20:41
  • 515

拒绝从入门到放弃_《Python 核心编程 (第二版)》必读目录

目录目录 关于这本书 必看知识点 最后关于这本书《Python 核心编程 (第二版)》是一本 Python 编程的入门书,分为 Python 核心(其实并不核心,应该叫基础) 和 高级主题 两大部分,...
  • Jmilk
  • Jmilk
  • 2016年10月07日 15:20
  • 1642
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:从零开始Android游戏编程(第二版) 第十二章 音乐与音效
举报原因:
原因补充:

(最多只允许输入30个字)