기본 콘텐츠로 건너뛰기

[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 의 효과음의 재생이 끝났는지 확인해 보고 다시 효과음을 내도록 하고 있습니다. 

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

 

댓글

이 블로그의 인기 게시물

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 을 실행해서 설치해 주면 됩니다.    그런다음 업데이트를 시도해 보면 잘 됩니다.   

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...

유로트럭 시뮬레이터 2 순간이동 치트 사용방법

최근 이벤트때 운송해야 할 물건이 나오지 않아 고민중에 어떤 게임사이트에서 찾아낸 방법입니다. 이미 게임을 충분히 하신 분들은 여기저기에 창고가 이미 있을것이기 때문에 그 창고로 이동하면 되지만 그렇지 못한 분들은 지역을 이동하는것이 시간이 많이 걸립니다. 이 방법을 쓰면 특정 도시로 빠르게 이동이 가능합니다. 내문서 -> Euro Truck Simulator 2 의 config.cfg 를 사용하시는 텍스트 에디터로 수정합니다. 수정해야 할 부분은 위에 표시해 놓은 부분입니다. 원래값은 0 이며 1로 바꿔줍니다. 이제 키보드의 '~' 키를 누르면 콘솔창이 뜹니다. 위의 스크린샷이 콘솔을 띄운 화면 입니다. 위와 같이 키보드를 눌렀을때 콘솔이 뜨면 일단 준비과정은 끝납니다. 이제 순간이동 사용법을 알려드리겠습니다. 1. 숫자키 '0'을 눌러서 프리카메라 모드로 들어갑니다. 2. 'm' 키를 눌러서 이동해야 할 도시를 확인하고 도시의 이름을 외워둡니다. 3. 콘솔을 열고 'goto 도시이름' 을 입력합니다. 성공했으면 해당 도시로 바로 이동합니다. 4. 마우스와 키보드 오른쪽의 숫자키패드를 이용해서 지상으로 이동합니다. 5. Ctrl + F9 키를 눌러 트럭을 소환합니다. 위의 순서에서 4번은 주의 하셔야 합니다. 트럭은 Ctrl + F9 를 누르는 순간 카메라의 위치로 소환됩니다. 만일 지상으로 이동하지 않고 트럭을 소환하실 경우 트럭이 지상으로 추락하여 손상 100%가 될 수도 있습니다. 즐거운 게임 되시길 바랍니다.    2022 년 2월 3일 수정사항 트럭의 소환키가 F9 에서 Ctrl + F9 로 변경되었다는 걸 확인해서 본문을 수정했습니다.