一般遊戲來說,聲音主要分為兩種,一種是背景音樂,一種是音效。
背景音樂就是時刻伴隨著遊戲存在的,往往就是重複播放的一首曲子或者歌曲;音效就是在某種條件下被觸發產生的,比如兩個小球碰撞在一起就會發出"啪啪啪" 的聲音。
剛才我們也說了,Pygame 支持的聲音格式十分有限,一般情況下我們使用.ogg 的格式來做背景音樂,用無壓縮的.wvb 來作為音效。那麼你拿到一個.mp3 格式該怎麼辦呢?
你可以使用格式工廠這類的軟件把它轉為.ogg 或者.wvb 格式。
注意:music 模塊雖然寫了支持 .mp3 格式,但是它對.mp3 格式的支持十分有限,經常你會在網上找到一段很好的.mp3 的曲子,但是載入之後壓根沒有聲音。你把它轉為.ogg 格式就可以很好的支持了。
•播放音效:
–pygame.mixer.Sound()
播放音效我們使用mixer 模塊,在使用之前,需要先生成一個Sound 對象,對這個Sound 對象進行控制,Sound 對象的play() 方法就是播放音效,稍候我們來講這些方法。
•播放背景音樂:
–pygame.mixer.music
播放背景音樂我們使用music 模塊,music 模塊和mixer 模塊是緊密關聯的。
Sound 對象方法如下:
方法
|
含義
|
play()
|
播放音效
|
stop()
|
停止播放
|
fadeout()
|
淡出
|
set_volume()
|
設置音量
|
get_volume()
|
獲取音量
|
get_num_channels()
|
計算該音效播放了多少次
|
get_length()
|
獲得該音效的長度
|
get_raw()
|
將該音效以二進制格式的字符串返回
|
music 模塊方法如下:
方法
|
含義
|
load()
|
載入音樂
|
play()
|
播放音樂
|
rewind()
|
重新播放
|
stop()
|
停止播放
|
pause()
|
暫停播放
|
unpause()
|
恢復播放
|
fadeout()
|
淡出
|
set_volume()
|
設置音量
|
get_volume()
|
獲取音量
|
get_busy()
|
檢測音樂流是否正在播放
|
set_pos()
|
設置開始播放的位置
|
get_pos()
|
獲取已經播放的時間
|
queue()
|
將音樂文件放入待播放列表中
|
set_endevent()
|
在音樂播放完畢時發送事件
|
get_endevent()
|
獲取音樂播放完畢時發送的事件類型
|
我們來舉個例子:
要求:寫一個程序,打開程序就會自動播放背景音樂(bg_music.ogg),當你在窗口中點擊鼠標左鍵時,就會播放winner.wav音效;點擊鼠標右鍵,就會播放loser.wav音效;點擊空格鍵就暫停背景音樂,再次點擊就繼續播放。(需要這幾個聲音文件的的可以在下面評論區留下郵箱,我看到後就把免費發送給你們)

-
-
-
from pygame.locals import *
-
-
-
-
-
-
pygame.mixer.music.load('bg_music.ogg')
-
pygame.mixer.music.set_volume(0.2)
-
pygame.mixer.music.play()
-
-
-
winner_sound = pygame.mixer.Sound("winner.wav")
-
winner_sound.set_volume(0.2)
-
loser_sound = pygame.mixer.Sound("loser.wav")
-
loser_sound.set_volume(0.2)
-
-
-
bg_size = width, height = 300, 200
-
screen = pygame.display.set_mode(bg_size)
-
pygame.display.set_caption("Music - Python Demo")
-
-
-
-
-
pause_image = pygame.image.load("pause.png").convert_alpha()
-
unpause_image = pygame.image.load("unpause.png").convert_alpha()
-
pause_rect = pause_image.get_rect()
-
pause_rect.left, pause_rect.top = (width - pause_rect.width) // 2, (height - pause_rect.height) // 2
-
-
clock = pygame.time.Clock()
-
-
-
for event in pygame.event.get():
-
-
-
-
if event.type == MOUSEBUTTONDOWN:
-
-
-
-
-
-
if event.type == KEYDOWN:
-
-
-
-
screen.fill((255, 255, 255))
-
-
-
screen.blit(pause_image, pause_rect)
-
pygame.mixer.music.pause()
-
-
screen.blit(unpause_image, pause_rect)
-
pygame.mixer.music.unpause()
-
-
-
-


