2013-10-09 19 views
9

Sto sviluppando un semplice gioco in Android. Voglio aggiungere effetti sonori per ciascuno degli eventi di tocco . Tuttavia, aggiungo effetti sonori di sottofondo che vengono eseguiti durante il gioco. Ma come si può aggiungere un piccolo effetto sonoro per toccare qualsiasi personaggio del gioco. Per una migliore comprensione segue è il mio design di classe: Ho un'attività principale da dove vista Sto chiamando la mia classe GameView che estende surfaceView. Per il suono bacground ho appena creato il suono a mainActivity e poi chiamato quella classe GameView come muggito:Gioco Effetti sonori in 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)); 
    } 
} 

E che segue è la mia classe GameView. Voglio aggiungere effetti sonori qui, in questa classe onTouchEvent come muggito:

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

    } 
} 

ho cercato di farlo come mainActivity (che utilizza MediaPlayer.creat()), ma mostra l'errore. Qualcuno sa come aggiungere tali effetti sonori sulla base del mio design di classe?

+1

_ "mostra errore" _. E qual è l'errore ..? – Michael

+0

L'errore mostrato non è di runtime. Solo il mio compilatore dice come segue: "Il metodo create (Context, int) nel tipo MediaPlayer non è applicabile per gli argomenti (GameView, int)" Potrebbe essere perché GameView non è una classe di attività. Comunque non so perché ... @Michael – exponentialFun

risposta

47

Per effetti sonori brevi come esplosioni, raccolte di monete ecc., È meglio utilizzare SoundPool.

Hai solo bisogno di creare un pool di suono:

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

In Lollipop e versioni successive:

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(); 

Questo crea piscina suono per max. di 10 flussi audio (ovvero quanti effetti sonori simultanei possono essere riprodotti contemporaneamente) e utilizza AudioManager.STREAM_MUSIC come stream audio.

Assicurarsi di impostare anche il controllo del volume nel vostro Activity, in modo che l'utente è in grado di modificare il volume del corretto flusso:

setVolumeControlStream(AudioManager.STREAM_MUSIC); 

Than, è necessario caricare gli effetti sonori in piscina e dare loro i loro identificatori:

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

è necessario passare un contesto per caricare il metodo, quindi o si esegue questa operazione all'interno della vostra attività, o ottenere è da stare altrove.

E passo finale per riprodurre il suono è chiamare play metodo:

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

parametri sono:

  • Soundid un Soundid restituita dalla funzione load()

  • leftVolume valore del volume sinistro (intervallo = da 0,0 a 1,0)

  • rightVolume valore del volume destro (intervallo = da 0,0 a 1.0)

  • priorità flusso prioritario (0 = priorità più bassa)

  • ciclo modalità loop (0 = nessuna loop, -1 = loop infinito)

  • rate rate riproduzione (1.0 = riproduzione normale, intervallo da 0,5 a 2,0)

È necessario ricordare che SoundPool non dovrebbe utilizzare file multimediali superiori a 1 MB, più piccoli sono i file, l'effetto migliore e le prestazioni che si hanno.

Al termine, rilasciare SoundPool oppure in Activity.onDestroy.

sp.release(); 

Spero che questo aiuti

+0

Questa è una grande spiegazione! Molto bene. Potresti/qualcuno modificare/commentare come il SoundPool è ammortizzato? – Sonia

2

GameView non è una sottoclasse di Context. Passare l'attività o ApplicationContext al Mediaplayer

+0

Ho provato a usare MediaPlayer.create (MainActivity.this, R.raw.bg); Ma mostra lo stesso errore. Qualsiasi codice di esempio ???????? – exponentialFun

+0

Grazie signore ... Sta funzionando in questo modo perfetto – exponentialFun

Problemi correlati