Android游戏开发教程----游戏中的声音
Android SDK为我们提供了SoundPool 用于播放游戏音效,还提供了MediaPlayer为我们提供游戏音乐的播放。SoundPool(android.media.SoundPool),顾名思义是声音池的意思,主要用于播放一些较短的声音片段,支持从程序的资源或文件系统加载。
SoundPool技术
在游戏开发中我们经常需要播放一些游戏音效(比如:子弹爆炸,物体撞击等),这些音效的共同特点是短促、密集、延迟程度小。在这样的场景下我们可以使用SoundPool。
SoundPool特性:
1. SoundPool最大只能申请1M的内存空间,这就意味着我们只能使用一些很短的声音片段,而不是用它来播放歌曲或者游戏背景音乐。
2. SoundPool提供了pause和stop方法,但这些方法建议最好不要轻易使用。
3. 音频格式建议使用OGG格式。
SoundPool使用方法:
1. 创建一个SoundPool
public SoundPool(int maxStream, int streamType, int srcQuality)
maxStream —— 同时播放的流的最大数量
streamType —— 流的类型,一般为STREAM_MUSIC(具体在AudioManager类中列出)
srcQuality —— 采样率转化质量,当前无效果,使用0作为默认值
eg.
SoundPool soundPool = new SoundPool(3, AudioManager.STREAM_MUSIC, 0);
创建了一个最多支持3个流同时播放的,类型标记为音乐的SoundPool。
2 soundpool的加载:
int load(Context context, int resId, int priority) //从APK资源载入
int load(FileDescriptor fd, long offset, long length, int priority) //从FileDescriptor对象载入
int load(AssetFileDescriptor afd, int priority) //从Asset对象载入
int load(String path, int priority) //从完整文件路径名载入
最后一个参数为优先级。
3 播放
play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate) ,
其中leftVolume和rightVolume表示左右音量 取值范围(range = 0.0 to 1.0)
priority表示优先级
loop表示循环次数
rate表示速率,如
//速率最低0.5最高为2,1代表正常速度
sp.play(soundId, 1, 1, 0, 0, 1);
关于音频流:
在Android系统中有多种音频流,通过Activity中的函数 setVolumeControlStream(int streamType)可以设置该Activity中音量控制键控制的音频流,一般在onCreate函数中设置。
Android中有如下几种音频流(streamType是需要调整音量的类型):
AudioManager.STREAM_MUSIC /音乐回放即媒体音量/
AudioManager.STREAM_RING /铃声/
AudioManager.STREAM_ALARM /警报/
AudioManager.STREAM_NOTIFICATION /窗口顶部状态栏通知声/
AudioManager.STREAM_SYSTEM /系统/
AudioManager.STREAM_VOICECALL /通话 /
AudioManager.STREAM_DTMF /双音多频/
仔细分析了SoundPool 的API后,毫无疑问我们应该让事情简单些。
编写AndroidSoundPool类简化SoundPool的使用
[java] package com.gaofeng.game;
import java.io.IOException;
import java.util.*;
import android.app.Activity;
import android.content.res.AssetFileDescriptor;
import android.content.res.AssetManager;
import android.media.AudioManager;
import android.media.SoundPool;
public class AndroidSoundPool {
AssetManager assets;
SoundPool soundPool;
HashMap<String,Integer> soundMap=new HashMap<String,Integer>();
public AndroidSoundPool(Activity activity) {
activity.setVolumeControlStream(AudioManager.STREAM_MUSIC);
this.assets = activity.getAssets();
this.soundPool = new SoundPool(20, AudioManager.STREAM_MUSIC, 0);
}
/** 从asset中加载声音文件
* @param filename 声音文件名
* @param identifer 声音标识名,在播放声音时调用
*/
public void load(String filename,String identifer) {
try {
AssetFileDescriptor assetDescriptor = assets.openFd(filename);
int soundId = soundPool.load(assetDescriptor, 0);
soundMap.put(identifer, soundId);
} catch (IOException e) {
throw new RuntimeException("Couldn't load sound '" + filename + "'");
}
}
/**根据声音标识名播放声音
* @param identifer 声音标识名,在加载声音load方法中被设置的
* @param volume 播放音量
*/
public void play(String identifer,float volume) {
soundPool.play(soundMap.get(identifer), volume, volume, 0, 0, 1);
}
/**根据声音标识名播放声音
* @param identifer 声音标识名,在加载声音load方法中被设置的
*/
public void play(String identifer) {
soundPool.play(soundMap.get(identifer), 1, 1, 0, 0, 1);
}
/**卸载声音
* @param identifer 声音标识名,在加载声音load方法中被设置的
* @return
*/
public boolean unload(String identifer) {
return soundPool.unload(soundMap.get(identifer));
}
}
package com.gaofeng.game;
import java.io.IOException;
import java.util.*;
import android.app.Activity;
import android.content.res.AssetFileDescriptor;
import android.content.res.AssetManager;
import android.media.AudioManager;
import android.media.SoundPool;
public class AndroidSoundPool {
AssetManager assets;
SoundPool soundPool;
HashMap<String,Integer> soundMap=new HashMap<String,Integer>();
public AndroidSoundPool(Activity activity) {
activity.setVolumeControlStream(AudioManager.STREAM_MUSIC);
this.assets = activity.getAssets();
this.soundPool = new SoundPool(20, AudioManager.STREAM_MUSIC, 0);
}
/** 从asset中加载声音文件
* @param filename 声音文件名
* @param identifer 声音标识名,在播放声音时调用
*/
public void load(String filename,String identifer) {
try {
AssetFileDescriptor assetDescriptor = assets.openFd(filename);
int soundId = soundPool.load(assetDescriptor, 0);
soundMap.put(ide
补充:移动开发 , Android ,