기본 콘텐츠로 건너뛰기

[pygame] Cannon 게임프로젝트 7 - 사운드

 게임에서 사운드는 배경음악과 효과음 2가지가 있습니다. 이를 위해 pygame 에선 mixer 라이브러리를 제공합니다.

>

사운드 기능을 사용하기 전에 해야 할 일은 초기화 입니다. 

pygame.mixer.init 라는 함수가 있어 설정값을 주고 초기화 할 수있지만, 보통은 pygame.init() 를 사용하여 한번에 여러 라이브러리를 초기화 하는게 간단하고 편하기 때문에 보통 초기화는 다음과 같은 방법을 씁니다.

pygame.mixer.pre_init(44100,-16,2,512)  
pygame.init()   

pygame.init() 전에 pre_init 로 초기화시 사용할 초기값을 미리 설정해 주는 것 입니다. 맨 마지막 인수가 buffer 값인데 예전에는 512 로 해 주지 않으면 효과음에 지연이 생겨서 넣어 줬던 것인데 최근 pygame 문서를 보면 기본값이 512 로 바뀌었더군요. 따라서 pre_init 를 해주지 않아도 될지도 모르겠지만 pygame 버전에 따른 차이가 생길 수 있으니 저는 그냥 명시적으로 넣어줍니다. 

 

1. 배경음악

pygame.mixer.music 의 사용법은 간단합니다.

pygame.mixer.music.load('bg.ogg')

pygame.mixer.music.play()

하면 됩니다. load 함수에 리턴값 없이 그냥 저렇게 쓰면 됩니다.

play 함수는 play(3) 처럼 반복 재생회수를 넣어줄 수 있으며 -1 이면 계속 반복 재생합니다.

https://www.pygame.org/docs/ref/music.html

 그 외에 다른 함수들은 위의 링크를 보면 됩니다. 영어 단어만 봐도 대충 무슨 함수인지 알 수 있습니다. rewind, stop, pause 같은 함수들입니다.

다만 몇가지만 설명해 드리자면.... 

>

pygame.mixer.queue('xxx.ogg') 

위의 queue 함수는 지금 재생되는 음악이 끝나고 다음에 재생될 파일을 미리 지정해 주는 것입니다. 

>

set_endevent 함수는 음악이 끝났을때 event 를 발생시킵니다.

 MUSIC_END = pygame.USEREVENT + 1

우선 위와 같이 이벤트 메시지를 정의해 줍니다.

pygame.mixer.music.set_endevent(MUSIC_END)

위와 같이 end 메시지를 받겠다고 설정해 준 뒤에...

 while True:        
    ev = pygame.event.get()
    for event in ev:
        if event.type == MUSIC_END :
            print("Music End")
        break

이벤트 메시지 처리하는 곳에서 위 처럼 해당 메시지를 처리해 주면 됩니다.

 

2. 효과음

효과음의 경우는....

f_snd = pygame.mixer.Sound('fire.ogg')

이렇게 효과음 파일을 로딩한 후에....

f_snd.play()

효과음이 필요한 곳에 위와 같이 쓰면 됩니다. 매우 간단합니다. 

https://www.pygame.org/docs/ref/mixer.html

나머지는 위의 문서를 참고 하시면 됩니다. music 에서 처럼 stop, fadeout 같은 함수들이 있습니다.

다만 channel 에 대해서 간단히 이야기 할까 합니다.

>

pygame.mixer 의 채널은 알아서 관리 됩니다만 직접 지정해서 사용할 수도 있습니다. 

op_snd = pygame.mixer.Sound('op.ogg')
ch0 = pygame.mixer.Channel(0)
 
while True:         
    if not ch0.get_busy():
        ch0.play(op_snd)

위의 경우는 get_busy 함수를 이용해서 ch0 의 효과음의 재생이 끝났는지 확인해 보고 다시 효과음을 내도록 하고 있습니다. 

위와 같이 효과음의 채널을 좀 더 세세하게 제어 하고 싶다면 직접 채널을 만들어서 사용 해야 합니다.

 

댓글

이 블로그의 인기 게시물

pygame 에서 이미지 회전하는 방법

 pygame 에서 transform.rotate 를 사용해서 이미지를 회전시켜 보면 생각과는 달리 요상하게 회전합니다.    따라서 이를 해결해 보고자 검색해 보다 다음 링크를 찾았습니다. https://stackoverflow.com/questions/4183208/how-do-i-rotate-an-image-around-its-center-using-pygame/54714144 위 링크를 보면 파이게임의 이미지 회전이 왜 그렇게 이상한지 알 수 있고 답변하신 분이 blitRotate 라는 함수를 만들어 놓아서 이용할 수 있습니다.  제 소스에 가져와서 테스트를 해 봤는데 제 생각대로 회전 하더군요.  def blitRotate(image, pos, originPos, angle):       #calcaulate the axis aligned bounding box of the rotated image     w, h       = image.get_size()     box        = [pygame.math.Vector2(p) for p in [(0, 0), (w, 0), (w, -h), (0, -h)]]     box_rotate = [p.rotate(angle) for p in box]     min_box    = (min(box_rotate, key=lambda p: p[0])[0], min(box_rotate, key=lambda p: p[1])[1])     max_box    = (max(box_rotate, key=lambda p: p[0])[0], max...

antix linux 업데이트시 GPG Error

 최근에 가장 가벼운 리눅스를 검색해서 antix 리눅스를 설치해서 테스트 해 보고 있습니다. 역시 가볍긴 가볍더군요. 생각보단 패키지 구성도 괜찮아 보였고요.    설치후 좀 써보고 업데이트를 하는데 GPG Error 가 발생했습니다. GPG 키 관련 문제인것 같아서 검색해 보니 antixforum에 답이 있었습니다.  https://www.antixforum.com/forums/topic/how-to-fix-expired-gpg-key-error/   간단히 적어보자면... http://repo.antixlinux.com/bookworm/pool/main/a/antix-archive-keyring/antix-archive-keyring_20019.5.0_all.deb 위 파일을 받은 다음에 터미널에서... sudo dpkg -i antix-archive-keyring_20019.5.0_all.deb 을 실행해서 설치해 주면 됩니다.    그런다음 업데이트를 시도해 보면 잘 됩니다.   

모닝 JA 엔진오일 교환. 보쉬필터 구입

요즘은 주행거리가 1만km 가 안되다보니 1년에 한번씩 엔진오일을 교환하고 있습니다.  1년에 한번이라 그냥 오토큐에서 교환을 했었지만 오토큐의 오일교환 가격이 너무 오른데다가 이젠 보증도 끝났기 때문에 오일과 필터를 구입해서 공임나라로 갔습니다.  > 오일은 kixx g1 fe 1L x 3 을 구입하고 필터는 보쉬제품으로 구입했습니다.   A3003 이 에어필터이고 O0356 이 오일필터 입니다. 기아의 순정부품보단 조금 가격이 저렴합니다.  > 오랜만에 공임나라 갔는데 교환공임이 17000원 이네요. 물가가 오른만큼 오일교환 비용도 예전보다 좀 올랐네요.  필터 품번도 기록해 둘겸 올려 봅니다. ^^;