2013-10-09 3 views
9

Rozwijam prostą grę na Androida. Chcę dodać efekty dźwiękowe dla każdego zdarzenia dotyku . Jednak dodałem efekt dźwiękowy w tle, który działa przez całą grę. Ale jak dodać malutki efekt dźwiękowy do dotknięcia dowolnej postaci gry. Dla lepszego zrozumienia: Poniżej znajduje się mój projekt klasy: Mam główną działalność, z której jako widok nazywam moją klasę GameView, która rozszerza surfaceView. Na dźwięk bacground Właśnie stworzył dźwięk w główną działalność i wtedy nazywa że klasa GameView jak poniżej:Efekty dźwiękowe gry w Androidzie

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

I po jest moją klasę GameView. Chcę dodać efekt dźwiękowy tutaj w tej klasie onTouchEvent jak poniżej:

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

    } 
} 

Próbowałem zrobić to jako główną działalność (który używa MediaPlayer.creat()), ale to pokazuje błąd. Ktoś wie, jak dodać taki efekt dźwiękowy na podstawie mojego projektu klasowego?

+1

_ "to pokazuje błąd" _. A jaki jest błąd ...? – Michael

+0

Pokazany błąd nie jest runtime. Tylko mój kompilator mówi jak poniżej: "Metoda create (Context, int) w typie MediaPlayer nie ma zastosowania do argumentów (GameView, int)" Może to być spowodowane tym, że GameView nie jest klasą Activity. Jednak nie wiem dlaczego ... @Michael – exponentialFun

Odpowiedz

47

W przypadku krótkiego efektu dźwiękowego, takiego jak eksplozje, kolekcje monet itp., Lepiej jest użyć SoundPool.

Trzeba tylko stworzyć solidną basen:

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

W lizak i później:

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

Stwarza to basen dźwięku dla max. z 10 strumieni dźwiękowych (tj. ile równoczesnych efektów dźwiękowych może być odtwarzanych jednocześnie) i używa AudioManager.STREAM_MUSIC jako strumienia dźwięków.

Należy również ustawić głośność w Activity, dzięki czemu użytkownik ma możliwość zmiany głośności właściwego strumienia:

setVolumeControlStream(AudioManager.STREAM_MUSIC); 

Niż, trzeba załadować efekty dźwiękowe do basenu i dać im ich identyfikatory:

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

Musisz podać kontekst, aby załadować metodę, więc albo zrobisz to wewnątrz swojej aktywności, albo dostaniesz z jakiegoś innego miejsca.

i ostatnim krokiem do odtwarzania dźwięku jest wywołanie play metoda:

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

parametry:

  • soundID soundID zwrócony przez funkcję load()

  • leftVolume lewa wartość objętości (zakres = 0,0 do 1,0)

  • rightVolume prawidłowa wartość objętości (zakres = 0,0 do 1.0)

  • priorytet priorytet strumienia (0 = najniższa

  • pętli trybie pętli (0 = brak pętli priorytet) -1 = pętli zawsze)

  • Stopa odtwarzania (1.0 = normalne odtwarzanie, zakres od 0.5 do 2.0)

Należy pamiętać, że SoundPool nie powinien używać plików multimedialnych większych niż 1 MB, im mniejsze pliki, tym lepszy efekt i lepszą wydajność.

Pamiętaj, aby zwolnić SoundPool kiedy skończysz, lub w Activity.onDestroy.

sp.release(); 

Nadzieja to pomaga

+0

To wspaniałe wyjaśnienie! Dobra robota. Czy możesz/ktoś edytować/komentować to, ponieważ SoundPool jest amortyzowany? – Sonia

2

GameView nie jest podklasą kontekstu. Przekaż aktywność lub ApplicationContext do Mediaplayer'a

+0

Próbowałem użyć MediaPlayer.create (MainActivity.this, R.raw.bg); Ale pokazuje ten sam błąd. Dowolny przykładowy kod ???????? – exponentialFun

+0

Dziękuję, proszę pana ... To działa w ten sposób idealnie – exponentialFun