2013-10-09 105 views
9

我正在開發Android中的簡單遊戲。我想爲每個觸摸事件添加聲音效果。不過,我添加了貫穿整個遊戲的背景音效。但是 如何爲觸摸遊戲中的任何角色添加微小的音效。爲了更好的理解 以下是我的課堂設計: 我有一個主要活動,從視圖我打電話給我的GameView類,擴展 surfaceView。對於bacground聲音我剛剛創建的mainActivity的聲音,然後叫 是GameView類波紋管:Android中的遊戲音效

public class MainActivity extends Activity { 
    MediaPlayer backgroundMusic; 



    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     backgroundMusic = MediaPlayer.create(MainActivity.this, R.raw.bg); 


     backgroundMusic.setLooping(true); 
     backgroundMusic.setVolume(10.0f, 3.0f); 
     backgroundMusic.start(); 

     setContentView(new GameView(this)); 
    } 
} 

而以下是我的GameView類。我想在這裏在這個類的onTouchEvent添加音效波紋管:

public class GameView extends SurfaceView { 
@Override 
public boolean onTouchEvent(MotionEvent event) { 
    //checking condition I want to give different sound here. 

    } 
} 

我試圖做它作爲mainActivity(正在使用MediaPlayer.creat()),但它顯示錯誤。 任何人都知道如何在我的課堂設計的基礎上添加這樣的音效?

+1

_ 「它顯示錯誤」 _。什麼是錯誤..? – Michael

+0

顯示的錯誤不是運行時。只是我的編譯器說如下: 「的方法創建的類型(上下文,INT)MediaPlayer的不適用的參數(GameView,INT)」 這可能是因爲GameView不是一個Activity類。然而,我不爲什麼... @邁克爾 – exponentialFun

回答

47

對於像爆炸,硬幣收藏等短暫的音效,最好使用SoundPool

你只需要建立一個完善的游泳池:

SoundPool sp = new SoundPool(10, AudioManager.STREAM_MUSIC, 0); 

在棒棒糖及更高版本:

AudioAttributes attrs = new AudioAttributes.Builder() 
     .setUsage(AudioAttributes.USAGE_GAME) 
     .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) 
     .build(); 
SoundPool sp = new SoundPool.Builder() 
     .setMaxStreams(10) 
     .setAudioAttributes(attrs) 
     .build(); 

這對於創造最大聲池。的10個聲音流(即,可以同時播放多少個同時的聲音效果)並使用AudioManager.STREAM_MUSIC作爲聲音流。

一定要還設置了音量控制在Activity,因此用戶能夠改變適當的流體積:

setVolumeControlStream(AudioManager.STREAM_MUSIC); 

比,你需要的聲音效果加載到池中,並給他們它們的標識符:

int soundIds[] = new int[10]; 
soundIds[0] = sp.load(context, R.raw.your_sound, 1); 
//rest of sounds goes here 

您需要通過上下文來加載方法,所以無論你做這個的活動裏面,或者得到的是從別的somwhere。

並播放聲音最後一步是調用play方法:

sp.play(soundIds[0], 1, 1, 1, 0, 1.0); 

參數是:

  • soundID由負載()函數返回一個soundID

  • leftVolume左側音量值(範圍= 0.0至1.0)

  • rightVolume right volume value(range = 0.0 to 1。0)

  • 優先數據流優先級(0 =最低優先級)

  • 循環模式(0 =無環,-1 =循環永遠)

  • 播放速率(1.0 =正常播放,範圍0.5到2.0)

你需要記住,那SoundPool不應該使用超過1MB的媒體文件,文件越小,效果和性能就越好。

一定要在完成時釋放SoundPool,或者在Activity.onDestroy中釋放。

sp.release(); 

希望這有助於

+0

這是一個很好的解釋!做得好。您是否可以/由於SoundPool已折舊,請編輯/評論它? – Sonia

2

GameView不是Context的子類。將活動或ApplicationContext傳遞給媒體播放器

+0

我嘗試使用MediaPlayer.create(MainActivity.this,R.raw.bg); 但它顯示相同的錯誤。任何示例代碼???????? – exponentialFun

+0

謝謝先生......這是完美的工作方式 – exponentialFun