Muzyka w grze (akcelerometr gra cz.2)

Do naszego programu z Akcelerometrem należałoby dorzucić jakieś dźwięki, aby aplikacja stała się bardziej interesująca. W tym projekcie pokazałem jak odpalić muzykę w tle oraz jak dodać dźwięk do poruszającej się muchy.

Pierwszą sprawą jest stworzenie dźwięków. Oczywiście można pobrać gotowe próbki ze strony http://freesound.org (efekty dźwiękowe) oraz ze stron http://midiworld.com/ możemy pobrać kompletne podkłady muzyczne, dla naszej gry. Możecie także nagrać coś samemu za pomocą mikrofonu i dodać to do gry. W tym przykładzie podkład w tle jest ściągnięty, a bzyczenie sam nagrałem.

Kod z części drugiej uległ zmianom, ponieważ uznałem, że tak będzie czytelniej. Zmianą uległa klasa Akcelerometr którą usunąłem. Wszystkie jej metody przeniosłem do pliku MainActivity.java.

Mając już dźwięki kopiujemy je do katalogu res/raw i odpalamy je w kodzie. Wszystko co trzeba zrobić to zmodyfikować plik GameView. Najpierw odpalmy melodię w tle dodając taki kod.

public void surfaceCreated(SurfaceHolder holder) {
 mGameLogic.setGameState(mGameLogic.RUNNING); 
 mGameLogic.start();
 
 MediaPlayer mp = MediaPlayer.create(getContext(), R.raw.background_music);
 mp.setLooping(true);
 mp.start();
 }

Teraz należy dodać dźwięki do poszczególnych zdarzeń. W moim przypadku odpalam dźwięk tylko i wyłącznie jak mucha zacznie się poruszać, czyli jak odczyt z akcelerometru będzie większy niż 0, dla składowej X lub Y.

public void daneZczujnikaX(int x){
 
 if (x!=0) {
 this.playsound(ID_bzyk);
 
 }
 sprite.setMoveX(-x);
 }
 
 public void daneZczujnikaY(int y){
 if (y!=0) {
 this.playsound(ID_bzyk);
 
 }
 sprite.setMoveY(y);
 }

Teraz wystarczy zdefiniować ścieżki dźwiękowe do plików z muzyką i dodać potrzebne biblioteki.

soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
 
 ID_bzyk = soundPool.load(context, R.raw.bzyk, 1);
 
 sound_id = ID_bzyk;

Cały plik GameView.java wygląda tak:

package pl.nstrefa.avrkwiat.gra1;


import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.hardware.SensorManager;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.SoundPool;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import java.lang.*;


public class GameView extends SurfaceView implements SurfaceHolder.Callback {

 private SpriteObject sprite;
 private SpriteTlo spriteTlo;
 private GameLogic mGameLogic; 
 private Bitmap[] bitmapTab=new Bitmap[5];
 
 private int sound_id;
 private SoundPool soundPool;
 private int ID_bzyk;
 private MediaPlayer mp;

 public GameView(Context context) { 
 super(context);
 getHolder().addCallback(this); 
 //daneZczujnika = new Akcelerometr(menedzer);
 sprite = new SpriteObject(BitmapFactory.decodeResource(getResources(), R.drawable.star), 50, 50);
 
 bitmapTab[0]=BitmapFactory.decodeResource(getResources(), R.drawable.fk);
 bitmapTab[1]=BitmapFactory.decodeResource(getResources(), R.drawable.fl);
 bitmapTab[2]=BitmapFactory.decodeResource(getResources(), R.drawable.fp);
 bitmapTab[3]=BitmapFactory.decodeResource(getResources(), R.drawable.fg);
 bitmapTab[4]=BitmapFactory.decodeResource(getResources(), R.drawable.fd);
 spriteTlo = new SpriteTlo(bitmapTab);
 mGameLogic = new GameLogic(getHolder(), this);
 
 soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
 
 ID_bzyk = soundPool.load(context, R.raw.bzyk, 1);
 
 sound_id = ID_bzyk;

 setFocusable(true);
 }

 @Override
 public void surfaceChanged(SurfaceHolder holder, int format, int width,    int height) {
 }

 @Override
 public void surfaceCreated(SurfaceHolder holder) {
 mGameLogic.setGameState(mGameLogic.RUNNING); 
 mGameLogic.start();
 
 MediaPlayer mp = MediaPlayer.create(getContext(), R.raw.background_music);
 mp.setLooping(true);
 mp.start();
 }
 
 @Override
 public void surfaceDestroyed(SurfaceHolder holder) {
 soundPool.release();
 mp.stop();
 mp.release();
 }
 
 
 
 public void onDraw(Canvas canvas) {
 
 //canvas.drawColor(Color.WHITE);
 spriteTlo.draw(canvas);
 sprite.draw(canvas);
 }

 public void update() {
 if (sprite.getX() >= getWidth()){ 

 sprite.setX(getWidth());
 }
 if (sprite.getX() <= 0){

 sprite.setX(0);
 }
 if (sprite.getY() >= getHeight()){ 
 
 sprite.setY(getHeight());
 }
 if (sprite.getY() <= 0){
 
 sprite.setY(0);
 }
 spriteTlo.update(sprite.getX(), sprite.getY());
 sprite.update();

 }
 public void playsound(int sound_id){
 soundPool.play(sound_id, 1.0f, 1.0f, 10, 0, 1.0f);
 }
 public void daneZczujnikaX(int x){
 
 if (x!=0) {
 this.playsound(ID_bzyk);
 
 }
 sprite.setMoveX(-x);
 }
 
 public void daneZczujnikaY(int y){
 if (y!=0) {
 this.playsound(ID_bzyk);
 
 }
 sprite.setMoveY(y);
 }
}


Kliknij, aby pobrać projekt