adsense



javax를 사용, awt환경에 BGM과 효과음을 넣기

  1.         Clip bgmclip;
  2.         public void playBgm(File file, float vol, boolean repeat){
  3.                 try{
  4.                         //BGM은 임의의 시점에서 정지시킬 수 있어야 하므로 전역으로 전용 Clip을 사용한다
  5.                         bgmclip = (Clip)AudioSystem.getLine(new Line.Info(Clip.class));
  6.                         bgmclip.open(AudioSystem.getAudioInputStream(file));
  7.                         bgmclip.addLineListener(new LineListener() {
  8.                                 @Override
  9.                                 public void update(LineEvent event) {
  10.                                         // TODO Auto-generated method stub
  11.                                         System.out.println("" + event.getType());
  12.                                         if(event.getType()==LineEvent.Type.STOP){
  13.                                                 bgmclip.close();
  14.                                         }
  15.                                 }
  16.                         });
  17.                         FloatControl volume = (FloatControl)bgmclip.getControl(FloatControl.Type.MASTER_GAIN);
  18.                         volume.setValue(vol);
  19.                         bgmclip.start();
  20.                         if(repeat)
  21.                                 bgmclip.loop(bgmclip.LOOP_CONTINUOUSLY);
  22.                 }catch(Exception e){
  23.                         e.printStackTrace();
  24.                 }
  25.         }
  26.         public void stopBgm(){
  27.                
  28.                 if(bgmclip!=null && bgmclip.isRunning()){
  29.                         bgmclip.stop();
  30.                         bgmclip.close();
  31.                 }
  32.         }
  33.         public void playSound(File file, float vol, boolean repeat){
  34.                 try{
  35.                         final Clip clip = (Clip)AudioSystem.getLine(new Line.Info(Clip.class));
  36.                         clip.open(AudioSystem.getAudioInputStream(file));
  37.                         clip.addLineListener(new LineListener() {
  38.                                 @Override
  39.                                 public void update(LineEvent event) {
  40.                                         // TODO Auto-generated method stub
  41.                                         if(event.getType()==LineEvent.Type.STOP){
  42.                                                 //이 부분이 없으면 효과음이 메모리에 점점 쌓여서 언젠가 크래시된다
  43.                                                 clip.close();
  44.                                         }
  45.                                 }
  46.                         });
  47.                         FloatControl volume = (FloatControl)clip.getControl(FloatControl.Type.MASTER_GAIN);
  48.                         volume.setValue(vol);
  49.                         clip.start();
  50.                         if(repeat)
  51.                                 clip.loop(Clip.LOOP_CONTINUOUSLY);
  52.                 }catch(Exception e){
  53.                         e.printStackTrace();
  54.                 }
  55.         }

    위와 같은 함수를 넣은 후

    playSound(new File("sound.wav"), 1.0f, false);
    같은 식으로 호출해주면 됩니다. (File 객체를 미리 만들어 놓아도 무방)

    파일 포맷이나 크기에 따라 처음 메모리 로드 시 약간의 렉이 생깁니다. (미디어 트랙커 쓰면 해결되나 싶은데 잠시 보류..)

    1회용 효과음과 지속적으로 하나의 클립이 돌아가는 BGM은 약간 처리 방법이 다른것에 주목(?).

    사용 가능한 오디오 포맷은 midi, wav, au, aiff 정도. mp3나 ogg는 사용할 수 없습니다.



덧글

  • 2015/10/15 01:05 # 삭제 답글

    위치즈 플라이트에 사운드를 넣고싶은데요
    미사일사운드랑 배경음악 이랑 적과 플레이어가 죽을때 이렇게 넣고싶은데
    어떻게 넣어야하나요 지금 수정후 안드로이드로 포팅한상태입니다
  • 펭귄대왕 2015/10/15 06:52 #

    안드로이드 사운드 구현 소스는 구글로 검색해보면 많이 찾을 수 있습니다.

    적당한 소스를 구해 GameManager.java에 사운드 함수를 만들어주고,
    게임소스상에서 총알이 발사되는 시점, 플레이어가 죽는 시점에서 각각 사운드 함수를 호출해주면 되겠네요.

    총알이 발사되는 시점은 void myProcess()에서 if (cnt % 7 == 0) 안쪽에 해당하니까, 이 부분에 사운드 호출을 넣어주면 되겠고,
    플레이어가 죽는 시점은 status를 STATUS_FALL로 바꿔주는 부분이니까
    status = STATUS_FALL; 처리해주는 부분을 찾아 그 아래나 위에 사운드 호출을 넣어주면 됩니다.
  • 123 2015/10/16 22:18 # 삭제

    하루동안 연구해봐도 답이없네요..
    소스부터 다시 연습해야할까봐요..
댓글 입력 영역


Books

Geek라이프

MSX&재믹스 퍼펙트 카탈로그
마에다 히로유키 저/조기현 역

mignon이 알려주는 피부 채색의 비결
mignon 저/고영자, 최수영 역

핵심강좌! Cocos2d-x
이재환 저

모리나가 요우의 프라모델 미궁 일지 1 필드 그레이 편
모리나가 요우 글그림
예스24 | 애드온2
일본서적 전문사이트 NEPIC