日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

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

發(fā)布時(shí)間:2025/6/17 Android 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Android 应用开发】Android游戏音效实现 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1. 游戲音效SoundPool

游戲中會根據(jù)不同的動作 , 產(chǎn)生各種音效 , 這些音效的特點(diǎn)是短暫(叫聲,爆炸聲可能持續(xù)不到一秒) , 重復(fù)(一個(gè)文件不斷重復(fù)播放) , 并且同時(shí)播放(比如打怪時(shí)怪的叫聲 , 和技能釋放的聲音需要同時(shí)播放) , 即時(shí)(技能用處之后聲音馬上隨著玩家操作發(fā)出,不能有延遲).

MediaPlayer會占用大量的系統(tǒng)資源 , 并且不能同時(shí)播放 , 并且無法實(shí)現(xiàn)即時(shí)音效 , 這里引入了一個(gè)新的類 -- SoundPool , 這個(gè)類完全滿足上面提出的四點(diǎn)要求 , 可以無延時(shí)播放游戲中的短暫音效 .


2. 相關(guān)API介紹

(1) SoundPool

構(gòu)造方法 : SoundPool(int maxStreams, int streamType, int srcQuality) ;

參數(shù)解析 :?

maxStream : 該參數(shù)是定義最多能同時(shí)播放的多少音效 .

streamType : 該參數(shù)定義音頻類型 , 游戲中一般設(shè)置為AudioManager.STREAM_MUSIC .

srcQuality : 該參數(shù)用來設(shè)置音頻質(zhì)量 , 這個(gè)參數(shù)目前沒有作用 , 這里設(shè)置為 0;


加載音頻文件方法 :?int?load(Context context, int resId, int priority);

參數(shù)解析 :

context : 上下文對象;

resId : 要加載的資源文件 , 即R.raw.music...

priority : 優(yōu)先級別 , 這里沒有作用 , 設(shè)置為1.


播放音效方法 : int play(int soundId, float leftVolume, float rightVolume, int priority, int loop, float rate);

參數(shù)解析 :

soundId : 這個(gè)id不是資源id , 指的是利用load方法加載資源文件返回的id值 , 這個(gè)要區(qū)別清楚.

leftVolume : 左聲道的音量 , 這個(gè)音量是一個(gè) 0 ~ 1的數(shù) , 這個(gè)小數(shù)是當(dāng)前音量/最大音量的結(jié)果;

rightVolume : 右聲道的音量 , 這個(gè)音量與左聲道的音量是同一種音量;

priority : 優(yōu)先級參數(shù) , 0為最低, 這里設(shè)置為1;

loop : 音效循環(huán)的次數(shù) , 0為不循環(huán) , -1為永遠(yuǎn)循環(huán);

rate : 音效回放的速度 , 這個(gè)值是在0.5~2.0f之間 , 1f是正常速度;


暫停音效播放方法 :?pause(int streamId);

參數(shù)streamId :?這個(gè)參數(shù)是play()方法執(zhí)行完之后的返回值 , 這個(gè)返回值是正在播放的音效的一個(gè)標(biāo)識 , 對正在播放的音效進(jìn)行操作的時(shí)候 , 就需要這個(gè)標(biāo)識來對其進(jìn)行操作;

通知音效播放方法 : stop(int streamId) , 這個(gè)參數(shù)與上面的pause()方法中的streamId參數(shù)是一個(gè)效果.


(2)AudioManager

獲取方法 : AudioManager對象時(shí)系統(tǒng)服務(wù), 可以通過調(diào)用上下文對象的getSystemService(Context.AUDIO_SERVICE)獲取 , 注意獲取到之后 , 需要將對象墻磚為AudioManager對象才可以使用.

eg : AudioManager audioManager = (AudioManager)getApplicationContext().getSystemService(Context.AUDIO_SERVICE);


利用AudioManager獲取當(dāng)前音量的方法 : float currVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);

利用AudioManager獲取當(dāng)前系統(tǒng)最大音量方法 : float maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);


使用這兩個(gè)音量就可以計(jì)算出運(yùn)行SoundPool音效的音量 , 當(dāng)前音量 / 系統(tǒng)最大音量 , 結(jié)果就是soundPool.play()方法中需要傳入的音量 ;?


3. 程序代碼

public class MainActivity extends Activity implements OnClickListener {private SoundPool soundPool;private HashMap<Integer, Integer> hashMap;private int currStreamId;@Overridepublic 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));}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.bt_play:play(1, 0);Toast.makeText(getApplicationContext(), "播放即時(shí)音效", 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. 程序的注意點(diǎn)

  • 音效文件需要放在res的raw下.
  • SoundPool播放的音效要小于7秒 , 否則會出現(xiàn)加載失敗的現(xiàn)象;
  • 在Android平臺上使用的即時(shí)文件越小越好 , 必要的時(shí)候可以降低采樣頻率或者將立體聲改為單聲道;

總結(jié)

以上是生活随笔為你收集整理的【Android 应用开发】Android游戏音效实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。