상세 컨텐츠

본문 제목

JetBoy 따라하기 #8 - 음향 효과 입히기

프로그래밍/Android

by ryujt 2010. 12. 28. 21:11

본문

이번에는 음향 효과 입히기를 해보도록 하겠습니다.  JetBoy에서 사용하는 JetPlayer를 사용하여 강좌를 할 까를 고민했었지만, 쉬운 방법을 선택하기로 했습니다.  SoundPool을 이용하여 음향효과를 지원하는 방법에 대해서 알아보도록 하겠습니다.



음향 효과 리소스 관리 클래스 작성

[소스 1] ResourceSound.java
package app.resources;

import android.media.AudioManager;
import android.media.SoundPool;
import app.main.R;

public class ResourceSound {
	
	// 최대 스트림 갯수
	private static final int _STREAM_COUNT = 4;
	
	private static ResourceSound _Instance = new ResourceSound();

	public static ResourceSound getInstance(){
		return _Instance;
	}
	
	private ResourceSound() {}
	  
	private SoundPool _SoundPool  = new SoundPool(_STREAM_COUNT, AudioManager.STREAM_MUSIC, 0);
	
	private int _Fire = -1;	
	private int _Boom = -1;
	
	public void Prepare() {
		_Fire = _SoundPool.load(
				Resource.getInstance().getContext(), 
				R.raw.fire, 
				1
			);   

		_Boom = _SoundPool.load(
				Resource.getInstance().getContext(), 
				R.raw.boom, 
				1
			);   
	}
	
	public void Fire() {
		_SoundPool.play(_Fire, 1, 1, 0, 0, 1);
	}
	
	public void Boom() {
		_SoundPool.play(_Boom, 1, 1, 0, 0, 1);
	}

}



음향 효과는 종류에 따라 클래스를 따로 만들지 않고 하나로 통일해서 관리하고자 합니다.  특별히 그렇게 해야 하는 이유가 있는 것은 아니지만, 이미지의 경우와는 달리 추가적인 구현이 전혀 필요하지 않기 때문입니다.  소리만 내면 되는 것이죠.  이미지의 경우에는 추가적인 구현이 필요하냐?  가끔 그런 경우가 생기곤 합니다.  실시간 랜더링과 같은 요구사항이 생길 수도 있기 때문입니다.

39: 레이저 발사에 해당하는 소리를 재생합니다.  예제에는 일반 총 소리로 저장되어 있습니다.

43: 소행성이 폭발하는 소리를 재생합니다.

25: 리소스를 로딩해오는 메소드 입니다.  Resource.getInstance().getContext()를 통해서 Context 객체를 참조하기 때문에 사용하기 전에, Resource.getInstance().setContext() 메소드가 먼저 실행되어야 합니다.


[소스 2] Main.java
package app.main;

import ryulib.game.GamePlatform;
import android.app.Activity;
import android.os.Bundle;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import app.resources.Resource;
import app.resources.ResourceSound;

public class Main extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        Resource.getInstance().setContext(this);
        ResourceSound.getInstance().Prepare();        

        _GamePlatform = new GamePlatform(this);
        _GamePlatform.setLayoutParams(
        		new LinearLayout.LayoutParams(
        				ViewGroup.LayoutParams.FILL_PARENT, 
        				ViewGroup.LayoutParams.FILL_PARENT, 
        				0.0F
        		)
        );
        _GamePlatform.setUseKeyEvent(true);
        _GamePlatform.setUseMotionEvent(true);
        
        setContentView(_GamePlatform);
        
        _Background = new Background(null);
        _GamePlatform.AddControl(_Background);
        
        _Asteroids = new Asteroids(null);
        _GamePlatform.AddControl(_Asteroids);        

        _Ship = new Ship(null);
        _GamePlatform.AddControl(_Ship);
    }
    
    private GamePlatform _GamePlatform = null;
    private Background _Background = null;
    private Asteroids _Asteroids = null;
    private Ship _Ship = null;
    
}
18: 앞서 말한 바와 같이 17: 라인처럼 먼저 Context 객체를 Resource 클래스에 지정하고 난 뒤에 실행해야 합니다.  Prepare() 메소드는 리소스에 있는 음원을 로딩하여 사용 준비상태를 만들어 줍니다.



음향 효과 내기

우선 레이저를 발사 할 때 소리를 내기 위해서 Lasers.java를 [소스 3]과 같이 수정합니다.

[소스 3] Lasers.java 수정
	public void Fire(int x, int y) {
		long tick = System.currentTimeMillis();

		if ((_OldTick == 0) || ((tick-_OldTick) >= _FIRE_INTERVAL)) {
			Laser laser = new Laser(null);
			laser.Init(x, y);
			this.getGameControlGroup().AddControl(laser);
			
			ResourceSound.getInstance().Fire();
			
			_OldTick = tick;
		}
	}
9: 레이저 발사하는 소리를 냅니다.

  
다음에는 소행성이 폭발하는 소리를 내기 위해서 Asteroid.java를 [소스 4]와 같이 수정합니다.

[소스 4] Asteroid.java 수정
	public void Explode() {
		_AnimationCounter.Clear();
		_AnimationCounter.setSize(ResourceExplodingAsteroid.getInstance().getCount());
		_AnimationCounter.setAutoRewind(false);

		_BitmapList = ResourceExplodingAsteroid.getInstance();
		
		ResourceSound.getInstance().Boom();
	}
6: 소행성이 폭발하는 소리를 냅니다.



정리

음향 효과를 내는 것은 큰 어려움이 없기 때문에 설명이 다소 부실했습니다.  소스만으로도 충분히 이해 할 수 있을 것이라고 생각합니다.  이제 다음에는 전체적으로 다시 살펴보면서 강좌를 마무리 하도록 하겠습니다.



소스 




관련글 더보기