用Python和Pygame寫遊戲-從入門到精通(21)

發表於2015-12-21

緊接著上一次,我們繼續來看如何在Pygame中使用聲音。

Sound物件

在初始化聲音系統之後,我們就可以讀取一個音樂檔案到一個Sound物件中了。pygame.mixer.Sound()接受一個檔名,或者也可以使一個檔案物件,不過這個檔案必須是WAV或者OGG,切記!

 

一旦這個Sound物件出來了,你可以使用play方法來播放它。play(loop, maxtime)可以接受兩個引數,loop自然就是重複的次數,-1意味著無限迴圈,1呢?是兩次,記住是重複的次數而不是播放的次數;maxtime是指多少毫秒後結束,這個很簡單。當你不使用任何引數呼叫的時候,意味著把這個聲音播放一次。一旦play方法呼叫成功,就會返回一個Channel物件,否則返回一個None。

Channel物件

Channel,也就是聲道,可以被音效卡混合(共同)播放的資料流。遊戲中可以同時播放的聲音應該是有限的,pygame中預設是8個,你可以通過pygame.mixer.get_num_channels()來得知當前系統可以同時播放的聲道數,而一旦超過,呼叫sound物件的play方法就會返回一個None,如果你確定自己要同時播放很多聲音,可以用set_num_channels()來設定一下,最好一開始就設,因為重新設定會停止當前播放的聲音。

那麼Channel物件有什麼用呢?如果你只是想簡單的播放一下聲音,那麼根本不用管這個東西,不過如果你想創造出一點有意境的聲音,比如說一輛火車從左到右呼嘯而過,那麼應該是一開始左聲道比較響,然後相當,最後右聲道比較響,直至慢慢消失。這就是Channel能做到的事情。Channel的set_volume(left, right)方法接受兩個引數,分別是代表左聲道和右聲道的音量的小數,從0.0~1.0。

豎起我們的耳朵

OK,來個例子試試吧~

這個例子裡我們通過釋放金屬小球並讓它們自由落體和彈跳,聽碰撞的聲音。這裡面不僅僅有這次學習的聲音,還有幾個一起沒有接觸到的技術,最重要的一個就是重力的模擬,我們可以設定一個重力因子來影響小球下落的速度,還有一個彈力系數,來決定每次彈跳損失的能量,雖然不難,但是遊戲中引入這個東西能讓我們的遊戲模擬度大大提高。

這麼久了,我們們的遊戲終於有了聲音,太棒了!不過,是不是遊戲的背景音樂也是用mixer來播放的呢?這不是一個好主意,因為背景音樂往往很長,比較佔資源,pygame中另外提供了一個pygame.mixer.music類來控制背景音樂的播放,這也是我們下一次要講的內容。

小球影像:ball.png
游標影像:mousecursor.png
彈跳聲音:bounce.ogg

相關文章