上面就是我們實現music 模塊的Demo。
現在我們就來把我們學到的新東西加到Play TheBall 小遊戲中。我們繼續完善我們的代碼:
代碼如下:(需要素材的可以在評論區留下郵箱)
-
-
-
from pygame.locals import *
-
-
-
-
class Ball(pygame.sprite.Sprite):
-
def __init__(self, image, position, speed, bg_size):
-
-
pygame.sprite.Sprite.__init__(self)
-
-
self.image = pygame.image.load(image).convert_alpha()
-
self.rect = self.image.get_rect()
-
-
self.rect.left, self.rect.top = position
-
-
self.width, self.height = bg_size[0], bg_size[1]
-
self.radius = self.rect.width / 2
-
-
-
self.rect = self.rect.move(self.speed)
-
-
-
-
-
self.rect.left = self.width
-
-
elif self.rect.left > self.width:
-
-
-
elif self.rect.bottom < 0:
-
self.rect.top = self.height
-
-
elif self.rect.top > self.height:
-
-
-
-
-
-
ball_image = "gray_ball.png"
-
bg_image = "background.png"
-
-
-
-
-
-
pygame.mixer.music.load('bg_music.ogg')
-
pygame.mixer.music.set_volume(0.2)
-
pygame.mixer.music.play()
-
-
-
winner_sound = pygame.mixer.Sound("winner.wav")
-
winner_sound.set_volume(0.2)
-
loser_sound = pygame.mixer.Sound("loser.wav")
-
loser_sound.set_volume(0.2)
-
laugh_sound = pygame.mixer.Sound("laugh.wav")
-
laugh_sound.set_volume(0.2)
-
hole_sound = pygame.mixer.Sound("hole.wav")
-
hole_sound.set_volume(0.2)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
pygame.mixer.music.set_endevent(GAMEOVER)
-
-
-
-
-
bg_size = width, height = 1024, 681
-
screen = pygame.display.set_mode(bg_size)
-
pygame.display.set_caption("Play the ball - Python Demo")
-
-
background = pygame.image.load(bg_image).convert_alpha()
-
-
-
-
group = pygame.sprite.Group()
-
-
-
-
-
position = randint(0, width-100), randint(0, height-100)
-
speed = [randint(-10, 10), randint(-10, 10)]
-
ball = Ball(ball_image, position, speed, bg_size)
-
while pygame.sprite.spritecollide(ball, group, False, pygame.sprite.collide_circle):
-
ball.rect.left, ball.rect.top = randint(0, width-100), randint(0, height-100)
-
-
-
-
clock = pygame.time.Clock()
-
-
-
for event in pygame.event.get():
-
-
-
-
-
elif event.type == GAMEOVER:
-
-
-
-
-
-
-
screen.blit(background, (0, 0))
-
-
-
-
screen.blit(each.image, each.rect)
-
-
-
-
-
if pygame.sprite.spritecollide(each, group, False, pygame.sprite.collide_circle):
-
each.speed[0] = -each.speed[0]
-
each.speed[1] = -each.speed[1]
-
-
-
-
-
-
-
-
if __name__ == "__main__":
-
有一點需要講解的:
背景音樂會貫穿遊戲的始終,背景音樂完整播放一次我們視為遊戲的時間,因此我們需要想辦法讓遊戲在背景音樂停止時結束,我們應該有留意到:
music 模塊有一個set_endevent() 方法,該方法的作用就是在音樂播放完時發送一條事件消息,發送什麼消息是我們自定義的,USEREVENT 就是自定義消息,Pygame 給我們預定了很多事件,像我們熟悉的鍵盤事件、鼠標事件等。這些預定義的事件都有一個標記符,
例如:MOUSEBUTTONDOWN 、KEYDOWN等。這些都是一些數字的等值定義,其實在內部,2 就表示鼠標按下,但是人類難以記住,所以定義為 MOUSEBUTTONDOWN。
USEREVENT 就是數字24,24以上就是我們可以自定義的事件,我們可以像這樣自定義事件:
MY_EVENT = USEREVENT。
MY_EVENT_1 = USEREVENT + 1........
0 留言:
發佈留言