这节我们将如何在Pygame游戏中添加音效并且在上节未完成的泡泡游戏中
添加音效 下面是资源链接 点击打开链接 密码:hfjz
播放声音和音效
建议将将.ogg格式作为背景音乐,.wav作为音效
播放背景音乐:
-pygame.mixer.music对象
pygame.mixer.music:
pygame module for controlling streamed audio
music对象的方法:
方法 含义
load() 载入音乐
play() 播放音乐
rewind() 重新播放
stop() 停止播放
pause() 暂停播放
unpause() 恢复播放
fadeout() 淡出
set_volumn() 设置音量
get_volumn() 获取音量
get_busy() 检测音乐流是否正在播放
set_pos() 设置开始播放的位置
get_pos() 获取已经播放的时间
queue() 将音乐文件放入待播放列表中
set_endevent() 在音乐播放完毕时发送事件
get_endevent() 获取音乐播放完毕时发送的事件类型
运行程序,在屏幕上鼠标左键点击发出狗叫声,右键点击发出鸟叫声
空格键控制背景音乐的播放和暂停
# -*- coding: utf-8 -*- # @Author: Clarence # @Date: 2018-03-10 16:09:22 # @Last Modified by: Clarence # @Last Modified time: 2018-03-10 23:34:24 import pygame import sys from pygame.locals import * pygame.init() #Initialize the mixer module for Sound loading and playback. #使用之前最好先初始化一下 pygame.mixer.init() pygame.mixer.music.load("bg_music.ogg") pygame.mixer.music.set_volume(0.2) pygame.mixer.music.play() #开始播放 bird_sound = pygame.mixer.Sound("birdsound.wav") bird_sound.set_volume(0.2) dog_sound = pygame.mixer.Sound("dogbark.wav") dog_sound.set_volume(0.2) bg_size = width, height = 300, 200 screen = pygame.display.set_mode(bg_size) pygame.display.set_caption("MusicPlayDemo") #空格表示暂停,再次按空格播放音乐 pause = False 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() while True: for event in pygame.event.get(): if event.type == QUIT: sys.exit() if event.type == MOUSEBUTTONDOWN: if event.button == 1: #鼠标按左键播放狗叫声 dog_sound.play() if event.button == 3: #鼠标按右键播放鸟叫声 bird_sound.play() if event.type == KEYDOWN: #按下空格键 控制背景音乐的暂停和播放 if event.key == K_SPACE: pause = not pause screen.fill((255, 255, 255)) if pause: screen.blit(pause_image, pause_rect) pygame.mixer.music.pause() else: screen.blit(unpause_image, pause_rect) pygame.mixer.music.unpause() pygame.display.flip() clock.tick(30)
下面是加入背景音乐的泡泡游戏代码
import pygame import sys from pygame.locals import * from random import * class Ball(pygame.sprite.Sprite): def __init__(self, image, position, speed, bg_size): # Call the parent class (Sprite) constructor 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.speed = speed self.width, self.height = bg_size[0], bg_size[1] #self.width = self.width / 2 ''' Pygame.Rect.move(): moves the rectangle move(x, y) -> Rect Returns a new rectangle that is moved by the given offset. The x and y arguments can be any integer value, positive or negative. 可以在Rect对象的move方法中添加可正可负的两元素 如果要实现小球的移动,则要在类中添加一个move()方法,并且在绘图的时候调用小球 对象的move()方法 ''' def move(self): self.rect = self.rect.move(self.speed) #类似实现贪吃蛇穿入墙壁从对面墙壁出来(左右方向) if self.rect.right < 0: self.rect.left = self.width elif self.rect.left > self.width: self.rect.right = 0 #(上下方向) 从下往上 和 从上往下 elif self.rect.bottom < 0: self.rect.top = self.height elif self.rect.top > self.height: self.rect.bottom = 0 def main(): pygame.init() ball_image = "gray_ball.png" bg_image = "background.png" running = True # 添加模型的背景音乐 pygame.mixer.music.load("bg_music.ogg") pygame.mixer.music.play() # 添加音效 loser_sound = pygame.mixer.Sound("loser.wav") laugh_sound = pygame.mixer.Sound("laugh.wav") winner_sound = pygame.mixer.Sound("winner.wav") hole_sound = pygame.mixer.Sound("hole.wav") # 音乐播放完时游戏结束,将GAMEOVER事件加入到事件队列中去 # USEREVENT为用户自定义的事件 # 如果想定义第二个事件可以是GAMEOVERTWO = USEREVENT + 1 GAMEOVER = USEREVENT #背景音乐结束后发生GAMEOVER事件消息 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") #.png格式可以加入apha通道 background = pygame.image.load(bg_image).convert_alpha() #用来存放小球对象的列表 balls = [] group = pygame.sprite.Group() for i in range(5): #球的尺寸是100*100 随机产生小球的位置 position = randint(0, width-100), randint(0, height-100) #两个元素的一个列表,表示x轴和y轴方向的速度 speed = [randint(-10, 10), randint(-10, 10)] #实例化小球对象 分别传入Surface对象 位置二元组 速度两元素列表 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) balls.append(ball) #将小球加入到小球列表中 group.add(ball) # CLock()对象用来设置小球的帧率 clock = pygame.time.Clock() while running: for event in pygame.event.get(): if event.type == QUIT: sys.exit() elif event.type == GAMEOVER: loser_sound.play() pygame.time.delay(2000) laugh_sound.play() running = False #结束循环 screen.blit(background, (0, 0)) for each in balls: each.move() screen.blit(each.image, each.rect) for each in group: group.remove(each) if pygame.sprite.spritecollide(each, group, False, pygame.sprite.collide_circle): each.speed[0] = -each.speed[0] each.speed[1] = -each.speed[1] group.add(each) pygame.display.flip() #将显示缓冲区中的数据刷入显示器中 clock.tick(30) if __name__ == "__main__": main()