【Android 应用开发】Android游戏音效实现
2013-09-13 18:46
399 查看
1. 游戏音效SoundPool
游戏中会根据不同的动作 , 产生各种音效 , 这些音效的特点是短暂(叫声,爆炸声可能持续不到一秒) , 重复(一个文件不断重复播放) , 并且同时播放(比如打怪时怪的叫声 , 和技能释放的声音需要同时播放) , 即时(技能用处之后声音马上随着玩家操作发出,不能有延迟).MediaPlayer会占用大量的系统资源 , 并且不能同时播放 , 并且无法实现即时音效 , 这里引入了一个新的类 -- SoundPool , 这个类完全满足上面提出的四点要求 , 可以无延时播放游戏中的短暂音效 .
2. 相关API介绍
(1) SoundPool
构造方法 : SoundPool(int maxStreams, int streamType, int srcQuality) ;参数解析 :
maxStream : 该参数是定义最多能同时播放的多少音效 .
streamType : 该参数定义音频类型 , 游戏中一般设置为AudioManager.STREAM_MUSIC .
srcQuality : 该参数用来设置音频质量 , 这个参数目前没有作用 , 这里设置为 0;
加载音频文件方法 : int load(Context context, int resId, int priority);
参数解析 :
context : 上下文对象;
resId : 要加载的资源文件 , 即R.raw.music...
priority : 优先级别 , 这里没有作用 , 设置为1.
播放音效方法 : int play(int soundId, float leftVolume, float rightVolume, int priority, int loop, float rate);
参数解析 :
soundId : 这个id不是资源id , 指的是利用load方法加载资源文件返回的id值 , 这个要区别清楚.
leftVolume : 左声道的音量 , 这个音量是一个 0 ~ 1的数 , 这个小数是当前音量/最大音量的结果;
rightVolume : 右声道的音量 , 这个音量与左声道的音量是同一种音量;
priority : 优先级参数 , 0为最低, 这里设置为1;
loop : 音效循环的次数 , 0为不循环 , -1为永远循环;
rate : 音效回放的速度 , 这个值是在0.5~2.0f之间 , 1f是正常速度;
暂停音效播放方法 : pause(int streamId);
参数streamId : 这个参数是play()方法执行完之后的返回值 , 这个返回值是正在播放的音效的一个标识 , 对正在播放的音效进行操作的时候 , 就需要这个标识来对其进行操作;
通知音效播放方法 : stop(int streamId) , 这个参数与上面的pause()方法中的streamId参数是一个效果.
(2)AudioManager
获取方法 : AudioManager对象时系统服务, 可以通过调用上下文对象的getSystemService(Context.AUDIO_SERVICE)获取 , 注意获取到之后 , 需要将对象墙砖为AudioManager对象才可以使用.eg : AudioManager audioManager = (AudioManager)getApplicationContext().getSystemService(Context.AUDIO_SERVICE);
利用AudioManager获取当前音量的方法 : float currVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
利用AudioManager获取当前系统最大音量方法 : float maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
使用这两个音量就可以计算出运行SoundPool音效的音量 , 当前音量 / 系统最大音量 , 结果就是soundPool.play()方法中需要传入的音量 ;
3. 程序代码
public class MainActivity extends Activity implements OnClickListener {private SoundPool soundPool;
private HashMap<Integer, Integer> hashMap;
private int currStreamId;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initSoundPool();
}
private void initSoundPool() {
soundPool = new SoundPool(3, AudioManager.STREAM_MUSIC, 0);
hashMap = new HashMap<Integer, Integer>();
hashMap.put(1, soundPool.load(getApplicationContext(), R.raw.musictest, 1));
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_play:
play(1, 0);
Toast.makeText(getApplicationContext(), "播放即时音效", Toast.LENGTH_LONG).show();
break;
case R.id.bt_stop:
soundPool.stop(currStreamId);
Toast.makeText(getApplicationContext(), "暂停播放", Toast.LENGTH_LONG).show();
break;
default:
break;
}
}
private void play(int sound, int loop) {
AudioManager audioManager = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE);
float currVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
float maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
float volume = currVolume / maxVolume;
currStreamId = soundPool.play(hashMap.get(sound), volume, volume, 1, loop, 1.0f);
System.out.println(currStreamId);
}
}
4. 程序的注意点
音效文件需要放在res的raw下.SoundPool播放的音效要小于7秒 , 否则会出现加载失败的现象;
在Android平台上使用的即时文件越小越好 , 必要的时候可以降低采样频率或者将立体声改为单声道;
相关文章推荐
- 【Android 应用开发】Android游戏音效实现
- Android游戏开发中使用SoundPool来实现音效的播放
- 【Android游戏开发二十二】(图文详解)游戏中灵活实现动画播放!简述J2me的游戏类库与Android游戏开发!
- Android应用开发--MP3音乐播放器代码实现(一)
- 快速开发android应用2-使用TextInputLayout实现用户登录及验证
- android应用开发-从设计到实现 2-4 文字的使用
- 【Android游戏开发之五】游戏注册界面Demo-实现两个Activity之间的切换与数据交互!
- 【Android游戏开发二十二】(图文详解)游戏中灵活实现动画播放!简述J2me的游戏类库与Android游戏开发!
- Android 3D游戏开发(高级篇)——Opengl ES游戏引擎实现(更新完毕)
- Android应用开发中半透明效果实现方案
- Android实现疯狂连连看游戏之开发游戏界面(二)
- 【Android应用开发详解】第01期:第三方授权认证(一)实现第三方授权登录、分享以及获取用户资料
- Android游戏开发教程之八:SurfaceView类的应用实例
- 【Android游戏开发十六】Android Gesture之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能!
- android应用开发-从设计到实现 3-5 静态原型的Appbar
- Android游戏开发之音效SoundPool的使用
- android应用开发-从设计到实现 4-2 开发环境搭建
- android游戏开发框架libgdx的使用(十八)—简单的AVG游戏效果实现
- Android游戏开发之触摸轨迹曲线的实现处理(二十四)
- android应用开发全程实录-实现甩动拨打和挂断电话