`

Android游戏音效实现

 
阅读更多

1. 游戏音效SoundPool

游戏中会根据不同的动作 , 产生各种音效 , 这些音效的特点是短暂(叫声,爆炸声可能持续不到一秒) , 重复(一个文件不断重复播放) , 并且同时播放(比如打怪时怪的叫声 , 和技能释放的声音需要同时播放) , 即时(技能用处之后声音马上随着玩家操作发出,不能有延迟).

MediaPlayer会占用大量的系统资源 , 并且不能同时播放 , 并且无法实现即时音效 , 这里引入了一个新的类 -- SoundPool , 这个类完全满足上面提出的四点要求 , 可以无延时播放游戏中的短暂音效 .


2. 相关API介绍

(1) SoundPool

构造方法 : SoundPool(int maxStreams, int streamType, int srcQuality) ;

参数解析 :

maxStream : 该参数是定义最多能同时播放的多少音效 .

streamType : 该参数定义音频类型 , 游戏中一般设置为AudioManager.STREAM_MUSIC .

srcQuality : 该参数用来设置音频质量 , 这个参数目前没有作用 , 这里设置为 0;


加载音频文件方法 :intload(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的音乐、音效架包为开发者提供了强大的音频处理能力,无论是简单的游戏音效还是复杂的音乐播放需求,都能得到很好的满足。通过合理使用SoundPool和MediaPlayer,开发者可以大大提高开发效率,同时...

    Android游戏开发之音乐与音效的处理太鼓达人游戏原理

    总之,“Android游戏开发之音乐与音效的处理太鼓达人游戏原理”涵盖了从基础音频框架到高级音效实现的诸多方面。通过学习这个主题,开发者可以掌握创建类似太鼓达人这样的音乐节奏游戏的关键技术,为玩家带来富有...

    Android游戏设计之-------游戏音效的播放 SoundPool

    本篇文章将深入探讨如何使用SoundPool类来实现游戏音效的播放,让玩家在游戏过程中感受到更加生动和真实的声音效果。 SoundPool是Android系统提供的一种高效的声音播放工具,特别适合用于短小、循环或需要快速响应...

    Android游戏音效播放的工具类

    闲余时间写的一个实现音频播放的工具类,可以帮助用户以尽量精简的代码来实现音效播放的功能,如Android中开发应用的按钮等的点击音效,android游戏中的音效等

    android连连看游戏实现

    这里提到的"android连连看游戏实现"是一个基于Android 2.3(Gingerbread)平台的项目,尽管这个版本现在相对较旧,但仍然可以作为学习基础Android开发的良好起点。 开发连连看游戏,首先要设计游戏的用户界面(UI)...

    基于Android的迷你桌球游戏设计与实现

    综上所述,基于Android的迷你桌球游戏设计与实现涵盖了Android开发的多个重要方面,对于想要学习Android游戏开发的人来说,这是一个宝贵的实践案例。通过阅读源代码和毕业设计论文,可以深入学习Android游戏开发的...

    Android-MFSocket-集成FMOD音效引擎的AndroidStudio工程

    【Android-MFSocket-集成FMOD音效引擎的AndroidStudio工程】是一个专为Android开发者设计的项目,旨在演示如何在Android应用中集成FMOD音效引擎。FMOD是一家知名的音频技术公司,其音效引擎被广泛应用于游戏和其他...

    android给来测试音效的TestEQ音效demo

    在Android平台上,音效处理是开发高质量应用的重要组成部分,尤其是对于音乐、游戏或者任何与音频交互的应用来说。"TestEQ音效demo"是一个专为测试音效设计的示例项目,它可以帮助开发者理解和实践如何在Android系统...

    Android版扫雷游戏(有音效) 源代码

    【Android版扫雷游戏(有音效)源代码】是一个基于Android平台的、包含完整音效功能的扫雷游戏项目。这款扫雷游戏是开发者利用Java编程语言和Android Studio开发环境构建的,它包含了游戏的基本逻辑、用户交互界面...

    Android如何给按钮添加点击音效

    在游戏开发中,SoundPool类经常被用于播放音效,以提高游戏的趣味性和真实感。 二、准备音频文件 在添加点击音效之前,需要准备一个音频文件。音频文件可以是wav、mp3等格式,需要将其放入项目的res/raw目录下。 ...

    Android小游戏源码

    1. **游戏循环**:Android游戏通常基于SurfaceView或者TextureView来实现游戏画面的绘制。游戏循环是维持游戏运行的关键,它包括更新游戏状态(如移动、碰撞检测)和重绘屏幕两个主要部分。 2. **图形绘制**:游戏...

    Android应用源码之游戏音乐与音效处理.zip

    这个压缩包提供的源码示例将帮助开发者了解和掌握Android游戏中的音乐播放和音效触发机制,以及相关的性能优化策略。 【描述】"源码参考,欢迎下载"提示我们,此压缩包包含可供学习和参考的源代码,旨在促进开发者...

    android美女拼图游戏的实现

    在Android平台上实现一款美女拼图游戏,涉及到的技术点和步骤相当丰富。首先,我们需要了解Android应用的基本架构,包括Activity、布局文件以及用户交互处理。在这个项目中,我们将使用Android Studio作为开发环境,...

    Android实现坦克大战游戏

    首先,Android游戏开发的基础是Java或Kotlin语言,这两种语言都是Android SDK支持的主要开发语言。游戏的主框架通常会基于Android的Activity和Service组件构建,用于管理游戏的生命周期和后台运行。同时,使用...

    android游戏小Demo

    本“android游戏小Demo”就是一个很好的起点,它提供了基础的游戏开发框架,帮助学习者理解Android游戏开发的基本概念和流程。 首先,我们来讨论Android游戏开发的基础。Android游戏通常基于Java或Kotlin语言编写,...

    android横版跑酷游戏源码Jumper.zip

    【描述】"android 游戏源码" 提示我们这个压缩包包含了实现Android游戏的具体代码。通过分析这些代码,我们可以了解到游戏开发中的关键组件,如游戏逻辑、动画处理、用户交互和性能优化等。 【标签】"源码 android...

    Android游戏编程书

    游戏音效也是提升用户体验的重要环节。书可能会讨论如何集成Android的音频API,播放背景音乐,以及处理游戏中的音效事件。此外,存储和加载游戏数据(如用户进度、得分)也是必不可少的知识,这通常涉及到SQLite...

    Android OpenGL 2.1 即时音效

    本篇将详细介绍如何在Android应用中利用OpenGL 2.1实现即时音效。 首先,理解OpenGL ES 2.1的关键概念。这个版本引入了顶点着色器和片段着色器,允许开发者对图形渲染过程进行更多的控制。顶点着色器处理几何形状的...

    基于Android Studio游戏开发 飞飞机大战小游戏源码,可暂停、继续游戏、开关背景音乐等功能。

    在Android平台上进行游戏开发是一项有趣且具有挑战性的任务,尤其当你使用的是强大的集成开发环境(IDE)——Android Studio。本文将深入探讨如何...对于想要学习Android游戏开发的人来说,这是一个很好的实践项目。

    Android游戏开发之飞行射击类游戏原理实现源码

    本资源"Android游戏开发之飞行射击类游戏原理实现源码"提供了一个深入学习和实践此类游戏开发的宝贵机会。下面我们将探讨飞行射击类游戏的关键技术和实现步骤。 首先,游戏的核心是游戏循环(Game Loop)。游戏循环...

Global site tag (gtag.js) - Google Analytics