zoukankan      html  css  js  c++  java
  • Android 游戏开发即时音效

    即时音效,顾名思义,是一个又短又快的音效,适合于播放时间较短反应迅速的音频文件,例如输入法打字时的“哒哒”声就是这个东西,下象棋时的下棋声也是...

    该技术继承自android.media.SoundPool

    SoundPool类用于和播放应用程序的声音资源,该类将声音文件加载到内存中,处于性能的考虑,一般只将时间小于7秒左右的声音文件用该技术播放。

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

    • maxStreams:该参数用于设置同时能够播放多少音效,如设置为3,则最多同时可以播放3个音效
    • streamType:音频类型,在游戏中通常设置为STREAM_MUSIC
    • srcQuality:音频文件的质量,默认设置为0

    加载音频文件public int load(Context context, int resId, int priority)

    • context:应用程序上下文,即调用它的Activity
    • resId:资源id
    • priority:优先级,可以设置为1

    播放音效public final int play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate)

    • soundID:播放的音乐ID
    • leftVolume:用来控制左声道音量
    • rightVolume:用来控制右声道音量
    • priority:优先级,0最低
    • loop:循环次数,0为不循环,-1为永远循环
    • rate:回放速度,该值在0.5-2.0之间,1为正常速度

    暂定播放public final void pause(int streamID)

    • streamID音效ID

    下面是应用这个即时音效的一个例子

    package com.loulijun.quicksound;
    
    import java.util.HashMap;
    
    import android.app.Activity;
    import android.media.AudioManager;
    import android.media.SoundPool;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    
    public class QuickSoundActivity extends Activity {
        //创建一个声音池
    	private SoundPool sp;
    	HashMap<Integer, Integer> map;
    	private Button startOne = null;
    	private Button stopOne = null;
    	private Button startTwo = null;
    	private Button stopTwo = null;
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            //初始化声音池
            initSoundPool();
            startOne = (Button)findViewById(R.id.startone);
            stopOne = (Button)findViewById(R.id.stopone);
            startTwo = (Button)findViewById(R.id.starttwo);
            stopTwo = (Button)findViewById(R.id.stoptwo);
            
            startOne.setOnClickListener(new Button.OnClickListener()
            {
    
    			@Override
    			public void onClick(View v) {
    				playSound(1,1);//播放第一首音效,循环一遍
    			}
            	
            });
            stopOne.setOnClickListener(new Button.OnClickListener()
            {
    
    			@Override
    			public void onClick(View v) {
    				//暂停第一首音效
    				sp.pause(map.get(1));
    			}
            	
            });
            startTwo.setOnClickListener(new Button.OnClickListener()
            {
    
    			@Override
    			public void onClick(View v) {
    				//播放第二首音效,循环两次
    				playSound(2,2);
    			}
            	
            });
            stopTwo.setOnClickListener(new Button.OnClickListener()
            {
    
    			@Override
    			public void onClick(View v) {
    				//暂定第二首音效
    				sp.pause(map.get(2));
    			}
            	
            });
        }
        //声音池初始化方法
        private void initSoundPool()
        {
        	sp = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
        	map = new HashMap<Integer, Integer>();
        	map.put(1, sp.load(this, R.raw.one, 1));
        	map.put(2, sp.load(this, R.raw.two, 1));
        }
        //播放声音方法
        public void playSound(int sound, int number)
        {
        	AudioManager am = (AudioManager)this.getSystemService(this.AUDIO_SERVICE);
        	//返回当前AlarmManager最大音量
        	float audioMaxVolume = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
        	//返回当前AudioManager对象的音量值
        	float audioCurrentVolume = am.getStreamVolume(AudioManager.STREAM_MUSIC);
        	float volumnRatio = audioCurrentVolume/audioMaxVolume;
        	sp.play(
        			map.get(sound), //播放的音乐Id 
        			volumnRatio, //左声道音量
        			volumnRatio, //右声道音量
        			1, //优先级,0为最低
        			number, //循环次数,0无不循环,-1无永远循环
        			1);//回放速度,值在0.5-2.0之间,1为正常速度
        }
    }
    

      

  • 相关阅读:
    VS2008下编的程序生成的EXE 在没有安装VS2008的计算机上能运行
    GDI+使用小记
    双缓冲技术绘图
    INI文件格式及其读写
    缩放图片并保存
    按值传递&&按引用传递&&按地址传递
    傻瓜式制作的U盘winpe(支持4G以上U盘)速度超快
    vi 命令大全
    fopen和open的区别
    Linux下Socket网络编程,文件传输,数据传输的C语言例子
  • 原文地址:https://www.cnblogs.com/loulijun/p/2407076.html
Copyright © 2011-2022 走看看