当前位置:操作系统 > 安卓/Android >>

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 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,