【Android 应用开发】Android游戏音效实现

简介: 【Android 应用开发】Android游戏音效实现

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平台上使用的即时文件越小越好 , 必要的时候可以降低采样频率或者将立体声改为单声道;
目录
相关文章
|
7月前
|
数据库连接 Android开发
安卓android期末项目之纸牌游戏之三
安卓android期末项目之纸牌游戏之三
66 0
|
7月前
|
存储 Android开发 数据库管理
Android安卓项目猜纸牌游戏之二 实体类
Android安卓项目猜纸牌游戏之二 实体类
30 0
|
4月前
|
算法 Java 定位技术
分享104个益智休闲安卓游戏源码,总有一款适合你
分享104个益智休闲安卓游戏源码,总有一款适合你
194 1
|
1天前
|
存储 消息中间件 缓存
Android应用开发:实现自定义View的高效绘制
【5月更文挑战第12天】 在Android开发中,创建高性能的自定义视图是一项挑战,它要求开发者深入理解Android的绘图机制以及UI渲染过程。本文将探讨如何优化自定义View的绘制流程,减少不必要的重绘和布局计算,以提升应用的响应速度和流畅度。我们将介绍几种关键策略,包括利用硬件加速、缓存绘制内容和使用高效的数据结构来存储视图状态。通过实例分析和性能对比,读者将学会如何在自己的应用中运用这些技巧,从而打造出更加流畅和响应迅速的用户界面。
|
6天前
|
移动开发 Java Android开发
Android应用开发:Kotlin语言的优势与实践
【5月更文挑战第7天】 在移动开发的世界中,Android平台的Kotlin语言以其高效、简洁的语法和强大的功能吸引了众多开发者。本文将深入探讨Kotlin语言的核心优势,并通过实际案例展示如何在Android应用开发中有效地运用这一现代编程语言。我们将从语言特性出发,逐步分析其在提升开发效率、改善代码质量以及增强应用性能方面的具体表现,为读者提供一个全面而细致的Kotlin应用开发指南。
|
8天前
|
存储 前端开发 Java
Android应用开发中的MVP架构模式实践
【5月更文挑战第5天】随着移动应用开发的复杂性增加,传统的MVC(Model-View-Controller)架构在应对大型项目时显得笨重且不灵活。本文将探讨一种更适应现代Android应用开发的架构模式——MVP(Model-View-Presenter),并展示如何在Android项目中实现该模式以提升代码的可维护性和可测试性。通过对比分析MVP与传统MVC的差异,以及提供一个实际案例,读者将能深入了解MVP的优势和实施步骤。
|
5月前
|
XML 编解码 算法
Android开发音效中录制WAV音频和录制MP3音频的讲解及实战(超详细 附源码)
Android开发音效中录制WAV音频和录制MP3音频的讲解及实战(超详细 附源码)
89 0
|
1月前
|
安全 API Android开发
Android应用开发中实现动态权限请求的实践指南
【4月更文挑战第5天】 在现代安卓应用开发中,用户隐私和安全日益受到重视。自Android 6.0(API级别23)起,系统引入了动态权限模型,要求应用在运行时而非安装时请求特定权限。这一变化迫使开发者调整权限请求策略,以增强用户信任并确保应用的正常运行。本文将深入探讨如何在Android应用中有效实施动态权限请求,提供一套详细的实践流程,并通过代码示例阐释关键步骤。我们将讨论如何判断权限的必要性、向用户发起请求的最佳时机以及如何处理用户的授权结果。
|
4月前
|
编解码 移动开发 人工智能
android游戏源码
android游戏源码
92 0
|
5月前
|
XML Java 调度
Android开发音效增强中铃声播放Ringtone及声音池调度SoundPool的讲解及实战(超详细 附源码)
Android开发音效增强中铃声播放Ringtone及声音池调度SoundPool的讲解及实战(超详细 附源码)
68 0