mSoundManager.addSound(1,R.raw.dit);
mSoundManager.addSound(1,R.raw.dah);
Sen ikinci satırı değiştirmeniz gerekir. SoundPool bildiriminin 20 akışını belirttiğime dair beyanında. Oyunumda çok fazla silah ve kötü adam var ve her biri çok kısa bir ses döngüsüne sahip, < 3000ms. Aşağıda bir ses eklediğimde, "mAvailibleSounds" isimli bir vektörde belirtilen indeksi takip ettiğime dikkat edin, bu şekilde oyunum var olmayan ve çökmeden devam eden öğeler için sesleri deneyebilir ve çalabilir. Bu durumda her bir Endeks bir sprite kimliğine karşılık gelir. Sadece belirli sesleri belirli spritelarla nasıl eşleştirdiğimi anlıyorsunuz.
Sonraki playSound() ile sesleri sıraya koyarız. Her seferinde bu bir soundId bir yığınının içine düşer, bu da zaman aşımım her ne zaman olursa olsun açılır. Bu, oynatıldıktan sonra bir akışı durdurmamı ve tekrar kullanmamı sağlar. 20 akış seçiyorum çünkü oyunum çok gürültülü. Bundan sonra sesler yıkanır, böylece her uygulama bir sihirli numara gerektirecektir.
Bu kaynak here bulundu ve runnable & kill kuyruğunu kendim ekledim.
private SoundPool mSoundPool;
private HashMap<Integer, Integer> mSoundPoolMap;
private AudioManager mAudioManager;
private Context mContext;
private Vector<Integer> mAvailibleSounds = new Vector<Integer>();
private Vector<Integer> mKillSoundQueue = new Vector<Integer>();
private Handler mHandler = new Handler();
public SoundManager(){}
public void initSounds(Context theContext) {
mContext = theContext;
mSoundPool = new SoundPool(20, AudioManager.STREAM_MUSIC, 0);
mSoundPoolMap = new HashMap<Integer, Integer>();
mAudioManager = (AudioManager)mContext.getSystemService(Context.AUDIO_SERVICE);
}
public void addSound(int Index, int SoundID)
{
mAvailibleSounds.add(Index);
mSoundPoolMap.put(Index, mSoundPool.load(mContext, SoundID, 1));
}
public void playSound(int index) {
// dont have a sound for this obj, return.
if(mAvailibleSounds.contains(index)){
int streamVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
int soundId = mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume, 1, 0, 1f);
mKillSoundQueue.add(soundId);
// schedule the current sound to stop after set milliseconds
mHandler.postDelayed(new Runnable() {
public void run() {
if(!mKillSoundQueue.isEmpty()){
mSoundPool.stop(mKillSoundQueue.firstElement());
}
}
}, 3000);
}
}
Kilitlenmesine neden olan istisna nedir? Yığın izleme? –